Dynamic Link Library-Suchreihenfolge
Ein System kann mehrere Versionen derselben Dynamic Link Library (DLL) enthalten. Anwendungen können den Speicherort steuern, von dem eine DLL geladen wird, indem sie einen vollständigen Pfad angeben oder einen anderen Mechanismus wie ein Manifest verwenden. Wenn diese Methoden nicht verwendet werden, sucht das System zur Ladezeit nach der DLL, wie in diesem Thema beschrieben.
- Faktoren, die sich auf die Suche auswirken
- Suchauftrag für UWP-Apps
- Suchauftrag für Desktopanwendungen
- Zugehörige Themen
Faktoren, die sich auf die Suche auswirken
Die folgenden Faktoren beeinflussen, ob das System nach einer DLL sucht:
- Wenn eine DLL mit dem gleichen Modulnamen bereits in den Arbeitsspeicher geladen wurde, prüft das System nur auf Umleitung und ein Manifest, bevor es in die geladene DLL auflöst, unabhängig davon, in welchem Verzeichnis sie sich befindet. Das System sucht nicht nach der DLL.
- 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 der abhängigen DLLs der bekannten DLL, falls welche), anstatt nach der DLL zu suchen. Eine Liste der bekannten DLLs auf dem aktuellen System finden Sie unter dem folgenden 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 würden sie nur mit ihren Modulnamen geladen. Dies gilt auch dann, wenn die erste DLL durch Angabe eines vollständigen Pfads geladen wurde.
Suchauftrag für UWP-Apps
Wenn eine UWP-App für Windows 10 (oder eine Store-App für Windows 8.x) ein gepacktes Modul lädt, indem die LoadPackagedLibrary-Funktion aufruft, muss sich die DLL im Paketabhängigkeitsdiagramm des Prozesses befindet. Weitere Informationen finden Sie unter LoadPackagedLibrary. Wenn eine UWP-App ein Modul auf andere Weise lädt und keinen vollständigen Pfad anweist, sucht das System zur Ladezeit nach der DLL und ihren Abhängigkeiten, wie in diesem Abschnitt beschrieben.
Bevor das System nach einer DLL sucht, wird Folgendes überprüft:
- Wenn eine DLL mit dem gleichen Modulnamen bereits in den Arbeitsspeicher geladen wurde, verwendet das System die geladene DLL, unabhängig davon, in welchem Verzeichnis sie sich befindet. Das System sucht nicht nach der DLL.
- 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 der abhängigen DLLs der bekannten DLL, falls verfügbar). Das System sucht nicht nach der DLL. Eine Liste der bekannten DLLs auf dem aktuellen System finden Sie unter dem folgenden Registrierungsschlüssel: HKEY _ LOCAL MACHINE SYSTEM _ \ \ CurrentControlSet \ Control Session Manager \ \ KnownDLLs.
Wenn das System nach einem Modul oder seinen Abhängigkeiten suchen muss, verwendet es immer die Such reihenfolge für UWP-Apps, auch wenn es sich bei einer Abhängigkeit nicht um UWP-App-Code handelt.
Standardsuch reihenfolge für UWP-Apps
Wenn das Modul noch nicht geladen ist oder in der Liste der bekannten DLLs enthalten ist, durchsucht das System diese Speicherorte in der folgenden Reihenfolge:
- Das Paketabhängigkeitsdiagramm des Prozesses. Dies ist das Paket der Anwendung sowie alle Abhängigkeiten, die im Abschnitt des Paketmanifests
<PackageDependency><Dependencies>der Anwendung angegeben sind. Abhängigkeiten werden in der Reihenfolge durchsucht, in der sie im Manifest angezeigt werden. - Das Verzeichnis, aus dem der aufrufende Prozess geladen wurde.
- Das Systemverzeichnis (%SystemRoot% \ system32).
Wenn eine DLL Abhängigkeiten aufweist, sucht das System nach den abhängigen DLLs, als würden sie nur mit ihren Modulnamen geladen. Dies gilt auch dann, wenn die erste DLL durch Angabe eines vollständigen Pfads geladen wurde.
Alternative Such reihenfolge für UWP-Apps
Wenn ein Modul die Standardsuch reihenfolge durch Aufrufen der LoadLibraryEx-Funktion mit LOAD WITH ALTERED SEARCH _ _ _ _ PATH ändert, durchsucht das System das Verzeichnis, aus dem das angegebene Modul geladen wurde, anstelle des Verzeichnisses des aufrufenden Prozesses. Das System durchsucht diese Speicherorte in der folgenden Reihenfolge:
- Das Paketabhängigkeitsdiagramm des Prozesses. Dies ist das Paket der Anwendung sowie alle Abhängigkeiten, die im Abschnitt des Paketmanifests
<PackageDependency><Dependencies>der Anwendung angegeben sind. Abhängigkeiten werden in der Reihenfolge durchsucht, in der sie im Manifest angezeigt werden. - Das Verzeichnis, aus dem das angegebene Modul geladen wurde.
- Das Systemverzeichnis (%SystemRoot% \ system32).
Suchauftrag für Desktopanwendungen
Desktopanwendungen können den Speicherort steuern, von dem eine DLL geladen wird, indem sie einen vollständigen Pfad angeben, die DLL-Umleitungverwenden oder ein Manifest verwenden. Wenn keine dieser Methoden verwendet wird, sucht das System zur Ladezeit nach der DLL, wie in diesem Abschnitt beschrieben.
Bevor das System nach einer DLL sucht, wird Folgendes überprüft:
- Wenn eine DLL mit dem gleichen Modulnamen bereits in den Arbeitsspeicher geladen wurde, verwendet das System die geladene DLL, unabhängig davon, in welchem Verzeichnis sie sich befindet. Das System sucht nicht nach der DLL.
- 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 der abhängigen DLLs der bekannten DLL, falls verfügbar). Das System sucht nicht nach der DLL. Eine Liste der bekannten DLLs auf dem aktuellen System finden Sie unter dem folgenden 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 würden sie nur mit ihren Modulnamen geladen. Dies gilt auch dann, wenn die erste DLL durch Angabe eines vollständigen Pfads geladen wurde.
Wichtig
Wenn ein Angreifer die Kontrolle über eines der verzeichnisse erhält, die durchsucht werden, kann er eine schädliche Kopie der DLL in diesem Verzeichnis platzieren. Möglichkeiten, solche Angriffe zu verhindern, finden Sie unter Dynamic Link Library Security.
Standardsuch reihenfolge für Desktopanwendungen
Die vom System verwendete STANDARD-DLL-Such reihenfolge hängt davon ab, ob der sichere DLL-Suchmodus aktiviert oder deaktiviert ist. Tresor Im DLL-Suchmodus wird das aktuelle Verzeichnis des Benutzers später in der Such reihenfolge platziert.
Tresor Der DLL-Suchmodus ist standardmäßig aktiviert. Um dieses Feature zu deaktivieren, erstellen Sie den Registrierungswert HKEY _ LOCAL MACHINE System _ \ \ CurrentControlSet \ Control Session \ Manager \ SafeDllSearchMode und legen ihn auf 0 fest. Durch aufrufen der SetDllDirectory-Funktion wird SafeDllSearchMode effektiv deaktiviert, während sich das angegebene Verzeichnis im Suchpfad befindet, und ändert die Suchrichtung wie in diesem Thema beschrieben.
Wenn SafeDllSearchMode aktiviert ist, lautet die Such reihenfolge wie folgt:
- Das Verzeichnis, aus dem die Anwendung geladen wurde.
- Das Systemverzeichnis Verwenden Sie die GetSystemDirectory-Funktion, um den Pfad dieses Verzeichnisses zu erhalten.
- Das 16-Bit-Systemverzeichnis. Es gibt keine Funktion, die den Pfad dieses Verzeichnisses erhält, aber es wird durchsucht.
- Das Windows-Verzeichnis. Verwenden Sie die GetWindowsDirectory-Funktion, um den Pfad dieses Verzeichnisses zu erhalten.
- Das aktuelle Verzeichnis.
- Die Verzeichnisse, die in der PATH-Umgebungsvariablen aufgeführt sind. Beachten Sie, dass dies nicht den anwendungsspezifischen Pfad enthält, der durch den Registrierungsschlüssel App Paths angegeben wird. Der Schlüssel "App-Pfade" wird beim Berechnen des DLL-Suchpfads nicht verwendet.
Wenn SafeDllSearchMode deaktiviert ist, lautet die Such reihenfolge wie folgt:
- Das Verzeichnis, aus dem die Anwendung geladen wurde.
- Das aktuelle Verzeichnis.
- Das Systemverzeichnis Verwenden Sie die GetSystemDirectory-Funktion, um den Pfad dieses Verzeichnisses zu erhalten.
- Das 16-Bit-Systemverzeichnis. Es gibt keine Funktion, die den Pfad dieses Verzeichnisses erhält, aber es wird durchsucht.
- Das Windows-Verzeichnis. Verwenden Sie die GetWindowsDirectory-Funktion, um den Pfad dieses Verzeichnisses zu erhalten.
- Die Verzeichnisse, die in der PATH-Umgebungsvariablen aufgeführt sind. Beachten Sie, dass dies nicht den anwendungsspezifischen Pfad enthält, der durch den Registrierungsschlüssel App Paths angegeben wird. Der Schlüssel "App-Pfade" wird beim Berechnen des DLL-Suchpfads nicht verwendet.
Alternative Such reihenfolge für Desktopanwendungen
Die vom System verwendete Standardsuch reihenfolge kann durch Aufrufen der LoadLibraryEx-Funktion mit LOAD WITH ALTERED SEARCH PATH geändert _ _ _ _ werden. Die Standardsuchrichtung kann auch durch Aufrufen der SetDllDirectory-Funktion geändert werden.
Hinweis
Die Standardsuch reihenfolge des Prozesses wird auch durch Aufrufen der SetDllDirectory-Funktion im übergeordneten Prozess vor dem Start des aktuellen Prozesses beeinflusst.
Wenn Sie eine alternative Suchstrategie angeben, wird ihr Verhalten fortgesetzt, bis alle zugeordneten ausführbaren Module gefunden wurden. Nachdem das System mit der Verarbeitung von DLL-Initialisierungsroutinen begonnen hat, wird das System zur Standardsuchestrategie zurückgesetzt.
Die LoadLibraryEx-Funktion unterstützt eine alternative Suchreihenfolge, wenn der Aufruf LOAD WITH ALTERED SEARCH _ _ _ _ PATH angibt und der lpFileName-Parameter einen absoluten Pfad angibt.
Beachten Sie, dass sich die Standardsuchstrategie und die alternative Suchstrategie, die von LoadLibraryEx mit LOAD WITH ALTERED SEARCH _ _ _ _ PATH angegeben wird, in nur einer Weise unterscheiden: Die Standardsuche beginnt im Verzeichnis der aufrufenden Anwendung, und die alternative Suche beginnt im Verzeichnis des ausführbaren Moduls, das LoadLibraryEx lädt.
Wenn SafeDllSearchMode aktiviert ist, lautet die alternative Suchreihenfolge wie folgt:
- Das durch lpFileName angegebene Verzeichnis.
- Das Systemverzeichnis Verwenden Sie die GetSystemDirectory-Funktion, um den Pfad dieses Verzeichnisses abzurufen.
- Das 16-Bit-Systemverzeichnis. Es gibt keine Funktion, die den Pfad dieses Verzeichnisses erhält, aber sie wird durchsucht.
- Das Windows-Verzeichnis. Verwenden Sie die GetWindowsDirectory-Funktion, um den Pfad dieses Verzeichnisses abzurufen.
- Das aktuelle Verzeichnis.
- Die Verzeichnisse, die in der PATH-Umgebungsvariablen aufgeführt sind. Beachten Sie, dass dies nicht den anwendungsspezifischen Pfad enthält, der durch den Registrierungsschlüssel für App-Pfade angegeben wird. Der App-Pfadschlüssel wird beim Berechnen des DLL-Suchpfads nicht verwendet.
Wenn SafeDllSearchMode deaktiviert ist, lautet die alternative Suchreihenfolge wie folgt:
- Das durch lpFileName angegebene Verzeichnis.
- Das aktuelle Verzeichnis.
- Das Systemverzeichnis Verwenden Sie die GetSystemDirectory-Funktion, um den Pfad dieses Verzeichnisses abzurufen.
- Das 16-Bit-Systemverzeichnis. Es gibt keine Funktion, die den Pfad dieses Verzeichnisses erhält, aber sie wird durchsucht.
- Das Windows-Verzeichnis. Verwenden Sie die GetWindowsDirectory-Funktion, um den Pfad dieses Verzeichnisses abzurufen.
- Die Verzeichnisse, die in der PATH-Umgebungsvariablen aufgeführt sind. Beachten Sie, dass dies nicht den anwendungsspezifischen Pfad enthält, der durch den Registrierungsschlüssel für App-Pfade angegeben wird. Der App-Pfadschlüssel wird beim Berechnen des DLL-Suchpfads nicht verwendet.
Die SetDllDirectory-Funktion unterstützt eine alternative Suchreihenfolge, wenn der lpPathName-Parameter einen Pfad angibt. Die alternative Suchreihenfolge lautet wie folgt:
- Das Verzeichnis, aus dem die Anwendung geladen wurde.
- Das durch den lpPathName-Parameter von SetDllDirectoryangegebene Verzeichnis.
- Das Systemverzeichnis Verwenden Sie die GetSystemDirectory-Funktion, um den Pfad dieses Verzeichnisses abzurufen. Der Name dieses Verzeichnisses lautet System32.
- Das 16-Bit-Systemverzeichnis. Es gibt keine Funktion, die den Pfad dieses Verzeichnisses erhält, aber sie wird durchsucht. Der Name dieses Verzeichnisses lautet System.
- Das Windows-Verzeichnis. Verwenden Sie die GetWindowsDirectory-Funktion, um den Pfad dieses Verzeichnisses abzurufen.
- Die Verzeichnisse, die in der PATH-Umgebungsvariablen aufgeführt sind. Beachten Sie, dass dies nicht den anwendungsspezifischen Pfad enthält, der durch den Registrierungsschlüssel für App-Pfade angegeben wird. Der App-Pfadschlüssel wird beim Berechnen des DLL-Suchpfads nicht verwendet.
Wenn der lpPathName-Parameter eine leere Zeichenfolge ist, entfernt der Aufruf das aktuelle Verzeichnis aus der Suchreihenfolge.
SetDllDirectory deaktiviert effektiv den Suchmodus für sichere DLLs, während sich das angegebene Verzeichnis im Suchpfad befindet. Um den sicheren DLL-Suchmodus basierend auf dem SafeDllSearchMode-Registrierungswert wiederherzustellen und das aktuelle Verzeichnis in der Suchreihenfolge wiederherzustellen, rufen Sie SetDllDirectory mit lpPathName als NULL auf.
Suchreihenfolge mit LOAD _ LIBRARY _ SEARCH-Flags
Eine Anwendung kann eine Suchreihenfolge mithilfe eines oder mehrerer LOAD _ LIBRARY _ SEARCH-Flags mit der LoadLibraryEx-Funktion angeben. Eine Anwendung kann auch LOAD _ LIBRARY _ SEARCH-Flags mit der SetDefaultDllDirectories-Funktion verwenden, um eine DLL-Suchreihenfolge für einen Prozess einzurichten. Die Anwendung kann mithilfe der Funktionen AddDllDirectory oder SetDllDirectory zusätzliche Verzeichnisse für die Prozess-DLL-Suchreihenfolge angeben.
Welche Verzeichnisse durchsucht werden, hängt von den Flags ab, die mit SetDefaultDllDirectories oder LoadLibraryExangegeben sind. Wenn mehrere Flags verwendet werden, werden die entsprechenden Verzeichnisse in der folgenden Reihenfolge durchsucht:
- Das Verzeichnis, das die DLL enthält (LOAD LIBRARY SEARCH DLL LOAD _ _ _ _ _ DIR). Dieses Verzeichnis wird nur nach Abhängigkeiten der zu ladenden DLL durchsucht.
- Das Anwendungsverzeichnis (LOAD LIBRARY SEARCH APPLICATION _ _ _ _ DIR).
- Pfade, die explizit mit der AddDllDirectory-Funktion (LOAD LIBRARY SEARCH USER _ _ _ _ DIRS) oder der SetDllDirectory-Funktion hinzugefügt werden. Wenn mehr als ein Pfad hinzugefügt wurde, ist die Reihenfolge, in der die Pfade durchsucht werden, nicht angegeben.
- Das Systemverzeichnis (LOAD _ LIBRARY SEARCH _ _ SYSTEM32).
Wenn die Anwendung LoadLibraryEx nicht mit LOAD _ LIBRARY _ SEARCH-Flags aufruft oder eine DLL-Suchreihenfolge für den Prozess einrichtet, sucht das System entweder mithilfe der Standardsuchreihenfolge oder der alternativen Suchreihenfolge nach DLLs.