Delen via


Zoekvolgorde voor bibliotheek met dynamische koppelingen

Het is gebruikelijk dat meerdere versies van dezelfde DLL (Dynamic Link Library) aanwezig zijn op verschillende bestandssysteemlocaties binnen een besturingssysteem (OS). U kunt bepalen vanaf welke locatie een DLL wordt geladen door een volledig pad op te geven. Maar als u deze methode niet gebruikt, zoekt het systeem tijdens de laadtijd naar de DLL, zoals beschreven in dit onderwerp. Het DLL-laadprogramma is het onderdeel van het besturingssysteem (OS) waarmee DLL's worden geladen en/of verwijzingen naar DLL's worden omgezet.

Fooi

Zie Voordelen en nadelen van het verpakken van uw app-voor definities van verpakte en uitgepakte apps.

Factoren die van invloed zijn op zoeken

Hier volgen enkele speciale zoekfactoren die in dit onderwerp worden besproken. U kunt ze beschouwen als onderdeel van de DLL-zoekvolgorde. In latere secties in dit onderwerp worden deze factoren vermeld in de juiste zoekvolgorde voor bepaalde app-typen, samen met andere zoeklocaties. In deze sectie maakt u alleen kennis met de concepten en geeft u ze namen die we later in het onderwerp gebruiken om ernaar te verwijzen.

  • DLL-omleiding. Zie dynamic-link-bibliotheekomleidingvoor meer informatie.
  • API-sets. Zie Windows-API-setsvoor meer informatie.
  • SxS-manifestomleiding naast elkaar: alleen desktop-apps (niet UWP-apps). U kunt omleiden met behulp van een toepassingsmanifest (ook wel bekend als een toepassingsmanifest naast elkaar of een samenvoegingsmanifest). Zie Manifestenvoor meer informatie.
  • loaded-module list. Het systeem kan controleren of een DLL met dezelfde modulenaam al in het geheugen is geladen (ongeacht de map waaruit het is geladen).
  • bekende DLL's. Als het DLL-bestand in de lijst met bekende DLL's staat voor de versie van Windows waarop de toepassing wordt uitgevoerd, gebruikt het systeem de kopie van de bekende DLL (en de afhankelijke DLL-DLL's van de bekende DLL, indien van toepassing). Zie de registersleutel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLsvoor een lijst met bekende DLL's op het huidige systeem.

Als een DLL afhankelijkheden bevat, zoekt het systeem naar de afhankelijke DLL's alsof ze zijn geladen met behulp van alleen hun modulenamen. Dat is waar, zelfs als de eerste DLL is geladen door een volledig pad op te geven.

Zoekvolgorde voor verpakte apps

Wanneer een verpakte app een verpakte module laadt (met name een bibliotheekmodule, een .dll bestand) door de functie LoadPackagedLibrary aan te roepen, moet de DLL in de pakketafhankelijkheidsgrafiek van het proces staan. Zie LoadPackagedLibraryvoor meer informatie. Wanneer een verpakte app een module op een andere wijze laadt en geen volledig pad opgeeft, zoekt het systeem tijdens de laadtijd naar de DLL en de bijbehorende afhankelijkheden, zoals beschreven in deze sectie.

Wanneer het systeem zoekt naar een module of de bijbehorende afhankelijkheden, gebruikt het altijd de zoekvolgorde voor verpakte apps; zelfs als een afhankelijkheid geen app-code verpakt is.

Standaardzoekvolgorde voor verpakte apps

Het systeem zoekt in deze volgorde:

  1. DLL-omleiding.
  2. API-sets.
  3. desktop-apps (niet uwp-apps). SxS-manifestomleiding.
  4. Lijst met geladen modules.
  5. Bekende DLL's.
  6. De pakketafhankelijkheidsgrafiek van het proces. Dit is het pakket van de toepassing plus eventuele afhankelijkheden die zijn opgegeven als <PackageDependency> in de sectie <Dependencies> van het pakketmanifest van de toepassing. Afhankelijkheden worden doorzocht in de volgorde waarin ze worden weergegeven in het manifest.
  7. De map waaruit het aanroepende proces is geladen (de map van het uitvoerbare bestand).
  8. De systeemmap (%SystemRoot%\system32).

Als een DLL afhankelijkheden heeft, zoekt het systeem naar de afhankelijke DLL's alsof ze zijn geladen met alleen hun modulenamen (zelfs als de eerste DLL is geladen door een volledig pad op te geven).

Alternatieve zoekvolgorde voor verpakte apps

Als een module de standaardzoekvolgorde wijzigt door de functie LoadLibraryEx aan te roepen met LOAD_WITH_ALTERED_SEARCH_PATH, is de zoekvolgorde hetzelfde als de standaardzoekvolgorde, behalve dat in stap 7 in het systeem wordt gezocht naar de map waaruit de opgegeven module is geladen (de map van de bovenlaadmodule) in plaats van de map van het uitvoerbare bestand.

Zoekvolgorde voor uitgepakte apps

Wanneer een uitgepakte app een module laadt en geen volledig pad opgeeft, zoekt het systeem tijdens het laden naar het DLL-bestand, zoals beschreven in deze sectie.

Belangrijk

Als een aanvaller controle krijgt over een van de mappen die worden doorzocht, kan het een kwaadwillende kopie van het DLL-bestand in die map plaatsen. Zie dynamic-link-bibliotheekbeveiligingvoor manieren om dergelijke aanvallen te voorkomen.

Standaardzoekvolgorde voor uitgepakte apps

De standaard-DLL-zoekvolgorde die door het systeem wordt gebruikt, is afhankelijk van of veilige DLL-zoekmodus is ingeschakeld.

De veilige DLL-zoekmodus (die standaard is ingeschakeld) verplaatst de huidige map van de gebruiker later in de zoekvolgorde. Als u de veilige DLL-zoekmodus wilt uitschakelen, maakt u de HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode registerwaarde en stelt u deze in op 0. Als u de functie SetDllDirectory aanroept, wordt de veilige DLL-zoekmodus (terwijl de opgegeven map zich in het zoekpad bevindt) uitgeschakeld en wordt de zoekvolgorde gewijzigd zoals beschreven in dit onderwerp.

Als de veilige DLL-zoekmodus is ingeschakeld, is de zoekvolgorde als volgt:

  1. DLL-omleiding.
  2. API-sets.
  3. SxS-manifestomleiding.
  4. Lijst met geladen modules.
  5. Bekende DLL's.
  6. Windows 11, versie 21H2 (10.0; Build 22000) en hoger. De pakketafhankelijkheidsgrafiek van het proces. Dit is het pakket van de toepassing plus eventuele afhankelijkheden die zijn opgegeven als <PackageDependency> in de sectie <Dependencies> van het pakketmanifest van de toepassing. Afhankelijkheden worden doorzocht in de volgorde waarin ze worden weergegeven in het manifest.
  7. De map waaruit de toepassing is geladen.
  8. De systeemmap. Gebruik de functie GetSystemDirectory om het pad van deze map op te halen.
  9. De 16-bits systeemmap. Er is geen functie die het pad van deze map verkrijgt, maar deze wordt doorzocht.
  10. De map Windows. Gebruik de functie GetWindowsDirectory om het pad van deze map op te halen.
  11. De huidige map.
  12. De mappen die worden vermeld in de omgevingsvariabele PATH. Dit omvat niet het pad per toepassing dat is opgegeven door de App-paden registersleutel. De app-paden sleutel wordt niet gebruikt bij het berekenen van het DLL-zoekpad.

Als de veilige DLL-zoekmodus is uitgeschakeld, is de zoekvolgorde hetzelfde, behalve dat de huidige map van positie 11 naar positie 8 in de reeks verplaatst (direct na stap 7). De map waaruit de toepassingheeft geladen).

Alternatieve zoekvolgorde voor uitgepakte apps

Als u de standaardzoekvolgorde wilt wijzigen die door het systeem wordt gebruikt, kunt u de functie LoadLibraryEx aanroepen met LOAD_WITH_ALTERED_SEARCH_PATH. U kunt ook de standaardzoekvolgorde wijzigen door de functie SetDllDirectory aan te roepen.

Notitie

De standaardzoekvolgorde van het proces wordt ook beïnvloed door het aanroepen van de functie SetDllDirectory in het bovenliggende proces vóór het begin van het huidige proces.

Als u een alternatieve zoekstrategie opgeeft, wordt het gedrag voortgezet totdat alle gekoppelde uitvoerbare modules zich bevinden. Nadat het systeem DLL-initialisatieroutines heeft verwerkt, keert het systeem terug naar de standaardzoekstrategie.

De functie LoadLibraryEx ondersteunt een alternatieve zoekvolgorde als de aanroep LOAD_WITH_ALTERED_SEARCH_PATHopgeeft en de parameter lpFileName een absoluut pad opgeeft.

  • De standaardzoekstrategie begint (na de eerste stappen) in de map van de aanroepende toepassing.
  • De alternatieve zoekstrategie die is opgegeven door LoadLibraryEx met LOAD_WITH_ALTERED_SEARCH_PATH begint (na de eerste stappen) in de map van de uitvoerbare module die LoadLibraryEx wordt geladen.

Dat is de enige manier waarop ze verschillen.

Als de veilige DLL-zoekmodus is ingeschakeld, is de alternatieve zoekvolgorde als volgt:

Stap 1-6 is hetzelfde als de standaardzoekvolgorde.

  1. De map die is opgegeven door lpFileName.
  2. De systeemmap. Gebruik de functie GetSystemDirectory om het pad van deze map op te halen.
  3. De 16-bits systeemmap. Er is geen functie die het pad van deze map verkrijgt, maar deze wordt doorzocht.
  4. De map Windows. Gebruik de functie GetWindowsDirectory om het pad van deze map op te halen.
  5. De huidige map.
  6. De mappen die worden vermeld in de omgevingsvariabele PATH. Dit omvat niet het pad per toepassing dat is opgegeven door de App-paden registersleutel. De app-paden sleutel wordt niet gebruikt bij het berekenen van het DLL-zoekpad.

Als de veilige DLL-zoekmodus is uitgeschakeld, is de alternatieve zoekvolgorde hetzelfde, behalve dat de huidige map van positie 11 naar positie 8 in de reeks verplaatst (direct na stap 7). De map die is opgegeven door lpFileName).

De functie SetDllDirectory ondersteunt een alternatieve zoekvolgorde als de parameter lpPathName een pad opgeeft. De alternatieve zoekvolgorde is als volgt:

Stap 1-6 is hetzelfde als de standaardzoekvolgorde.

  1. De map waaruit de toepassing is geladen.
  2. De map die is opgegeven door de parameter lpPathName van SetDllDirectory.
  3. De systeemmap.
  4. De 16-bits systeemmap.
  5. De map Windows.
  6. De mappen die worden vermeld in de omgevingsvariabele PATH.

Als de parameter lpPathName een lege tekenreeks is, verwijdert de aanroep de huidige map uit de zoekvolgorde.

SetDllDirectory de veilige DLL-zoekmodus uitschakelt terwijl de opgegeven map zich in het zoekpad bevindt. Als u de veilige DLL-zoekmodus wilt herstellen op basis van de SafeDllSearchMode registerwaarde en de huidige map wilt herstellen naar de zoekvolgorde, roept u SetDllDirectory- aan met lpPathName- als NULL.

Zoekvolgorde met behulp van LOAD_LIBRARY_SEARCH vlaggen

U kunt een zoekvolgorde opgeven met behulp van een of meer LOAD_LIBRARY_SEARCH vlaggen met de functie LoadLibraryEx. U kunt ook LOAD_LIBRARY_SEARCH vlaggen gebruiken met de functie SetDefaultDllDirectories om een DLL-zoekvolgorde voor een proces tot stand te brengen. U kunt extra mappen opgeven voor de zoekvolgorde van het DLL-proces met behulp van de functies AddDllDirectory of SetDllDirectory.

De mappen die worden doorzocht, zijn afhankelijk van de vlaggen die zijn opgegeven met SetDefaultDllDirectories of LoadLibraryEx. Als u meer dan één vlag gebruikt, worden de bijbehorende mappen in deze volgorde doorzocht:

  1. LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR. De map met het DLL-bestand wordt doorzocht. Deze map wordt alleen doorzocht op afhankelijkheden van het DLL-bestand dat moet worden geladen.
  2. LOAD_LIBRARY_SEARCH_APPLICATION_DIR. De toepassingsmap wordt doorzocht.
  3. LOAD_LIBRARY_SEARCH_USER_DIRS. Paden die expliciet zijn toegevoegd met de functie AddDllDirectory of de functie SetDllDirectory worden doorzocht. Als u meer dan één pad toevoegt, wordt de volgorde waarin de paden worden doorzocht niet opgegeven.
  4. LOAD_LIBRARY_SEARCH_SYSTEM32. De map Systeem wordt doorzocht.

Als u LoadLibraryEx zonder LOAD_LIBRARY_SEARCH vlaggen aanroept of als u een DLL-zoekvolgorde voor het proces tot stand brengt, zoekt het systeem naar DLL's met behulp van de standaardzoekvolgorde of de alternatieve zoekvolgorde.