Windows ConfidentialDer Balanceakt der bekannten DLLs

Raymond Chen

Das inoffiziell als „Known DLLs“ bezeichnete Windows- Feature bezieht sich auf eine Liste von DLLs (Dynamic Link Libraries), die vom Modulladeprogramm des Kernels besonders behandelt werden. Wenn das Ladeprogramm ein Programm mit einem ladezeitdynamischen Link zu einer bekannten DLL entdeckt, wird sofort die bekannte Kopie verwendet, und der Suchalgorithmus, der normalerweise für die Modulladung gilt, wird ignoriert. Dies könnte als (zugegebenermaßen recht schwaches) Sicherheitsfeature betrachtet werden, doch die Sicherheit war nie Ziel dieses Features. Bei den bekannten DLLs geht es allein um die Leistung.

Die Funktionsweise dieses Features hat sich im Lauf der Zeit verändert. In einigen Windows®-Versionen verwendet der Kernel die Liste der bekannten DLLs als Ausgangspunkt, betrachtet dann alle DLLs, mit denen diese bekannten DLLs verknüpft sind, dann alle DLLs, mit denen diese DLLs verknüpft sind, und so weiter. Dieser Prozess erstellt den transitiven Abschluss aller Abhängigkeiten und behandelt alle gefundenen DLLs als bekannt. In anderen Windows-Versionen wird dieser transitive Abschluss nicht erstellt, vielmehr werden nur ausdrücklich als bekannt aufgeführt DLLs als solche behandelt. In einigen Windows-Versionen werden die bekannten DLLs vom Kernel beim Starten des Systems vorab geladen, während in anderen Versionen dieses Vorabladen nicht stattfindet und der Kernel die Liste nur verwendet, um nicht nach dem Pfad einer DLL suchen zu müssen.

Doch es ist nicht nur die Interpretation der Liste bekannter DLLs, die sich von Version zu Version ändert. Der Inhalt des KnownDLLs-Registrierungsschlüssel ist ebenfalls Gegenstand von Änderungen. Das Team, das sich mit der Leistung von Windows befasst, ändert sowohl die Liste bekannter DLLs als auch die Regeln für das Konvertieren der Liste in einen Satz DLLs auf der Grundlage der Art und Weise, wie Anwendungen Windows verwenden. Wie immer im technischen Bereich werden dabei Kompromisse eingegangen. Das Vorabladen bekannter DLLs beim Systemstart ermöglicht es den Anwendungen, die diese DLLs verwenden, schneller zu starten, aber dies hat einen Nachteil. Das System braucht länger zum Starten, und der Speicherverbrauch nimmt zu, da diese DLLs unabhängig davon, ob sie tatsächlich verwendet werden oder nicht, im Speicher verbleiben. Die Leistungsverbesserung einiger Komponenten erfolgt also auf Kosten anderer. Hier das richtige Gleichgewicht zu finden, ist schwierig, und wie Sie sehen, finden aufgrund der Entwicklung von Verwendungsmustern ständig neue Feinabstimmungen statt.

Eine nicht sofort offensichtliche Eigenschaft bekannter DLLs besteht darin, dass diese Vorrang vor lokal umgeleiteten DLLs haben. (Informationen zu lokal umgeleiteten DLLs finden Sie in dieser Rubrik in der Ausgabe vom Januar 2007.) Eigentlich ist dieses Verhalten zu erwarten und keine Laune. Schließlich besteht der Zweck der Liste bekannter DLLs darin, den Suchpfad zu umgehen und dadurch das Laden von DLLs zu beschleunigen. Wenn der Kernel nach lokal umgeleiteten DLLs suchen müsste, würde alles wieder verlangsamt werden. Vielleicht sind Sie der Meinung, dass das Hinzufügen eines einzigen Verzeichnisses zum Suchpfad nicht weiter schwierig ist, doch wenn dieses eine Verzeichnis ein Netzwerkserver auf der anderen Seite des Globus ist, nimmt selbst das Hinzufügen nur eines Verzeichnisses enorm viel Leistung in Anspruch.

Es gibt tatsächlich Programme, die sich darauf verlassen, dass bestimmte DLLs bekannt sind. Ein Programm hatte beispielsweise eine Datei namens „Version.dll“ im Anwendungsverzeichnis. Unter normalen Umständen würde diese private Kopie von Version.dll jene im Systemverzeichnis außer Kraft setzen, doch in Windows XP wird Version.dll als bekannte DLL aufgelistet. Das bedeutet, dass die Kopie im Anwendungsverzeichnis ignoriert und stattdessen die Version im Systemverzeichnis verwendet wird.

In Windows Vista® wird Version.dll nicht mehr als bekannte DLL aufgeführt, da das für Leistung zuständige Team wahrscheinlich der Meinung war, dass die Datei von Anwendungen nicht genug verwendet wurde, um die Leistungsnachteile zu rechtfertigen. Aus diesem Grund funktionierte dieses Programm unter Windows Vista nicht mehr, weil die Anwendung davon abhängig war, dass das Kernel die DLL ignorieren würde, die das Programm in seinem eigenen Anwendungsverzeichnis installiert hatte. Das Programm installierte absichtlich eine DLL im Suchpfad und verließ sich dann darauf, dass Windows sie ignorieren würde! Wenn Windows die Datei ignorieren sollte, wäre es sicherlich viel effizienter gewesen, die Datei erst gar nicht zu installieren. Der Clou ist, dass das Unternehmen, das das Programm geschrieben hatte, einen Fehler monierte und behauptete, es habe eine Sicherheitslücke entdeckt.

Raymond Chen befasst sich auf seiner Website „The Old New Thing“ und in seinem gleichnamigen Buch (Addison-Wesley, 2007) mit der Geschichte von Windows und mit der Win32-Programmierung. Er weiß nicht mehr, welche T-Shirt-Größe er trägt.

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