Der geheime Urheberrechtskrieg hinter Windows 95 Plug and Play

2025-06-29
Der geheime Urheberrechtskrieg hinter Windows 95 Plug and Play

Die Implementierung von Plug and Play in Windows 95 war keine leichte Aufgabe. Um ältere Hardware mit der neuen Funktion kompatibel zu machen, verwendeten die Ingenieure raffinierte Lösungen. Ein amüsantes Beispiel waren Hersteller, die die Zeichenkette "Not Copyright Fabrikam Computer" in ihr BIOS einfügten. Dies war ein cleverer Trick, um die Lizenzprüfung von LitWare Word Processor zu umgehen und die Vollversion freizuschalten, ohne ein lizenzierter Fabrikam-PC zu sein. Dies unterstreicht die Herausforderungen der Kompatibilität älterer PCs und die Bemühungen der Hersteller, Softwarelizenzen zu erhalten.

Mehr lesen
Entwicklung

Contosos „permanente“ Löschung: Gar nicht so permanent

2025-06-25
Contosos „permanente“ Löschung: Gar nicht so permanent

Vor zehn Monaten habe ich mein Konto bei Contoso gelöscht und eine Bestätigung erhalten, dass meine Daten permanent und unwiderruflich gelöscht wurden. Gestern erhielt ich eine E-Mail von Contoso bezüglich einer Aktualisierung der Datenschutzrichtlinie. Ihre Behauptung einer permanenten Löschung war offensichtlich verfrüht, da sie meine E-Mail-Adresse immer noch besitzen. Dies wirft ernsthafte Fragen zur Datensicherheit und zur Vertrauenswürdigkeit von Unternehmensversprechen auf.

Mehr lesen
Sonstiges

C++-Template-Vererbung und Kopierkonstruktor: Ein rätselhaftes static_assert

2025-06-10
C++-Template-Vererbung und Kopierkonstruktor: Ein rätselhaftes static_assert

Dieser Artikel untersucht ein rätselhaftes Problem bezüglich Kopierkonstruktor in der C++-Template-Vererbung. Die Klasse `Derived` erbt von der Klasse `Base`, deren Kopierkonstruktor gelöscht ist. `Derived` definiert jedoch seinen eigenen Kopierkonstruktor. Obwohl dieser Konstruktor versucht, das nicht kopierbare `Base`-Objekt zu kopieren, gibt `std::is_copy_constructible` trotzdem true zurück. Das liegt daran, dass der Compiler nur die Existenz eines nicht gelöschten Kopierkonstruktors überprüft, nicht aber seine Instanziierbarkeit. Der Autor bespricht außerdem die Unterschiede zwischen explizit und implizit definierten Kopierkonstruktoren und die Auswirkungen des Auslagerns der Definition des Kopierkonstruktors.

Mehr lesen
Entwicklung Kopierkonstruktor

C#-Code direkt ausführen ohne Projektdateien: .NET 10 Preview 4

2025-05-29
C#-Code direkt ausführen ohne Projektdateien: .NET 10 Preview 4

.NET 10 Preview 4 führt eine bahnbrechende Funktion ein: Sie können jetzt C#-Dateien direkt mit `dotnet run app.cs` ausführen – ohne Projektdatei oder Gerüst! Dies senkt die Einstiegshürde für C# deutlich und macht es ideal für das Lernen, Prototyping oder schnelle Skripte. Nutzen Sie leistungsstarke dateibasierte Direktiven wie `#:package`, `#:sdk` und `#:property`, um NuGet-Pakete, SDKs und MSBuild-Eigenschaften direkt in Ihrer .cs-Datei zu verwalten, wobei die Kompatibilität mit bestehenden MSBuild-Konzepten erhalten bleibt. Selbst wenn Ihr Skript zu einer vollständigen Anwendung heranwächst, ist die nahtlose Umwandlung in eine projektbasierte Anwendung möglich. Dieser vereinfachte Workflow vereinfacht die C#-Entwicklung und macht sie unglaublich zugänglich und praktisch für CLI-Dienstprogramme, Automatisierungsskripte und vieles mehr.

Mehr lesen

Windows 11 erhält einen neuen integrierten Kommandozeilen-Texteditor: Edit

2025-05-19
Windows 11 erhält einen neuen integrierten Kommandozeilen-Texteditor: Edit

Microsoft stellt Edit vor, einen neuen, leichtgewichtigen Kommandozeilen-Texteditor für 64-Bit-Windows. Dieser Open-Source-Editor mit weniger als 250 KB bietet Funktionen wie Mausunterstützung, das Öffnen mehrerer Dateien, Suchen und Ersetzen, automatischen Zeilenumbruch und vor allem ein modusloses Design, um die steile Lernkurve von modalen Editoren wie Vim zu vermeiden. Er wird in den kommenden Monaten im Windows Insider Programm in der Vorschau verfügbar sein, bevor er zu einem Standardbestandteil von Windows 11 wird.

Mehr lesen
Entwicklung Kommandozeilen-Editor

Nostalgische MS-DOS-Icons: Nützlicher als der Programm-Manager?

2025-05-16
Nostalgische MS-DOS-Icons: Nützlicher als der Programm-Manager?

Ein Benutzer teilte seine Meinung zu einem Satz von MS-DOS-Icons und argumentierte, dass sie praktischer sind als der Standardsatz des Programm-Managers. Beispiele beinhalten Icons für den Microsoft Basic Compiler, Microsoft Project und Close-Up 4.0, wobei deren historische Verwendung hervorgehoben wird. Der Autor weist auf Designmängel wie veraltete MS-DOS-Logos oder ungeeignete Overlays hin. Dies führt zu einer Diskussion über das UI-Design älterer Software und Nostalgie.

Mehr lesen
Sonstiges

Windows 7 Anmeldeverzögerung: Sind einfarbige Hintergründe die Ursache?

2025-04-29
Windows 7 Anmeldeverzögerung: Sind einfarbige Hintergründe die Ursache?

Der Autor, der seit Windows 95 einfarbige Hintergrundbilder verwendet, hat bei Windows 7 mit einfarbigem Hintergrund eine 30-sekündige Verzögerung auf dem Begrüßungsbildschirm festgestellt. Dies ist keine längere Anmeldezeit, sondern ein Timeout, das ausgelöst wird, wenn das System auf ein Signal wartet, das den Abschluss des Ladevorgangs des Hintergrundbilds anzeigt. Einfarbige Hintergrundbilder, denen Bitmap-Informationen fehlen, verhindern das Senden dieses Signals. Ein ähnliches Problem besteht bei der Gruppenrichtlinie „Desktopsymbole ausblenden“, wobei ein Codierungsfehler verhindert, dass das Bereit-Signal gesendet wird. Microsoft hat dieses Problem einige Monate nach der Veröffentlichung von Windows 7 behoben. Der Autor erklärt auch seine Präferenz für Standardkonfigurationen, was die Fehlermeldung und -behebung vereinfacht.

Mehr lesen
Entwicklung Systemleistung

Suspendere Sie niemals einen Thread im eigenen Prozess!

2025-04-15
Suspendere Sie niemals einen Thread im eigenen Prozess!

Ein Kunde hatte ein langjähriges, aber selten auftretendes Problem mit einem Hängenbleiben: Sein UI-Thread rief den Kernel auf, und der Aufruf hing einfach ohne ersichtlichen Grund fest. Leider konnte der Kernel-Dump keinen Stack aus dem Benutzermodus anzeigen, da der Stack ausgelagert worden war. (Das ist sinnvoll, da ein blockierter Thread seinen Stack nicht verwendet, daher wird dieser Stack ausgelagert, sobald das System unter Speicherplatzmangel leidet.) Die Untersuchung ergab einen Watchdog-Thread, der den UI-Thread periodisch anhält, um eine Stack-Trace zu erfassen, aber dieses Mal hing er über fünf Stunden lang fest. Die Ursache: Eine Deadlock-Situation. Der Watchdog-Thread versucht, eine Stack-Trace des UI-Threads zu erhalten, benötigt aber ein Lock für die Funktionstabelle, während der UI-Thread angehalten und das Lock besitzt. Der Artikel betont, dass man niemals einen Thread in seinem eigenen Prozess anhalten sollte, da dies zu Deadlocks aufgrund von Ressourcenkonflikten führen kann. Um einen Thread anzuhalten und Stacks davon zu erfassen, muss dies von einem anderen Prozess aus erfolgen, um Deadlocks zu vermeiden.

Mehr lesen

Das Geheimnis des passiven USB-zu-PS/2-Mausadapters

2025-03-28
Das Geheimnis des passiven USB-zu-PS/2-Mausadapters

Frühe USB-Mäuse enthielten oft einen grünen Adapter, um den USB-Typ-A-Stecker in PS/2 umzuwandeln. Dies war kein intelligenter Adapter; er war rein mechanisch, ohne Schaltung. Die Maus selbst führte die Umwandlung durch, indem sie den Signaltyp (USB oder PS/2) erkannte und sich entsprechend anpasste. Es ist vergleichbar mit einem einfachen Netzadapter – die Intelligenz liegt im Gerät selbst, nicht im Adapter. Wenn Sie also einen solchen finden, denken Sie daran, dass es sich nur um einen physischen Stecker handelt; die eigentliche Umwandlung findet in der Dual-Bus-Maus statt.

Mehr lesen
Hardware Mausadapter

Debugging eines Race Conditions: Die RtlRunOnceExecuteOnce-Falle

2025-03-23
Debugging eines Race Conditions: Die RtlRunOnceExecuteOnce-Falle

Ein Kollege stieß während einer wöchentlichen Debugging-Sitzung auf ein kniffliges Nebenläufigkeitsproblem: Ein kritischer Abschnitt verhinderte nicht, dass zwei Threads denselben Codeblock betraten, was zu einem fehlerhaften Doppelaufruf von `TraceLoggingRegister` führte. Eine gründliche Fehlersuche ergab die Ursache: Die Initialisierungsfunktion `InitializeCriticalSectionOnce` für `RtlRunOnceExecuteOnce` gab fälschlicherweise `STATUS_SUCCESS` (0) zurück. Dies führte dazu, dass `RtlRunOnceExecuteOnce` davon ausging, die Initialisierung sei fehlgeschlagen, und den kritischen Abschnitt bei jedem Aufruf erneut initialisierte, wodurch die Race Condition ausgelöst wurde. Die Lösung bestand darin, den Rückgabewert auf `TRUE` zu ändern oder eleganter, `CRITICAL_SECTION` durch `SRWLOCK` zu ersetzen. Dieser Fall verdeutlicht, wie subtile Fehler im Rückgabewert zu schwerwiegenden Folgen führen können und unterstreicht die Bedeutung der Auswahl der richtigen Synchronisierungsprimitive.

Mehr lesen
Entwicklung

TypeScript nativer Compiler: 10-fache Performance-Steigerung

2025-03-11
TypeScript nativer Compiler: 10-fache Performance-Steigerung

Das TypeScript-Team hat einen nativen Port des TypeScript-Compilers und der -Tools angekündigt, um die Leistung drastisch zu verbessern. Diese native Implementierung soll den Editor-Start deutlich beschleunigen, die meisten Build-Zeiten um das Zehnfache reduzieren und den Speicherverbrauch erheblich senken. Erste Tests zeigen eine mehr als 10-fache Verbesserung der Kompiliergeschwindigkeit bei mehreren großen Projekten (z. B. VS Code, Playwright). Der zukünftige native TypeScript (geplant als TypeScript 7) wird erweiterte Refactorings, eine tiefere Codeanalyse und die Grundlage für die nächste Generation von KI-Entwicklungstools bieten. TypeScript 6 (JS-basiert) wird weiterhin gewartet, um einen reibungslosen Übergang zu gewährleisten.

Mehr lesen

Subtiles C++/WinRT Invoke-Problem und dessen Lösung

2025-03-09
Subtiles C++/WinRT Invoke-Problem und dessen Lösung

Ein Pull Request von C++/WinRT behob eine Mehrdeutigkeit beim Aufruf von `invoke` in `winrt::impl::promise_base::set_completed`, verursacht durch Argument-abhängiges Lookup (ADL). Das Upgrade auf C++20-Coroutinen erweiterte den ADL-Suchraum und fand unerwartet `std::invoke` statt des beabsichtigten `winrt::impl::invoke`. Der Artikel beschreibt den ADL-Mechanismus und bietet einen Patch für ältere C++/WinRT-Versionen: die Deklaration einer besser passenden `invoke`-Funktion im Namensraum `winrt::Windows::Foundation`, um den Compiler anzuleiten. Dieser Patch enthält auch eine statische Assertion, um sicherzustellen, dass er nach dem Upgrade von C++/WinRT automatisch entfernt wird.

Mehr lesen
Entwicklung

Die Falle des 'Anderen' in Enumerationen: Versionskompatibilität und offene Enumerationen

2025-03-02
Die Falle des 'Anderen' in Enumerationen: Versionskompatibilität und offene Enumerationen

Dieser Artikel behandelt die Probleme bei der Verwendung eines 'Anderen'-Werts (z. B. WidgetFlavor::Anderes) in C++-Enumerationen. Das Hinzufügen neuer Enumerationswerte stellt eine Herausforderung dar: Wie werden diese behandelt und die Kompatibilität mit älteren Codeversionen sichergestellt? Der Autor schlägt vor, 'Anderes' ganz zu vermeiden und die Enumeration als offen zu deklarieren, sodass Programme nicht erkannte Werte selbstständig verarbeiten können. Dies löst elegant Probleme mit der Versionskompatibilität, vermeidet Verwirrung beim Hinzufügen neuer Enumerationswerte und gewährleistet einen reibungslosen Übergang zwischen altem und neuem Code.

Mehr lesen

Wichtige Verbesserungen bei MSVC Address Sanitizer (ASan)

2025-02-25
Wichtige Verbesserungen bei MSVC Address Sanitizer (ASan)

Microsoft hat die Qualität von MSVC Address Sanitizer (ASan) deutlich verbessert. Wichtige Teile von ASan wurden erfolgreich zu LLVM upstreaming, was eine schnellere Integration von Verbesserungen der LLVM-Community ermöglicht. Darüber hinaus wurde ASan in die MSVC-Codebasis integriert, einschließlich Compiler, Linker und Tools, um Sicherheitsprobleme im Speicher in der kontinuierlichen Integration zu erkennen. Visual Studio 2022 Version 17.13 enthält zahlreiche Korrekturen, die falsch positive Ergebnisse reduzieren, die Fehlerberichterstattung verbessern und Multiprozess-Szenarien verwalten.

Mehr lesen
Entwicklung

Windows 95 Setup: Die überraschend komplexe Geschichte eines Mini-Betriebssystems

2025-02-17
Windows 95 Setup: Die überraschend komplexe Geschichte eines Mini-Betriebssystems

Dieser Artikel enthüllt die verborgene Komplexität des Windows 95 Setup-Programms. Um ein scheinbar einfaches Installationsprogramm zu erstellen, musste das Team ein Mini-Betriebssystem von Grund auf in MS-DOS entwickeln, einschließlich Grafikbibliotheken, eines Fenstermanagers, mehrsprachiger Unterstützung und sogar Kompatibilität mit Windows 3.1. Sie erkannten schließlich, dass es weitaus effizienter war, die vorhandene Windows 3.1-Laufzeitumgebung zu verwenden und so enorme Entwicklungsaufwände zu vermeiden. Die Geschichte unterstreicht die Bedeutung der Code-Wiederverwendung in der Softwareentwicklung und legt die überraschend komplexe Natur des Windows 95 Setup-Programms offen.

Mehr lesen
Entwicklung

Der Bildschirm „Es ist jetzt sicher, den Computer auszuschalten“: Eine nostalgische Reise zu Windows 95

2025-02-16
Der Bildschirm „Es ist jetzt sicher, den Computer auszuschalten“: Eine nostalgische Reise zu Windows 95

Erinnern Sie sich an die Meldung „Es ist jetzt sicher, den Computer auszuschalten“ in Windows 95? Diese Geschichte erzählt eine amüsante Anekdote in einem Flugzeug, bei der ein Mitreisender seinen Laptop wiederholt neu gestartet hat, nachdem er den Bildschirm „Windows wurde heruntergefahren“ gesehen hatte, ohne zu merken, dass er den Computer manuell ausschalten musste. Dies unterstreicht den Mangel an Energieverwaltung in älteren Computern und erklärt, warum Windows 95 die Meldung enthielt: eine freundliche Erinnerung daran, dass es sicher war, den Netzschalter zu drücken.

Mehr lesen
Technologie

Anekdote vom USB-Spezifikationsmeeting: Der Aufpreis für transluzent Blau

2025-02-10
Anekdote vom USB-Spezifikationsmeeting: Der Aufpreis für transluzent Blau

Bei einem Meeting zur USB-Spezifikation präsentierte ein Unternehmen seine USB-Diskettenlaufwerke und bot überraschenderweise separate Versionen für PCs und Macs an. Die Komitee-Mitglieder waren verwirrt, da die Spezifikation sicherstellte, dass dasselbe Laufwerk auf beiden Systemen funktionierte. Der Vertreter erklärte, dass die Laufwerke elektronisch identisch waren; der einzige Unterschied bestand darin, dass die Mac-Version aus transluzentem blauen Kunststoff bestand und mehr kostete. Dies spiegelte den damaligen Trend zu transluzentem Kunststoff bei iMacs wider und unterstrich, wie einige Hersteller Designunterschiede für Preisaufschläge nutzten.

Mehr lesen

Der 'Null-Garbage-Collector' in Raketen-Software: Speicherlecks? Kein Problem!

2025-02-07
Der 'Null-Garbage-Collector' in Raketen-Software: Speicherlecks? Kein Problem!

Ein Entwickler berichtet von einer cleveren Anwendung eines 'Null-Garbage-Collectors' in Raketensoftware. Aufgrund der begrenzten Flugzeit und des reichlich vorhandenen Hardwarespeichers waren Speicherlecks im Programm kein Problem. Die Ingenieure berechneten das potenzielle Speicherleck während des Fluges und fügten die doppelte Speichermenge hinzu, um sicherzustellen, dass das Programm nicht abstürzt, bevor die Mission abgeschlossen ist. Dieser Ansatz nutzte die Laufzeitbeschränkungen des Programms intelligent aus und löste das Problem der Speicherlecks effektiv: eine Art 'ultimative Garbage Collection'.

Mehr lesen
Entwicklung Speicherlecks

Go 1.24 Kryptografie-Überarbeitung: FIPS 140-3-Konformität erreicht

2025-02-06

Go 1.24 hat seine Kryptografie-Pakete umfassend überarbeitet, um die FIPS 140-3-Konformität zu erreichen. Dies ist ein großer Fortschritt, mit einer reinen Go-Implementierung (und Go-Assembler) eines FIPS 140-3-validierten kryptografischen Moduls, wodurch die Abhängigkeit von cgo oder Systemaufrufen entfällt. Microsoft Go 1.24 wurde ebenfalls aktualisiert und bietet jetzt Vorschau-Unterstützung für macOS und verbesserte Unterstützung für Azure Linux, verwendet aber weiterhin Systembibliotheken für die Kryptografie, was von der offiziellen Go-Methode abweicht. Neue Umgebungsvariablen wie GODEBUG=fips140=on und GOFIPS140=latest steuern den FIPS-Modus; die Laufzeit aktiviert ihn automatisch auf FIPS-konformen Systemen (Azure Linux, Windows).

Mehr lesen
Entwicklung

Ein Designfehler und ein versteckter Wasserkocher im Windows 3D Pipes Bildschirmschoner

2024-12-28
Ein Designfehler und ein versteckter Wasserkocher im Windows 3D Pipes Bildschirmschoner

Der beliebte Windows 3D Pipes Bildschirmschoner, bekannt für seine hypnotischen Rohranimationen, birgt ein wenig bekanntes Geheimnis: einen selten erscheinenden Wasserkocher. Dieser Wasserkocher ist eine Hommage an den Utah Teapot, ein Standardreferenzobjekt in der Computergrafik, aber seine unglaublich niedrige Erscheinungsrate führte zu Beschwerden von Benutzern über geringe Produktivität. Der Artikel enthüllt auch, dass der Bildschirmschoner in älteren Windows-Versionen aufgrund von Software-Rendering zu einer hohen CPU-Auslastung auf Servern führte, wobei ein schwarzer Bildschirmschoner für Server empfohlen wird.

Mehr lesen

C++-Compilerfehler: Unsinnige Fehler aus einer Funktionsdeklaration

2024-12-12
C++-Compilerfehler: Unsinnige Fehler aus einer Funktionsdeklaration

Ein Entwickler, der XAML-Unterstützung zu einer C++-Anwendung hinzufügen wollte, stieß auf eine Reihe von Compilerfehlern, allein durch das Einfügen der Headerdatei winrt/Windows.UI.Xaml.h. Die Fehler rührten von dem, was wie eine normale Funktionsdeklaration aussah, her: `template struct consume_Windows_UI_Xaml_IExceptionRoutedEventArgs { [[nodiscard]] auto ErrorMessage() const; };` Die Ursache war ein bereits vorhandenes Makro namens ErrorMessage im Projekt des Entwicklers, das mit dem Funktionsnamen kollidierte. Dieses Makro erzeugte ein ErrorMessageString-Objekt und gab einen Zeiger auf eine Fehlernachrichtenzeichenkette zurück. Die Begrenzungslosigkeit des Makros führte dazu, dass der Compiler die Funktionsdeklaration fälschlicherweise als Makroaufruf interpretierte, was zu Fehlern wie "nicht genügend Argumente" führte. Die Lösung bestand darin, das Makro mit #pragma undef zu deaktivieren, bevor der Header eingefügt wurde, oder das Makro ganz zu entfernen und es durch eine Inline-Funktion zu ersetzen.

Mehr lesen