Ordine di ricerca libreria di collegamento dinamico

È comune che più versioni della stessa libreria di collegamento dinamico (DLL) esistano in percorsi diversi del file system all'interno di un sistema operativo. È possibile controllare la posizione specifica da cui viene caricata qualsiasi DLL specificata specificando un percorso completo. Tuttavia, se non si usa questo metodo, il sistema cerca la DLL in fase di caricamento, come descritto in questo argomento. Il caricatore DLL è la parte del sistema operativo che carica dll e/o risolve riferimenti alle DLL.

Suggerimento

Per le definizioni di app in pacchetto e non pacchetti, vedere Vantaggi e svantaggi della creazione di pacchetti dell'app.

Fattori che influiscono sulla ricerca

Ecco alcuni fattori di ricerca speciali illustrati in questo argomento: è possibile considerarli parte dell'ordine di ricerca DLL. Le sezioni successive di questo argomento elencano questi fattori nell'ordine di ricerca appropriato per determinati tipi di app, insieme ad altre posizioni di ricerca. Questa sezione consiste solo nell'introdurre i concetti e assegnare loro nomi che verranno usati per farvi riferimento più avanti nell'argomento.

  • Reindirizzamento DLL. Per informazioni dettagliate, vedere Reindirizzamento della libreria di collegamenti dinamici.
  • Set di API. Per informazioni dettagliate, vedere Set di API di Windows.
  • Reindirizzamento del manifesto side-by-side (SxS): app desktop solo (non app UWP). È possibile reindirizzare usando un manifesto dell'applicazione ,noto anche come manifesto dell'applicazione side-by-side o un manifesto fusion. Per informazioni dettagliate, vedere Manifesti.
  • Elenco di moduli caricati. Il sistema può verificare se una DLL con lo stesso nome del modulo è già caricato in memoria (indipendentemente dalla cartella caricata da).
  • DLL note. Se la DLL è nell'elenco delle DLL note per la versione di Windows in cui è in esecuzione l'applicazione, il sistema usa la sua copia della DLL nota (e le DLL dipendenti della DLL note, se presente). Per un elenco di DLL note nel sistema corrente, vedere la chiave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLsdel Registro di sistema .

Se una DLL ha dipendenze, il sistema cerca le DLL dipendenti come se fossero state caricate usando solo i nomi dei moduli. Questo è vero anche se la prima DLL è stata caricata specificando un percorso completo.

Ordine di ricerca per le app in pacchetto

Quando un'app in pacchetto carica un modulo in pacchetto (in particolare un modulo di libreria, un .dll file) chiamando la funzione LoadPackagedLibrary , la DLL deve trovarsi nel grafico delle dipendenze del pacchetto del processo. Per altre informazioni, vedere LoadPackagedLibrary. Quando un'app in pacchetto carica un modulo con altri mezzi e non specifica un percorso completo, il sistema cerca la DLL e le relative dipendenze in fase di caricamento, come descritto in questa sezione.

Quando il sistema cerca un modulo o le relative dipendenze, usa sempre l'ordine di ricerca per le app in pacchetto; anche se una dipendenza non è codice dell'app in pacchetto.

Ordine di ricerca standard per le app in pacchetto

Il sistema cerca in questo ordine:

  1. Reindirizzamento DLL.
  2. Set di API.
  3. Solo app desktop (non app UWP). Reindirizzamento manifesto SxS.
  4. Elenco di moduli caricati.
  5. DLL note.
  6. Grafico delle dipendenze del pacchetto del processo. Questo è il pacchetto dell'applicazione e le dipendenze specificate come <PackageDependency> nella <Dependencies> sezione del manifesto del pacchetto dell'applicazione. Le dipendenze vengono eseguite nella ricerca nell'ordine in cui vengono visualizzate nel manifesto.
  7. La cartella del processo chiamante è stata caricata dalla cartella dell'eseguibile.
  8. Cartella di sistema (%SystemRoot%\system32).

Se una DLL ha dipendenze, il sistema cerca le DLL dipendenti come se fossero state caricate con solo i nomi dei moduli(anche se la prima DLL è stata caricata specificando un percorso completo).

Ordine di ricerca alternativo per le app in pacchetto

Se un modulo modifica l'ordine di ricerca standard chiamando la funzione LoadLibraryEx con LOAD_WITH_ALTERED_SEARCH_PATH, l'ordine di ricerca è lo stesso dell'ordine di ricerca standard, ad eccezione del fatto che nel passaggio 7 il sistema cerca la cartella caricata dal modulo specificato (la cartella del modulo di caricamento superiore) anziché dalla cartella del file eseguibile.

Cercare l'ordine per le app senza pacchetti

Quando un'app non pacchetto carica un modulo e non specifica un percorso completo, il sistema cerca la DLL in fase di caricamento, come descritto in questa sezione.

Importante

Se un utente malintenzionato ottiene il controllo di una delle directory ricercate, può inserire una copia dannosa della DLL in tale cartella. Per informazioni su come prevenire tali attacchi, vedere Sicurezza della libreria a collegamento dinamico.

Ordine di ricerca standard per app senza pacchetti

L'ordine di ricerca DLL standard usato dal sistema dipende dal fatto che sia abilitata o meno la modalità di ricerca DLL sicura .

La modalità di ricerca DLL sicura (abilitata per impostazione predefinita) sposta la cartella corrente dell'utente più avanti nell'ordine di ricerca. Per disabilitare la modalità di ricerca DLL sicura, creare il valore del HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode Registro di sistema e impostarlo su 0. La chiamata alla funzione SetDllDirectory disabilita in modo efficace la modalità di ricerca DLL sicura (mentre la cartella specificata si trova nel percorso di ricerca) e modifica l'ordine di ricerca come descritto in questo argomento.

Se la modalità di ricerca DLL sicura è abilitata, l'ordine di ricerca è il seguente:

  1. Reindirizzamento DLL.
  2. API sets.
  3. SxS manifest redirection.
  4. Loaded-module list.
  5. Known DLLs.
  6. Windows 11 versione 21H2 (10.0; Build 22000) e versioni successive. 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. Cartella da cui è stata caricata l'applicazione.
  8. Cartella di sistema. Utilizzare la funzione GetSystemDirectory per recuperare il percorso di questa cartella.
  9. Cartella di sistema a 16 bit. Non esiste alcuna funzione che ottiene il percorso di questa cartella, ma viene eseguita la ricerca.
  10. Cartella Windows. Usare la funzione GetWindowsDirectory per ottenere il percorso di questa cartella.
  11. Cartella corrente.
  12. Directory elencate nella PATH variabile di ambiente. Questo non include il percorso per applicazione specificato dalla chiave del Registro di sistema Percorsi app . La chiave Percorsi app non viene usata durante il calcolo del percorso di ricerca della DLL.

Se la modalità di ricerca DLL sicura è disabilitata, l'ordine di ricerca è lo stesso, ad eccezione del fatto che la cartella corrente passa dalla posizione 11 alla posizione 8 nella sequenza (immediatamente dopo il passaggio 7). Cartella da cui è stata caricata l'applicazione.

Ordine di ricerca alternativo per app non pacchettiate

Per modificare l'ordine di ricerca standard usato dal sistema, è possibile chiamare la funzione LoadLibraryEx con LOAD_WITH_ALTERED_SEARCH_PATH. È anche possibile modificare l'ordine di ricerca standard chiamando la funzione SetDllDirectory .

Nota

L'ordine di ricerca standard del processo sarà interessato anche chiamando la funzione SetDllDirectory nel processo padre prima dell'inizio del processo corrente.

Se si specifica una strategia di ricerca alternativa, il comportamento continua fino a quando non si trovano tutti i moduli eseguibili associati. Dopo che il sistema avvia l'elaborazione delle routine di inizializzazione DLL, il sistema ripristina la strategia di ricerca standard.

La funzione LoadLibraryEx supporta un ordine di ricerca alternativo se la chiamata specifica LOAD_WITH_ALTERED_SEARCH_PATH e il parametro lpFileName specifica un percorso assoluto.

  • La strategia di ricerca standard inizia (dopo i passaggi iniziali) nella cartella dell'applicazione chiamante.
  • La strategia di ricerca alternativa specificata da LoadLibraryEx con LOAD_WITH_ALTERED_SEARCH_PATH inizia (dopo i passaggi iniziali) nella cartella del modulo eseguibile che LoadLibraryEx sta caricando.

Questo è l'unico modo in cui differiscono.

Se la modalità di ricerca DLL sicura è abilitata, l'ordine di ricerca alternativo è il seguente:

I passaggi 1-6 sono uguali all'ordine di ricerca standard.

  1. Cartella specificata da lpFileName.
  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. Usare la funzione GetWindowsDirectory per ottenere il percorso di questa cartella.
  5. Cartella corrente.
  6. Directory elencate nella PATH variabile di ambiente. Questo non include il percorso per applicazione specificato dalla chiave del Registro di sistema Percorsi app . La chiave Percorsi app non viene usata durante il calcolo del percorso di ricerca della DLL.

Se la modalità di ricerca DLL sicura è disabilitata, l'ordine di ricerca alternativo è lo stesso, ad eccezione del fatto che la cartella corrente passa dalla posizione 11 alla posizione 8 nella sequenza (immediatamente dopo il passaggio 7). Cartella specificata da lpFileName.

La funzione SetDllDirectory supporta un ordine di ricerca alternativo se il parametro lpPathName specifica un percorso. L'ordine di ricerca alternativo è il seguente:

I passaggi 1-6 sono uguali all'ordine di ricerca standard.

  1. Cartella da cui è stata caricata l'applicazione.
  2. Cartella specificata dal parametro lpPathName di SetDllDirectory.
  3. Cartella di sistema.
  4. Cartella di sistema a 16 bit.
  5. Cartella Windows.
  6. Directory elencate nella PATH variabile di ambiente.

Se il parametro lpPathName è una stringa vuota, la chiamata rimuove la cartella corrente dall'ordine di ricerca.

SetDllDirectory disabilita in modo efficace la modalità di ricerca DLL sicura mentre la cartella specificata si trova nel percorso di ricerca. Per ripristinare la modalità di ricerca DLL sicura in base al valore del Registro di sistema SafeDllSearchMode e ripristinare la cartella corrente nell'ordine di ricerca, chiamare SetDllDirectory con lpPathName come NULL.

Ordine di ricerca con flag di LOAD_LIBRARY_SEARCH

È possibile specificare un ordine di ricerca usando uno o più flag LOAD_LIBRARY_SEARCH con la funzione LoadLibraryEx . È anche possibile usare LOAD_LIBRARY_SEARCH flag con la funzione SetDefaultDllDirectories per stabilire un ordine di ricerca DLL per un processo. È possibile specificare directory aggiuntive per l'ordine di ricerca DLL del processo usando le funzioni AddDllDirectory o SetDllDirectory .

Le directory di ricerca dipendono dai flag specificati con SetDefaultDllDirectories o LoadLibraryEx. Se si usa più flag, le directory corrispondenti vengono eseguite in questo ordine:

  1. LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR. La cartella contenente la DLL viene eseguita la ricerca. Questa cartella viene cercata solo per le dipendenze della DLL da caricare.
  2. LOAD_LIBRARY_SEARCH_APPLICATION_DIR. La cartella dell'applicazione viene eseguita la ricerca.
  3. LOAD_LIBRARY_SEARCH_USER_DIRS. I percorsi aggiunti in modo esplicito con la funzione AddDllDirectory o la funzione SetDllDirectory vengono cercati. Se si aggiungono più di un percorso, l'ordine in cui vengono cercati i percorsi non è specificato.
  4. LOAD_LIBRARY_SEARCH_SYSTEM32. La cartella System viene eseguita la ricerca.

Se si chiama LoadLibraryEx senza flag LOAD_LIBRARY_SEARCH oppure si stabilisce un ordine di ricerca DLL per il processo, il sistema cerca dll usando l'ordine di ricerca standard o l'ordine di ricerca alternativo.