Suchreihenfolge der Dynamic Link-Bibliothek

Es ist üblich, dass mehrere Versionen derselben DLL (Dynamic Link Library) an unterschiedlichen Dateisystemspeicherorten innerhalb eines Betriebssystems vorhanden sind. Sie können den spezifischen Speicherort steuern, von dem eine bestimmte 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 der Teil des Betriebssystems, das DLLs lädt und/oder Verweise auf DLLs auflöst.

Tipp

Definitionen von gepackten und unverpackten Apps finden Sie unter Vor- und Nachteile beim Packen 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 den späteren Abschnitten dieses Themas werden diese Faktoren in der entsprechenden Suchreihenfolge für bestimmte App-Typen zusammen mit anderen Suchspeicherorten aufgeführt. In diesem Abschnitt werden nur die Konzepte vorgestellt und die Namen angegeben, die später im Thema verwendet werden.

  • DLL-Umleitung. Weitere Informationen finden Sie unter Umleitung der Dynamic-Link-Bibliothek.
  • API-Sätze. Weitere Informationen finden Sie unter Windows-API-Sätze.
  • Parallele Manifestumleitung (SxS): Nur Desktop-Apps (keine UWP-Apps). Sie können eine Umleitung mithilfe eines Anwendungsmanifests (auch als paralleles Anwendungsmanifest oder Fusionsmanifest bezeichnet) durchführen. Weitere 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 sie geladen wurde).
  • Bekannte DLLs. Wenn sich die DLL in der Liste der bekannten DLLs für die Version von Windows befindet, unter der die Anwendung ausgeführt wird, verwendet das System die Kopie der bekannten DLL (und ggf. der abhängigen DLLs der bekannten DLL). Eine Liste der bekannten DLLs auf dem 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 würden. Dies gilt auch dann, wenn die erste DLL geladen wurde, indem ein vollständiger Pfad angegeben wurde.

Suchreihenfolge für gepackte Apps

Wenn eine gepackte App durch Aufrufen der LoadPackagedLibrary-Funktion ein gepacktes Modul (insbesondere ein Bibliotheksmodul – eine .dll Datei) lädt, muss sich die DLL im Paketabhängigkeitsdiagramm des Prozesses befinden. Weitere Informationen finden Sie unter LoadPackagedLibrary. Wenn eine gepackte App ein Modul auf andere Weise lädt und keinen vollständigen Pfad angibt, sucht das System zur Ladezeit nach der DLL und den zugehörigen Abhängigkeiten, wie in diesem Abschnitt beschrieben.

Wenn das System nach einem Modul oder dessen Abhängigkeiten sucht, verwendet es immer die Suchreihenfolge für gepackte Apps. auch dann, wenn eine Abhängigkeit nicht als App-Code verpackt ist.

Standardsuchreihenfolge für verpackte Apps

Das System sucht in dieser Reihenfolge:

  1. DLL-Umleitung.
  2. API-Sätze.
  3. Nur Desktop-Apps (keine UWP-Apps). SxS-Manifestumleitung.
  4. Liste geladener Module.
  5. Bekannte DLLs.
  6. Das Paketabhängigkeitsdiagramm des Prozesses. Dies ist das Paket der Anwendung sowie alle Abhängigkeiten, die <Dependencies> im <PackageDependency> Abschnitt des Paketmanifests der Anwendung angegeben sind. Abhängigkeiten werden in der Reihenfolge gesucht, in der sie im Manifest angezeigt werden.
  7. Der Ordner, aus dem der aufrufende Prozess geladen wurde (der Ordner der ausführbaren Datei).
  8. 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 würden (auch wenn die erste DLL geladen wurde, indem ein vollständiger Pfad angegeben wurde).

Alternative Suchreihenfolge für gepackte Apps

Wenn ein Modul die Standardsuchreihenfolge durch Aufrufen der LoadLibraryEx-Funktion mit LOAD_WITH_ALTERED_SEARCH_PATH ändert, ist die Suchreihenfolge identisch mit der Standardsuchreihenfolge, mit der Ausnahme, dass das System in Schritt 7 den Ordner durchsucht, aus dem das angegebene Modul geladen wurde (der Ordner des moduls, das am häufigsten geladen wurde) anstelle des Ordners der ausführbaren Datei.

Suchreihenfolge für nicht verpackte Apps

Wenn eine nicht gepackte 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 erlangt, kann er eine böswillige Kopie der DLL in diesem Ordner ablegen. Möglichkeiten zum Verhindern solcher Angriffe finden Sie unter Sicherheit der Dynamic Link-Bibliothek.

Standardsuchreihenfolge für nicht verpackte Apps

Die vom System verwendete Standard-DLL-Suchreihenfolge hängt davon ab, ob der sichere DLL-Suchmodus aktiviert ist.

Der sichere DLL-Suchmodus (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 Aufrufen der SetDllDirectory-Funktion wird der sichere DLL-Suchmodus deaktiviert (während sich der angegebene Ordner im Suchpfad befindet) und die Suchreihenfolge wie in diesem Thema beschrieben geändert.

Wenn der Suchmodus für sichere DLL aktiviert ist, lautet die Suchreihenfolge wie folgt:

  1. DLL-Umleitung.
  2. API sets.
  3. SxS manifest redirection.
  4. Loaded-module list.
  5. Known DLLs.
  6. Windows 11, Version 21H2 (10.0; Build 22000) und höher. The package dependency graph of the process. This is the application's package plus any dependencies specified as <PackageDependency> in the <Dependencies> section of the application's package manifest. Dependencies are searched in the order they appear in the manifest.
  7. Der Ordner, aus dem die Anwendung geladen wurde.
  8. Der Systemordner. Verwenden Sie die GetSystemDirectory-Funktion , um den Pfad dieses Ordners abzurufen.
  9. Der 16-Bit-Systemordner. Es gibt keine Funktion, die den Pfad dieses Ordners abruft, aber er wird durchsucht.
  10. Der Windows-Ordner. Verwenden Sie die GetWindowsDirectory-Funktion , um den Pfad dieses Ordners abzurufen.
  11. Der aktuelle Ordner.
  12. Die Verzeichnisse, die in der Umgebungsvariablen PATH aufgeführt sind. Dies schließt nicht den anwendungsspezifischen Pfad ein, der vom Registrierungsschlüssel "App-Pfade" angegeben wird. Der Schlüssel "App-Pfade " 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 der aktuelle Ordner von Position 11 an Position 8 in der Sequenz wechselt (unmittelbar nach Schritt 7). Der Ordner, aus dem die Anwendung geladen wurde.

Alternative Suchreihenfolge für nicht verpackte Apps

Um die vom System verwendete Standardsuchreihenfolge zu ändern, können Sie die LoadLibraryEx-Funktion mit LOAD_WITH_ALTERED_SEARCH_PATH aufrufen. Sie können auch die Standardsuchreihenfolge ändern, indem Sie die SetDllDirectory-Funktion aufrufen.

Hinweis

Die Standardsuchreihenfolge 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 das Verhalten fortgesetzt, bis alle zugeordneten ausführbaren Module gefunden wurden. 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_PATH und der parameter lpFileName einen absoluten Pfad angibt.

  • Die Standard-Suchstrategie beginnt (nach den ersten Schritten) im Ordner der aufrufenden Anwendung.
  • Die von LoadLibraryEx angegebene alternative Suchstrategie mit LOAD_WITH_ALTERED_SEARCH_PATH beginnt (nach den ersten Schritten) im Ordner des ausführbaren Moduls, das LoadLibraryEx lädt.

Nur so unterscheiden sie sich.

Wenn der Suchmodus für sichere DLL aktiviert ist, lautet die alternative Suchreihenfolge wie folgt:

Die Schritte 1 bis 6 entsprechen der Standardsuchreihenfolge.

  1. Der durch lpFileName angegebene Ordner.
  2. The system folder. Use the GetSystemDirectory function to retrieve the path of this folder.
  3. The 16-bit system folder. There's no function that obtains the path of this folder, but it is searched.
  4. The Windows folder. Verwenden Sie die GetWindowsDirectory-Funktion , um den Pfad dieses Ordners abzurufen.
  5. Der aktuelle Ordner.
  6. Die Verzeichnisse, die in der Umgebungsvariablen PATH aufgeführt sind. Dies schließt nicht den anwendungsspezifischen Pfad ein, der vom Registrierungsschlüssel "App-Pfade" angegeben wird. Der Schlüssel "App-Pfade " 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 an Position 8 in der Sequenz wechselt (unmittelbar nach Schritt 7. Der durch lpFileName angegebene Ordner).

Die SetDllDirectory-Funktion unterstützt eine alternative Suchreihenfolge, wenn der parameter lpPathName einen Pfad angibt. Die alternative Suchreihenfolge lautet wie folgt:

Die Schritte 1 bis 6 entsprechen der Standardsuchreihenfolge.

  1. Der Ordner, aus dem die Anwendung geladen wurde.
  2. Der durch den lpPathName-Parameter von SetDllDirectory angegebene Ordner.
  3. Der Systemordner.
  4. Der 16-Bit-Systemordner.
  5. Der Windows-Ordner.
  6. Die in der Umgebungsvariablen PATH aufgeführten Verzeichnisse.

Wenn der lpPathName-Parameter eine leere Zeichenfolge ist, entfernt der Aufruf den aktuellen Ordner aus der Suchreihenfolge.

SetDllDirectory deaktiviert effektiv den sicheren DLL-Suchmodus, während sich der angegebene Ordner im Suchpfad befindet. Um den sicheren DLL-Suchmodus basierend auf dem Registrierungswert SafeDllSearchMode wiederherzustellen und den aktuellen Ordner in der Suchreihenfolge wiederherzustellen, rufen Sie SetDllDirectory mit lpPathName als NULL auf.

Suchreihenfolge mit LOAD_LIBRARY_SEARCH Flags

Sie können eine Suchreihenfolge angeben, indem Sie mindestens ein LOAD_LIBRARY_SEARCH-Flags mit der LoadLibraryEx-Funktion verwenden. Sie können auch LOAD_LIBRARY_SEARCH Flags mit der Funktion SetDefaultDllDirectories verwenden, um eine DLL-Suchreihenfolge für einen Prozess festzulegen. Sie können zusätzliche Verzeichnisse für die Prozess-DLL-Suchreihenfolge angeben, indem Sie die Funktionen AddDllDirectory oder SetDllDirectory verwenden.

Die Verzeichnisse, die durchsucht werden, hängen von den Flags ab, die mit SetDefaultDllDirectories oder LoadLibraryEx angegeben sind. Wenn Sie mehrere Flags verwenden, werden die entsprechenden Verzeichnisse in der folgenden Reihenfolge durchsucht:

  1. 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.
  2. LOAD_LIBRARY_SEARCH_APPLICATION_DIR. Der Anwendungsordner wird durchsucht.
  3. LOAD_LIBRARY_SEARCH_USER_DIRS. Pfade, die explizit mit der AddDllDirectory-Funktion oder der SetDllDirectory-Funktion hinzugefügt wurden, werden durchsucht. Wenn Sie mehrere Pfade hinzufügen, ist die Reihenfolge, in der die Pfade durchsucht werden, nicht angegeben.
  4. LOAD_LIBRARY_SEARCH_SYSTEM32. Der Ordner System wird durchsucht.

Wenn Sie LoadLibraryEx ohne LOAD_LIBRARY_SEARCH-Flags aufrufen oder eine DLL-Suchreihenfolge für den Prozess einrichten, sucht das System nach DLLs mithilfe der Standardsuchreihenfolge oder der alternativen Suchreihenfolge.