Suchreihenfolge der Dynamic Link Library
Es ist üblich, dass mehrere Versionen derselben Dynamic Link Library (DLL) an verschiedenen Dateisystemspeicherorten innerhalb eines Betriebssystems (OS) vorhanden sind. Sie können den bestimmten Speicherort steuern, von dem eine beliebige DLL geladen wird, indem Sie einen vollständigen Pfad angeben. Wenn Sie diese Methode jedoch nicht verwenden, sucht das System zur Ladezeit nach der DLL, wie in diesem Thema beschrieben. Das DLL-Ladeprogramm ist teil des Betriebssystems (Betriebssystem), das DLLs lädt und/oder Verweise auf DLLs auflöst.
Trinkgeld
Definitionen von verpackten und entpackten Apps finden Sie unter Vor- und Nachteile des Verpackens Ihrer App.
Faktoren, die sich auf die Suche auswirken
Im Folgenden finden Sie einige spezielle Suchfaktoren, die in diesem Thema erläutert werden. Sie können sie als Teil der DLL-Suchreihenfolge betrachten. In späteren Abschnitten in diesem Thema werden diese Faktoren in der geeigneten Suchreihenfolge für bestimmte App-Typen zusammen mit anderen Suchspeicherorten aufgelistet. In diesem Abschnitt werden nur die Konzepte vorgestellt, und sie sollen Namen geben, die wir später im Thema verwenden werden.
- DLL-Umleitung. Weitere Informationen finden Sie unter Umleitung der Dynamic Link Library.
- API legtfest. Ausführliche Informationen finden Sie unter Windows-API-Sätze.
- Parallele (SxS)-Manifestumleitung– nur Desktop-Apps (nicht UWP-Apps). Sie können mithilfe eines Anwendungsmanifests (auch als paralleles Anwendungsmanifest oder Fusionsmanifest bezeichnet) umleiten. Ausführliche Informationen finden Sie unter Manifeste.
- Liste geladener Module. Das System kann überprüfen, ob eine DLL mit demselben Modulnamen bereits in den Arbeitsspeicher geladen ist (unabhängig davon, aus welchem Ordner es geladen wurde).
-
Bekannte DLLs. Wenn sich die DLL in der Liste der bekannten DLLs für die Version von Windows befindet, auf der die Anwendung ausgeführt wird, verwendet das System seine Kopie der bekannten DLL (und die abhängigen DLLs der bekannten DLL, falls vorhanden). Eine Liste bekannter DLLs im aktuellen System finden Sie im Registrierungsschlüssel
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
.
Wenn eine DLL Abhängigkeiten aufweist, sucht das System nach den abhängigen DLLs, als ob sie nur mit ihren Modulnamen geladen wurden. Das gilt auch dann, wenn die erste DLL geladen wurde, indem sie einen vollständigen Pfad angibt.
Suchreihenfolge für verpackte Apps
Wenn eine verpackte App ein paketiertes Modul lädt (insbesondere ein Bibliotheksmodul – eine .dll
Datei), indem die LoadPackagedLibrary--Funktion aufgerufen wird, muss sich die DLL im Paketabhängigkeitsdiagramm des Prozesses befinden. Weitere Informationen finden Sie unter LoadPackagedLibrary. Wenn eine verpackte App ein Modul auf andere Weise lädt und keinen vollständigen Pfad angibt, sucht das System zur Ladezeit nach der DLL und den Abhängigkeiten, wie in diesem Abschnitt beschrieben.
Wenn das System nach einem Modul oder seinen Abhängigkeiten sucht, verwendet es immer die Suchreihenfolge für verpackte Apps; auch dann, wenn eine Abhängigkeit nicht verpackt ist.
Standardsuchreihenfolge für verpackte Apps
Das System durchsucht in dieser Reihenfolge:
- DLL-Umleitung.
- API-Sätze.
- Nur Desktop-Apps (nicht UWP-Apps). SxS-Manifestumleitung.
- Liste geladener Module.
- Bekannte DLLs.
- Das Paketabhängigkeitsdiagramm des Prozesses. Dies ist das Paket der Anwendung sowie alle Abhängigkeiten, die im Abschnitt
<Dependencies>
des Paketmanifests der Anwendung als<PackageDependency>
angegeben sind. Abhängigkeiten werden in der Reihenfolge durchsucht, in der sie im Manifest angezeigt werden. - Der Ordner, aus dem der aufrufende Prozess geladen wurde (ordner der ausführbare Datei).
- Der Systemordner (
%SystemRoot%\system32
).
Wenn eine DLL Abhängigkeiten aufweist, sucht das System nach den abhängigen DLLs, als ob sie nur mit ihren Modulnamen geladen wurden (auch wenn die erste DLL durch Angeben eines vollständigen Pfads geladen wurde).
Alternative Suchreihenfolge für verpackte Apps
Wenn ein Modul die Standardsuchreihenfolge ändert, indem die LoadLibraryEx--Funktion mit LOAD_WITH_ALTERED_SEARCH_PATHaufgerufen wird, ist die Suchreihenfolge mit der Standardsuchreihenfolge identisch, mit der Ausnahme, dass das System in Schritt 7 den Ordner durchsucht, aus dem das angegebene Modul geladen wurde (ordner des obersten Lademoduls) anstelle des Ordners der ausführbaren Datei.
Suchreihenfolge für entpackte Apps
Wenn eine entpackte App ein Modul lädt und keinen vollständigen Pfad angibt, sucht das System zur Ladezeit nach der DLL, wie in diesem Abschnitt beschrieben.
Wichtig
Wenn ein Angreifer die Kontrolle über eines der durchsuchten Verzeichnisse erhält, kann er eine böswillige Kopie der DLL in diesem Ordner platzieren. Möglichkeiten zum Verhindern solcher Angriffe finden Sie unter Sicherheit der Dynamic Link Library.
Standardsuchreihenfolge für entpackte Apps
Die vom System verwendete Standard-DLL-Suchreihenfolge hängt davon ab, ob sicheren DLL-Suchmodus aktiviert ist, aktiviert ist.
Der Suchmodus für sichere DLL (standardmäßig aktiviert) verschiebt den aktuellen Ordner des Benutzers später in der Suchreihenfolge. Um den Suchmodus für sichere DLL zu deaktivieren, erstellen Sie den HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
Registrierungswert, und legen Sie ihn auf 0 fest. Durch Das Aufrufen der SetDllDirectory Funktion wird der sichere DLL-Suchmodus (während sich der angegebene Ordner im Suchpfad befindet) effektiv deaktiviert und die Suchreihenfolge geändert, wie in diesem Thema beschrieben.
Wenn der Suchmodus für sichere DLL aktiviert ist, lautet die Suchreihenfolge wie folgt:
- DLL-Umleitung.
- API-Sätze.
- SxS-Manifestumleitung.
- Liste geladener Module.
- Bekannte DLLs.
-
Windows 11, Version 21H2 (10.0; Build 22000) und höher. Das Paketabhängigkeitsdiagramm des Prozesses. Dies ist das Paket der Anwendung sowie alle Abhängigkeiten, die im Abschnitt
<Dependencies>
des Paketmanifests der Anwendung als<PackageDependency>
angegeben sind. Abhängigkeiten werden in der Reihenfolge durchsucht, in der sie im Manifest angezeigt werden. - Der Ordner, aus dem die Anwendung geladen wurde.
- Der Systemordner. Verwenden Sie die GetSystemDirectory--Funktion, um den Pfad dieses Ordners abzurufen.
- Der 16-Bit-Systemordner. Es gibt keine Funktion, die den Pfad dieses Ordners abruft, aber es wird durchsucht.
- Der Windows-Ordner. Verwenden Sie die GetWindowsDirectory--Funktion, um den Pfad dieses Ordners abzurufen.
- Der aktuelle Ordner.
- Die Verzeichnisse, die in der umgebungsvariablen
PATH
aufgeführt sind. Dies schließt nicht den anwendungsspezifischen Pfad ein, der durch den App-Pfad Registrierungsschlüssels angegeben wird. Der App-Pfade Schlüssel wird beim Berechnen des DLL-Suchpfads nicht verwendet.
Wenn der Suchmodus für sichere DLL deaktiviert ist, ist die Suchreihenfolge identisch, mit der Ausnahme, dass den aktuellen Ordner von Position 11 auf Position 8 in der Sequenz verschoben wird (unmittelbar nach Schritt 7. Der Ordner, aus dem die Anwendunggeladen hat).
Alternative Suchreihenfolge für entpackte Apps
Um die vom System verwendete Standardsuchreihenfolge zu ändern, können Sie die LoadLibraryEx- funktion mit LOAD_WITH_ALTERED_SEARCH_PATHaufrufen. Sie können auch die Standardsuchreihenfolge ändern, indem Sie die funktion SetDllDirectory aufrufen.
Anmerkung
Die Standardmäßige Suchreihenfolge des Prozesses wird auch durch Aufrufen der SetDllDirectory--Funktion im übergeordneten Prozess vor beginn des aktuellen Prozesses beeinflusst.
Wenn Sie eine alternative Suchstrategie angeben, wird das Verhalten fortgesetzt, bis sich alle zugehörigen ausführbaren Module befinden. Nachdem das System mit der Verarbeitung von DLL-Initialisierungsroutinen begonnen hat, wird das System auf die standardmäßige Suchstrategie zurückgesetzt.
Die LoadLibraryEx--Funktion unterstützt eine alternative Suchreihenfolge, wenn der Aufruf LOAD_WITH_ALTERED_SEARCH_PATHangibt, und der parameter lpFileName einen absoluten Pfad angibt.
- Die Standardmäßige Suchstrategie beginnt (nach den ersten Schritten) im Ordner der aufrufenden Anwendung.
- Die alternative Suchstrategie, die von LoadLibraryEx mit LOAD_WITH_ALTERED_SEARCH_PATH beginnt (nach den ersten Schritten) im Ordner des ausführbaren Moduls, das LoadLibrary Ex lädt.
Das ist die einzige Möglichkeit, in der sie unterschiedlich sind.
Wenn der Suchmodus für sichere DLL aktiviert ist, lautet die alternative Suchreihenfolge wie folgt:
Die Schritte 1 bis 6 sind identisch mit der standardmäßigen Suchreihenfolge.
- Der durch lpFileNameangegebene Ordner.
- Der Systemordner. Verwenden Sie die GetSystemDirectory--Funktion, um den Pfad dieses Ordners abzurufen.
- Der 16-Bit-Systemordner. Es gibt keine Funktion, die den Pfad dieses Ordners abruft, aber es wird durchsucht.
- Der Windows-Ordner. Verwenden Sie die GetWindowsDirectory--Funktion, um den Pfad dieses Ordners abzurufen.
- Der aktuelle Ordner.
- Die Verzeichnisse, die in der umgebungsvariablen
PATH
aufgeführt sind. Dies schließt nicht den anwendungsspezifischen Pfad ein, der durch den App-Pfad Registrierungsschlüssels angegeben wird. Der App-Pfade Schlüssel wird beim Berechnen des DLL-Suchpfads nicht verwendet.
Wenn der Suchmodus für sichere DLL deaktiviert ist, ist die alternative Suchreihenfolge identisch, mit der Ausnahme, dass der aktuelle Ordner von Position 11 auf Position 8 in der Sequenz verschoben wird (unmittelbar nach Schritt 7. Der durch lpFileName) angegebene Ordner ).
Die SetDllDirectory--Funktion unterstützt eine alternative Suchreihenfolge, wenn der lpPathName Parameter einen Pfad angibt. Die alternative Suchreihenfolge lautet wie folgt:
Die Schritte 1 bis 6 sind identisch mit der standardmäßigen Suchreihenfolge.
- Der Ordner, aus dem die Anwendung geladen wurde.
- Der vom lpPathName Parameter von SetDllDirectoryangegebene Ordner.
- Der Systemordner.
- Der 16-Bit-Systemordner.
- Der Windows-Ordner.
- Die Verzeichnisse, die in der
PATH
Umgebungsvariable aufgeführt sind.
Wenn der parameter lpPathName eine leere Zeichenfolge ist, entfernt der Aufruf den aktuellen Ordner aus der Suchreihenfolge.
SetDllDirectory den sicheren DLL-Suchmodus effektiv deaktiviert, während sich der angegebene Ordner im Suchpfad befindet. Rufen Sie SetDllDirectory mit lpPathName als NULL auf, um den Suchmodus für die sichere DLL-Suche basierend auf dem SafeDllSearchMode wiederherzustellen und den aktuellen Ordner in der Suchreihenfolge wiederherzustellen.
Suchreihenfolge mit LOAD_LIBRARY_SEARCH Flags
Sie können eine Suchreihenfolge mithilfe eines oder mehrerer LOAD_LIBRARY_SEARCH Flags mit der LoadLibraryEx--Funktion angeben. Sie können auch LOAD_LIBRARY_SEARCH Flags mit der SetDefaultDllDirectories Funktion verwenden, um eine DLL-Suchreihenfolge für einen Prozess einzurichten. Sie können zusätzliche Verzeichnisse für die Prozess-DLL-Suchreihenfolge angeben, indem Sie die funktionen AddDllDirectory oder SetDllDirectory verwenden.
Die durchsuchten Verzeichnisse hängen von den flags ab, die mit SetDefaultDllDirectories oder LoadLibraryEx-angegeben sind. Wenn Sie mehrere Kennzeichnungen verwenden, werden die entsprechenden Verzeichnisse in dieser Reihenfolge durchsucht:
- LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR. Der Ordner, der die DLL enthält, wird durchsucht. Dieser Ordner wird nur nach Abhängigkeiten der ZU ladenden DLL durchsucht.
- LOAD_LIBRARY_SEARCH_APPLICATION_DIR. Der Anwendungsordner wird durchsucht.
- LOAD_LIBRARY_SEARCH_USER_DIRS. Pfade, die explizit mit der funktion AddDllDirectory hinzugefügt wurden, oder die SetDllDirectory--Funktion werden durchsucht. Wenn Sie mehrere Pfade hinzufügen, wird die Reihenfolge, in der die Pfade durchsucht werden, nicht angegeben.
- LOAD_LIBRARY_SEARCH_SYSTEM32. Der Systemordner wird durchsucht.
Wenn Sie LoadLibraryEx- ohne LOAD_LIBRARY_SEARCH Flags aufrufen oder eine DLL-Suchreihenfolge für den Prozess einrichten, sucht das System mithilfe der Standardsuchreihenfolge oder der alternativen Suchreihenfolge nach DLLs.