Sdílet prostřednictvím


Pořadí hledání v knihovně dynamického propojení

Je běžné, že v různých umístěních systému souborů v operačním systému (OS) existuje více verzí stejné dynamické knihovny (DLL). Můžete můžete řídit konkrétní umístění, ze kterého je načtena jakákoli daná knihovna DLL zadáním úplné cesty. Pokud ale tuto metodu nepoužíváte, systém vyhledá knihovnu DLL v době načtení, jak je popsáno v tomto tématu. Zavaděč knihovny DLL je součástí operačního systému, který načítá knihovny DLL a/nebo překládá odkazy na knihovny DLL.

Spropitné

Definice zabalených a rozbalených aplikací najdete v tématu Výhody a nevýhody baleníaplikace .

Faktory, které ovlivňují vyhledávání

Tady jsou některé speciální faktory vyhledávání, které jsou popsány v tomto tématu – můžete je považovat za součást pořadí hledání knihovny DLL. Další části tohoto tématu obsahují tyto faktory v příslušném pořadí hledání pro určité typy aplikací společně s dalšími umístěními hledání. V této části se seznámíte s koncepty a pojmenujeme je, abychom je později v tématu pojmenovali.

  • přesměrování knihovny DLL. Podrobnosti najdete v tématu přesměrování knihovny dynamic-link.
  • sady rozhraní API . Podrobnosti najdete v tématu sady rozhraní API systému Windows.
  • souběžné přesměrování manifestu (SxS)– jenom desktopové aplikace (ne aplikace pro UPW). Přesměrování můžete provést pomocí manifestu aplikace (označovaného také jako manifest aplikace vedle sebe nebo fúzního manifestu). Podrobnosti naleznete v manifesty.
  • seznam načtených modulů. Systém může zkontrolovat, zda je knihovna DLL se stejným názvem modulu již načtena do paměti (bez ohledu na to, ze které složky byla načtena).
  • známých knihoven DLL. Pokud je knihovna DLL v seznamu známých knihoven DLL pro verzi Systému Windows, na které je aplikace spuštěna, použije systém jeho kopii známé knihovny DLL (a známé knihovny DLL závislé knihovny DLL, pokud existuje). Seznam známých knihoven DLL v aktuálním systému naleznete v klíči registru HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs.

Pokud knihovna DLL obsahuje závislosti, systém vyhledá závislé knihovny DLL, jako by byly načteny pouze pomocí názvů modulů. To platí i v případě, že první knihovna DLL byla načtena zadáním úplné cesty.

Pořadí hledání zabalených aplikací

Když zabalená aplikace načte zabalený modul (konkrétně modul knihovny – soubor .dll) voláním funkce LoadPackagedLibrary, musí být knihovna DLL v grafu závislostí balíčku procesu. Další informace naleznete v tématu LoadPackagedLibrary. Když zabalená aplikace načte modul jiným způsobem a nezadá úplnou cestu, systém vyhledá knihovnu DLL a její závislosti v době načtení, jak je popsáno v této části.

Když systém hledá modul nebo jeho závislosti, vždy používá pořadí vyhledávání pro zabalené aplikace; i v případě, že závislost není zabalený kód aplikace.

Standardní pořadí vyhledávání pro zabalené aplikace

Systém hledá v tomto pořadí:

  1. Přesměrování knihovny DLL.
  2. Sady rozhraní API.
  3. desktopové aplikace (ne aplikace pro UPW). Přesměrování manifestu SxS
  4. Seznam načtených modulů
  5. Známé knihovny DLL.
  6. Graf závislostí balíčku procesu Jedná se o balíček aplikace a všechny závislosti zadané jako <PackageDependency> v <Dependencies> části manifestu balíčku aplikace. Závislosti se prohledávají v pořadí, v jakém se zobrazí v manifestu.
  7. Složka, ze které byl volající proces načten (složka spustitelného souboru).
  8. Systémová složka (%SystemRoot%\system32).

Pokud knihovna DLL obsahuje závislosti, systém vyhledá závislé knihovny DLL, jako by byly načteny pouze s názvy modulů (i když první knihovna DLL byla načtena zadáním úplné cesty).

Alternativní pořadí hledání pro zabalené aplikace

Pokud modul změní standardní pořadí hledání voláním funkce LoadLibraryEx s LOAD_WITH_ALTERED_SEARCH_PATH, pořadí hledání je stejné jako standardní pořadí hledání s tím rozdílem, že v kroku 7 systém prohledá složku, ze které byl zadaný modul načten (složka modulu s nejvyšším načítáním) místo složky spustitelného souboru.

Pořadí hledání pro rozbalené aplikace

Když rozbalená aplikace načte modul a nezadá úplnou cestu, systém vyhledá knihovnu DLL v době načtení, jak je popsáno v této části.

Důležitý

Pokud útočník získá kontrolu nad jednou z hledaných adresářů, může do této složky umístit škodlivou kopii knihovny DLL. Způsoby, jak takovým útokům zabránit, najdete v tématu zabezpečení knihovny Dynamic-Link .

Standardní pořadí vyhledávání pro rozbalené aplikace

Standardní pořadí vyhledávání knihovny DLL používané systémem závisí na tom, zda je bezpečný režim vyhledávání DLL je povolen.

Režim bezpečného vyhledávání dll (který je ve výchozím nastavení povolený) přesune aktuální složku uživatele později v pořadí hledání. Chcete-li zakázat bezpečný režim vyhledávání knihovny DLL, vytvořte hodnotu registru HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode a nastavte ji na hodnotu 0. Volání SetDllDirectory funkce efektivně zakáže bezpečný režim hledání dll (zatímco zadaná složka je ve vyhledávací cestě) a změní pořadí hledání, jak je popsáno v tomto tématu.

Pokud je povolený nouzový režim vyhledávání dll, pořadí hledání je následující:

  1. Přesměrování knihovny DLL.
  2. Sady rozhraní API.
  3. Přesměrování manifestu SxS
  4. Seznam načtených modulů
  5. Známé knihovny DLL.
  6. Windows 11 verze 21H2 (10.0; Build 22000) a novější. Graf závislostí balíčku procesu Jedná se o balíček aplikace a všechny závislosti zadané jako <PackageDependency> v <Dependencies> části manifestu balíčku aplikace. Závislosti se prohledávají v pořadí, v jakém se zobrazí v manifestu.
  7. Složka, ze které se aplikace načetla.
  8. Systémová složka. Pomocí funkce GetSystemDirectory načtěte cestu k této složce.
  9. 16bitová systémová složka. Neexistuje žádná funkce, která získá cestu k této složce, ale vyhledá se.
  10. Složka Windows. K získání cesty k této složce použijte funkci GetWindowsDirectory.
  11. Aktuální složka.
  12. Adresáře uvedené v proměnné prostředí PATH. Nezahrnuje cestu pro jednotlivé aplikace zadanou cestami aplikace klíč registru. Cesty aplikace klíč se nepoužívá při výpočtu cesty hledání knihovny DLL.

Pokud je režim bezpečného vyhledávání dll zakázáno, pořadí hledání je stejné s tím rozdílem, že aktuální složka se přesune z pozice 11 do pozice 8 v posloupnosti (bezprostředně po kroku 7. Složka, ze které aplikace načetla).

Alternativní pořadí hledání pro rozbalené aplikace

Chcete-li změnit standardní pořadí vyhledávání používané systémem, můžete volat funkci LoadLibraryEx s LOAD_WITH_ALTERED_SEARCH_PATH. Standardní pořadí vyhledávání můžete změnit také voláním funkce SetDllDirectory.

Poznámka

Standardní pořadí vyhledávání procesu bude ovlivněno také voláním funkce SetDllDirectory v nadřazeném procesu před začátkem aktuálního procesu.

Pokud zadáte alternativní strategii vyhledávání, bude její chování pokračovat, dokud nebudou nalezeny všechny přidružené spustitelné moduly. Jakmile systém začne zpracovávat rutiny inicializace knihovny DLL, systém se vrátí ke standardní strategii vyhledávání.

Funkce LoadLibraryEx podporuje alternativní pořadí hledání, pokud volání určuje LOAD_WITH_ALTERED_SEARCH_PATHa parametr lpFileName určuje absolutní cestu.

  • Standardní strategie vyhledávání začíná (po počátečních krocích) ve složce volající aplikace.
  • Alternativní strategie vyhledávání určená LoadLibraryEx s LOAD_WITH_ALTERED_SEARCH_PATH začíná (po počátečních krocích) ve složce spustitelného modulu, který LoadLibraryEx načítá.

To je jediný způsob, jak se liší.

Pokud je povolený nouzový režim vyhledávání dll, alternativní pořadí hledání je následující:

Kroky 1 až 6 jsou stejné jako standardní pořadí hledání.

  1. Složka určená lpFileName.
  2. Systémová složka. Pomocí funkce GetSystemDirectory načtěte cestu k této složce.
  3. 16bitová systémová složka. Neexistuje žádná funkce, která získá cestu k této složce, ale vyhledá se.
  4. Složka Windows. K získání cesty k této složce použijte funkci GetWindowsDirectory.
  5. Aktuální složka.
  6. Adresáře uvedené v proměnné prostředí PATH. Nezahrnuje cestu pro jednotlivé aplikace zadanou cestami aplikace klíč registru. Cesty aplikace klíč se nepoužívá při výpočtu cesty hledání knihovny DLL.

Pokud je režim bezpečného vyhledávání DLL zakázán, je alternativní pořadí vyhledávání stejné s tím rozdílem, že aktuální složka se přesune z pozice 11 do pozice 8 v pořadí (bezprostředně po kroku 7. Složka určená lpFileName).

Funkce SetDllDirectory podporuje alternativní pořadí hledání, pokud parametr lpPathName určuje cestu. Alternativní pořadí hledání je následující:

Kroky 1 až 6 jsou stejné jako standardní pořadí hledání.

  1. Složka, ze které se aplikace načetla.
  2. Složka určená parametrem lpPathNameSetDllDirectory.
  3. Systémová složka.
  4. 16bitová systémová složka.
  5. Složka Windows.
  6. Adresáře uvedené v proměnné prostředí PATH.

Pokud je parametr lpPathName prázdný řetězec, volání odebere aktuální složku z pořadí hledání.

SetDllDirectory efektivně zakáže bezpečný režim vyhledávání dll, zatímco zadaná složka je ve vyhledávací cestě. Chcete-li obnovit bezpečný vyhledávací režim knihovny DLL na základě SafeDllSearchMode hodnoty registru a obnovit aktuální složku do pořadí hledání, zavolejte SetDllDirectory s lpPathName null.

Pořadí hledání pomocí příznaků LOAD_LIBRARY_SEARCH

Pořadí hledání můžete zadat pomocí jednoho nebo více příznaků LOAD_LIBRARY_SEARCH pomocí funkce LoadLibraryEx. Můžete také použít LOAD_LIBRARY_SEARCH příznaky s funkcí SetDefaultDllDirectories k vytvoření pořadí hledání knihovny DLL pro proces. Další adresáře pro pořadí hledání knihovny DLL procesu můžete zadat pomocí AddDllDirectory nebo SetDllDirectory funkcí.

Prohledány adresáře závisí na příznakech zadaných pomocí SetDefaultDllDirectories nebo LoadLibraryEx. Pokud použijete více příznaků, budou v tomto pořadí prohledávat odpovídající adresáře:

  1. LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR. Vyhledá se složka, která obsahuje knihovnu DLL. Tato složka se vyhledá pouze pro závislosti knihovny DLL, které se mají načíst.
  2. LOAD_LIBRARY_SEARCH_APPLICATION_DIR. Prohledá se složka aplikace.
  3. LOAD_LIBRARY_SEARCH_USER_DIRS. Cesty explicitně přidané pomocí funkce AddDllDirectory nebo funkce SetDllDirectory se prohledávají. Pokud přidáte více než jednu cestu, pořadí, ve kterém se cesty prohledávají, není zadané.
  4. LOAD_LIBRARY_SEARCH_SYSTEM32. Vyhledá se systémová složka.

Pokud voláte LoadLibraryEx bez příznaků LOAD_LIBRARY_SEARCH, nebo vytvoříte pořadí hledání knihovny DLL pro tento proces, systém vyhledá knihovny DLL pomocí standardního pořadí vyhledávání nebo alternativního pořadí hledání.