Windows Confidential16-Bit-Symbole sind wirklich passé

Raymond Chen

Wie bereits in der Rubrik Windows Confidential vom Februar 2008 festgestellt wurde, verschwinden bestimmte Features von Zeit zu Zeit aus Windows®. Das geschieht normalerweise langsam und größtenteils unauffällig, und ein Produktteam feiert das Ereignis jedes Mal in aller Stille. Ein Feature, das aus Windows Vista® verschwunden ist, ist die Möglichkeit, durch 32-Bit-Code auf Symbole zuzugreifen, die in 16-Bit-Modulen gespeichert sind – meist handelt es sich um .EXE- oder .DLL-Dateien mit 16-Bit.

Bevor Sie sich grundlos aufregen, sollten Sie bedenken, dass 16-Bit-Code problemlos auf Symbole zugreifen kann, die in 16-Bit-Modulen gespeichert wurden. All das geschieht in der 16-Bit-Emulationsschicht. Verschwunden ist die Fähigkeit, auf diese Symbole von 32-Bit-Code aus zuzugreifen, oder genauer gesagt, die Fähigkeit, dass die Funktionen für 32-Bit-Symbolextrahierung, beispielsweise die ExtractIcon-Funktion, diese Symbole aus der 16-Bit-DLL laden kann.

Der 32-Bit-Code, der Symbole von 16-Bit-Modulen extrahiert, ist nicht in der Lage, Kernelfunktionen wie FindResource zum Auffinden des Symbols in der Datei zu verwenden. Stattdessen muss der Code sein eigenes Miniladeprogramm implementieren, das den 16-Bit-Modulheader analysiert, in der Ressourcentabelle sucht und anschließend die Ressourcentabelle auf der Suche nach der gewünschten Symbolressource analysiert. Erst nachdem all das erledigt wurde, können die Pixel vom 32-Bit-Code in ein Symbol umgewandelt werden.

  (Klicken Sie zum Vergrößern auf das Bild)

Wie Sie sich vorstellen können, ist der Code für diesen Vorgang ziemlich alt und relativ anfällig. Wenn (durch Zufall oder mit böswilliger Absicht) beschädigte Binärdateien analysiert werden, entstehen zahlreiche Fehlerquellen. Das für die Leistung zuständige Team wird dann möglicherweise Änderungsvorschläge für das Öffnen der Datei einreichen, um die Leistung über Netzwerke zu verbessern, da sich unterschiedliche Öffnungs- und Freigabemodi unterschiedlich auf die Netzwerkzwischenspeicherung auswirken. Das für Zuverlässigkeitsbelange zuständige Team wird vielleicht Änderungsvorschläge zum Schreiben des Analysecodes einreichen, um eine Verwendung von Dateien, denen Speicher zugewiesen wird, zu vermeiden. So übersteigt letzten Endes der Aufwand für die Verwaltung dieser Art von Code den dadurch gebotenen Nutzen. Wer schreibt heutzutage schon noch 16-Bit-Programme?

Ihre 16-Bit-Programme werden natürlich noch ausgeführt, solange der 16-Bit-Emulator vorhanden ist. (Es ist richtig, dass 64-Bit-Windows Vista nicht über eine 16-Bit-Emulationsschicht verfügt, doch das ist kein Rückschritt gegenüber Windows XP – 64-Bit-Windows XP hatte ebenfalls keine 16-Bit-Emulationsschicht. Also keine Verbesserung, aber auch keine Verschlechterung.)

Mit Windows Vista verlieren Sie lediglich die Möglichkeit, ExtractIcon von Ihrem 32-Bit-Programm auszuführen und ein Symbol von einer 16-Bit-DLL-Datei zu erhalten. Wenn Sie über eine Verknüpfung zu einem 16-Bit-Programm in Ihrem Startmenü verfügen, wird das Symbol für diese Verknüpfung jetzt als generisches Programmsymbol angezeigt, da Windows-Explorer das Symbol des 16-Bit-Programms nicht mehr aus der Haupt-EXE-Datei extrahieren kann. Kein großer Verlust. Wenn Sie das jedoch wirklich stört, können Sie die Eigenschaften der Verknüpfung bearbeiten und ihr ein Symbol von einem 32-Bit-Modul zuweisen.

Die einzige Stelle, an der dieses verlorene Feature nach meiner Erfahrung zu einem Problem wird, ist in Symbolbibliotheken, die von einem bestimmten Symbolbearbeitungstool erzeugt werden. Aus irgendeinem Grund speichert dieses Programm seine Symbole als Ressourcen in 16-Bit-DLL-Dateien, was bedeutet, dass Sie auf diese Symbole von 32-Bit-Code aus nicht mehr zugreifen können. Die einfache Problemumgehung besteht selbstverständlich darin, diese Symbolbibliotheken als Ressourcen in 32-Bit-DLL-Dateien zu speichern.

Ich bin mir sicher, dass letztendlich ein kleines Programm geschrieben wird – wenn das nicht bereits geschehen ist – um alle Symbole aus einer 16-Bit-DLL-Datei zu extrahieren und dann eine 32-Bit-DLL-Ressourcendatei mit diesen Symbolen zu erstellen. So können dann alte 16-Bit-DLL-Dateien auch weiterhin in Verknüpfungen auf dem Startmenü verwendet werden. Doch ehrlich gesagt, wenn Sie dieses Programm schreiben, finden Sie wahrscheinlich keine Abnehmer mehr dafür. Beim Windows-Team für die Entwicklung von Benutzeroberflächen ist nämlich genau diese Anzahl von Anfragen nach einem solchen Programm eingegangen: null.

Raymond Chen befasst sich auf seiner Website „The Old New Thing“ und in seinem gleichnamigen Buch mit der Geschichte von Windows und mit der Win32-Programmierung. Er achtet darauf, sich von zufallenden Türen fernzuhalten.

© 2008 Microsoft Corporation und CMP Media, LLC. Alle Rechte vorbehalten. Die nicht genehmigte teilweise oder vollständige Vervielfältigung ist nicht zulässig.