Sökordning för dynamiskt länkbibliotek
Det är vanligt att flera versioner av samma DLL (Dynamic Link Library) finns på olika filsystemplatser i ett operativsystem (OS). Du kan styra den specifika plats från vilken en viss DLL läses in genom att ange en fullständig sökväg. Men om du inte använder den metoden söker systemet efter DLL vid belastningstillfället enligt beskrivningen i det här avsnittet. Den DLL-inläsaren är den del av operativsystemet (OS) som läser in DLL:er och/eller löser referenser till DLL:er.
Dricks
Definitioner av paketerade och uppackade appar finns i Fördelar och nackdelar med att paketera din app.
Faktorer som påverkar sökning
Här följer några särskilda sökfaktorer som beskrivs i det här avsnittet– du kan betrakta dem som en del av DLL-sökordningen. Senare avsnitt i det här avsnittet visar dessa faktorer i lämplig sökordning för vissa apptyper, tillsammans med andra sökplatser. Det här avsnittet är bara att introducera begreppen och ge dem namn som vi använder för att referera till dem senare i ämnet.
- DLL-omdirigering. Mer information finns i omdirigering av dynamiskt länkbibliotek.
- API-uppsättningar. Mer information finns i Windows API-uppsättningar.
- omdirigering av SxS-manifest (sida vid sida)– endast skrivbordsappar (inte UWP-appar). Du kan omdirigera med hjälp av ett programmanifest (även kallat ett programmanifest sida vid sida eller ett fusionsmanifest). Mer information finns i Manifest.
- lista över inlästa moduler. Systemet kan kontrollera om en DLL med samma modulnamn redan har lästs in i minnet (oavsett vilken mapp den lästes in från).
-
kända DLL:er. Om DLL-filen finns med i listan över kända DLL:er för den version av Windows som programmet körs på använder systemet sin kopia av den kända DLL:en (och kända DLL:er beroende DLL:er, om några). En lista över kända DLL:er i det aktuella systemet finns i registernyckeln
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
.
Om en DLL har beroenden söker systemet efter de beroende DLL:erna som om de lästes in med hjälp av endast deras modulnamn. Det stämmer även om den första DLL:en lästes in genom att ange en fullständig sökväg.
Sökordning för paketerade appar
När en paketerad app läser in en paketerad modul (specifikt en biblioteksmodul – en .dll
fil) genom att anropa funktionen LoadPackagedLibrary måste DLL-filen finnas i processens paketberoendediagram. Mer information finns i LoadPackagedLibrary. När en paketerad app läser in en modul på annat sätt och inte anger en fullständig sökväg, söker systemet efter DLL och dess beroenden vid belastningen enligt beskrivningen i det här avsnittet.
När systemet söker efter en modul eller dess beroenden använder det alltid sökordningen för paketerade appar. även om ett beroende inte är paketerad appkod.
Standardsökordning för paketerade appar
Systemet söker i följande ordning:
- DLL-omdirigering.
- API-uppsättningar.
- Endast skrivbordsappar (inte UWP-appar). SxS-manifestomdirigering.
- Lista över inlästa moduler.
- Kända DLL:er.
- Processens paketberoendediagram. Det här är programmets paket plus eventuella beroenden som anges som
<PackageDependency>
i avsnittet<Dependencies>
i programmets paketmanifest. Beroenden genomsöks i den ordning de visas i manifestet. - Mappen som anropsprocessen lästes in från (mappen för den körbara filen).
- Systemmappen (
%SystemRoot%\system32
).
Om en DLL har beroenden söker systemet efter beroende DLL:er som om de hade lästs in med bara sina modulnamn (även om den första DLL-filen lästes in genom att ange en fullständig sökväg).
Alternativ sökordning för paketerade appar
Om en modul ändrar standardsökordningen genom att anropa funktionen LoadLibraryEx med LOAD_WITH_ALTERED_SEARCH_PATH, är sökordningen samma som standardsökordningen, förutom att systemet i steg 7 söker i mappen som den angivna modulen lästes in från (mappen med den översta inläsningsmodulen) i stället för mappen för den körbara filen.
Sökordning för uppackade appar
När en uppackad app läser in en modul och inte anger en fullständig sökväg söker systemet efter DLL vid inläsningstid enligt beskrivningen i det här avsnittet.
Viktig
Om en angripare får kontroll över en av de kataloger som genomsöks kan den placera en skadlig kopia av DLL:n i mappen. Information om hur du kan förhindra sådana attacker finns i dynamic-link library security.
Standardsökordning för uppackade appar
Den standardsökordning för DLL som används av systemet beror på om säkert DLL-sökläge är aktiverat eller inte.
Säkert DLL-sökläge (som är aktiverat som standard) flyttar användarens aktuella mapp senare i sökordningen. Om du vill inaktivera säkert DLL-sökläge skapar du HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
registervärdet och anger det till 0. Att anropa funktionen SetDllDirectory inaktiverar effektivt säkert DLL-sökläge (medan den angivna mappen finns i sökvägen) och ändrar sökordningen enligt beskrivningen i det här avsnittet.
Om säkert DLL-sökläge är aktiverat är sökordningen följande:
- DLL-omdirigering.
- API-uppsättningar.
- SxS-manifestomdirigering.
- Lista över inlästa moduler.
- Kända DLL:er.
-
Windows 11 version 21H2 (10.0; Build 22000) och senare. Processens paketberoendediagram. Det här är programmets paket plus eventuella beroenden som anges som
<PackageDependency>
i avsnittet<Dependencies>
i programmets paketmanifest. Beroenden genomsöks i den ordning de visas i manifestet. - Mappen som programmet lästes in från.
- Systemmappen. Använd funktionen GetSystemDirectory för att hämta sökvägen till den här mappen.
- 16-bitars systemmappen. Det finns ingen funktion som hämtar sökvägen till den här mappen, men den genomsöks.
- Windows-mappen. Använd funktionen GetWindowsDirectory för att hämta sökvägen till den här mappen.
- Den aktuella mappen.
- De kataloger som visas i miljövariabeln
PATH
. Detta inkluderar inte sökvägen per program som anges av appsökvägar registernyckel. Nyckeln appsökvägar används inte vid databehandling av DLL-sökvägen.
Om säkert DLL-sökläge inaktiveratsär sökordningen densamma förutom att den aktuella mappen flyttas från position 11 till position 8 i sekvensen (omedelbart efter steg 7. Mappen som programmet lästes in från).
Alternativ sökordning för uppackade appar
Om du vill ändra standardsökordningen som används av systemet kan du anropa funktionen LoadLibraryEx med LOAD_WITH_ALTERED_SEARCH_PATH. Du kan också ändra standardsökordningen genom att anropa funktionen SetDllDirectory.
Not
Processens standardsökordning påverkas också av att anropa funktionen SetDllDirectory i den överordnade processen innan den aktuella processen startas.
Om du anger en alternativ sökstrategi fortsätter dess beteende tills alla associerade körbara moduler har hittats. När systemet börjar bearbeta DLL-initieringsrutiner återgår systemet till standardsökstrategin.
Funktionen LoadLibraryEx stöder en alternativ sökordning om anropet anger LOAD_WITH_ALTERED_SEARCH_PATHoch parametern lpFileName anger en absolut sökväg.
- Standardsökstrategin börjar (efter de första stegen) i det anropande programmets mapp.
- Den alternativa sökstrategi som anges av LoadLibraryEx med LOAD_WITH_ALTERED_SEARCH_PATH börjar (efter de första stegen) i mappen för den körbara modulen som LoadLibraryEx läses in.
Det är det enda sättet på vilket de skiljer sig åt.
Om säkert DLL-sökläge är aktiverat är den alternativa sökordningen följande:
Steg 1–6 är samma som standardsökordningen.
- Mappen som anges av lpFileName.
- Systemmappen. Använd funktionen GetSystemDirectory för att hämta sökvägen till den här mappen.
- 16-bitars systemmappen. Det finns ingen funktion som hämtar sökvägen till den här mappen, men den genomsöks.
- Windows-mappen. Använd funktionen GetWindowsDirectory för att hämta sökvägen till den här mappen.
- Den aktuella mappen.
- De kataloger som visas i miljövariabeln
PATH
. Detta inkluderar inte sökvägen per program som anges av appsökvägar registernyckel. Nyckeln appsökvägar används inte vid databehandling av DLL-sökvägen.
Om säkert DLL-sökläge är inaktiveratär den alternativa sökordningen densamma förutom att den aktuella mappen flyttas från position 11 till position 8 i sekvensen (omedelbart efter steg 7. Mappen som anges av lpFileName).
Funktionen SetDllDirectory stöder en alternativ sökordning om parametern lpPathName anger en sökväg. Den alternativa sökordningen är följande:
Steg 1–6 är samma som standardsökordningen.
- Mappen som programmet lästes in från.
- Mappen som anges av parametern lpPathName för SetDllDirectory.
- Systemmappen.
- 16-bitars systemmappen.
- Windows-mappen.
- Katalogerna som anges i miljövariabeln
PATH
.
Om parametern lpPathName är en tom sträng tar anropet bort den aktuella mappen från sökordningen.
SetDllDirectory inaktiverar effektivt säkert DLL-sökläge medan den angivna mappen finns i sökvägen. Om du vill återställa säkert DLL-sökläge baserat på registervärdet SafeDllSearchMode och återställa den aktuella mappen till sökordningen anropar du SetDllDirectory med lpPathName som NULL.
Sökordning med hjälp av LOAD_LIBRARY_SEARCH flaggor
Du kan ange en sökordning med hjälp av en eller flera LOAD_LIBRARY_SEARCH flaggor med funktionen LoadLibraryEx. Du kan också använda LOAD_LIBRARY_SEARCH flaggor med funktionen SetDefaultDllDirectories för att upprätta en DLL-sökordning för en process. Du kan ange ytterligare kataloger för process-DLL-sökordningen med hjälp av funktionerna AddDllDirectory eller SetDllDirectory.
Vilka kataloger som söks beror på flaggorna som anges med SetDefaultDllDirectories eller LoadLibraryEx. Om du använder fler än en flagga genomsöks motsvarande kataloger i följande ordning:
- LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR. Mappen som innehåller DLL-filen genomsöks. Den här mappen söks bara efter beroenden för DLL som ska läsas in.
- LOAD_LIBRARY_SEARCH_APPLICATION_DIR. Programmappen genomsöks.
- LOAD_LIBRARY_SEARCH_USER_DIRS. Sökvägar som uttryckligen har lagts till med funktionen AddDllDirectory eller funktionen SetDllDirectory genomsöks. Om du lägger till fler än en sökväg är ordningen i vilken sökvägarna genomsöks ospecificerad.
- LOAD_LIBRARY_SEARCH_SYSTEM32. Mappen System genomsöks.
Om du anropar LoadLibraryEx utan LOAD_LIBRARY_SEARCH flaggor, eller om du upprättar en DLL-sökordning för processen, söker systemet efter DLL:er med antingen standardsökordningen eller den alternativa sökordningen.