Ordine di ricerca della libreria a collegamento dinamico
È comune che più versioni della stessa libreria a collegamento dinamico (DLL) esistano in percorsi di file system diversi all'interno di un sistema operativo. È possibile controllare la posizione specifica da cui viene caricata una determinata DLL 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 fa parte del sistema operativo che carica dll e/o risolve i riferimenti alle DLL.
Mancia
Per le definizioni di in pacchetto e app non in pacchetto, vedi 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 come 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 a collegamento dinamico.
- API imposta. Per informazioni dettagliate, vedere set di API Windows.
- reindirizzamento del manifesto side-by-side (SxS): solo app desktop (non app UWP). È possibile reindirizzare usando un manifesto dell'applicazione (noto anche come manifesto dell'applicazione side-by-side o manifesto fusion). Per informazioni dettagliate, vedere Manifesti.
- elenco di moduli caricati. Il sistema può verificare se una DLL con lo stesso nome di modulo è già caricata in memoria (indipendentemente dalla cartella da cui è stata caricata).
-
DLL note. Se la DLL è nell'elenco di DLL note per la versione di Windows in cui è in esecuzione l'applicazione, il sistema usa la copia della DLL nota (e le DLL dipendenti della DLL note, se presenti). Per un elenco delle DLL note nel sistema corrente, vedere la chiave del Registro di sistema
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
.
Se una DLL ha dipendenze, il sistema cerca le DLL dipendenti come se fossero caricate usando solo i nomi dei moduli. Questo vale 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 file di .dll
) chiamando la funzioneLoadPackagedLibrary, 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 è un codice dell'app in pacchetto.
Ordine di ricerca standard per le app in pacchetto
Il sistema cerca in questo ordine:
- Reindirizzamento DLL.
- Set di API.
- solo app desktop (non app UWP). Reindirizzamento del manifesto SxS.
- Elenco di moduli caricati.
- DLL note.
- Grafico delle dipendenze del pacchetto del processo. Questo è il pacchetto dell'applicazione e le eventuali dipendenze specificate come
<PackageDependency>
nella sezione<Dependencies>
del manifesto del pacchetto dell'applicazione. Le dipendenze vengono cercate nell'ordine in cui vengono visualizzate nel manifesto. - La cartella da cui è stato caricato il processo chiamante (la cartella dell'eseguibile).
- Cartella di sistema (
%SystemRoot%\system32
).
Se una DLL ha dipendenze, il sistema cerca le DLL dipendenti come se fossero caricate solo con i relativi nomi di modulo (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 è uguale all'ordine di ricerca standard, ad eccezione del fatto che nel passaggio 7 il sistema cerca nella cartella da cui è stato caricato il modulo specificato (la cartella del modulo di caricamento superiore) anziché dalla cartella dell'eseguibile.
Ordine di ricerca per le app non in pacchetto
Quando un'app non in 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 in cui viene eseguita la ricerca, 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 le app non in pacchetto
L'ordine di ricerca DLL standard usato dal sistema dipende dal fatto che sia abilitata o meno modalità di ricerca DLL sicura.
La modalità di ricerca DLL sicura (abilitata per impostazione predefinita) sposta la cartella corrente dell'utente in un secondo momento nell'ordine di ricerca. Per disabilitare la modalità di ricerca DLL sicura, creare il valore del Registro di sistema HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
e impostarlo su 0. La chiamata alla funzione SetDllDirectory disabilita in modo efficace la modalità di ricerca dll sicura (mentre la cartella specificata è 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:
- Reindirizzamento DLL.
- Set di API.
- Reindirizzamento del manifesto SxS.
- Elenco di moduli caricati.
- DLL note.
-
Windows 11 versione 21H2 (10.0; Build 22000) e versioni successive. Grafico delle dipendenze del pacchetto del processo. Questo è il pacchetto dell'applicazione e le eventuali dipendenze specificate come
<PackageDependency>
nella sezione<Dependencies>
del manifesto del pacchetto dell'applicazione. Le dipendenze vengono cercate nell'ordine in cui vengono visualizzate nel manifesto. - Cartella da cui è stata caricata l'applicazione.
- Cartella di sistema. Usare la funzioneGetSystemDirectoryper recuperare il percorso di questa cartella.
- Cartella di sistema a 16 bit. Non esiste alcuna funzione che ottiene il percorso di questa cartella, ma viene eseguita la ricerca.
- Cartella Di Windows. Usare la funzioneGetWindowsDirectoryper ottenere il percorso di questa cartella.
- Cartella corrente.
- Directory elencate nella variabile di ambiente
PATH
. Questo non include il percorso per applicazione specificato dalla chiave del Registro di sistema Percorsi app. La chiave percorsi dell'app non viene usata durante il calcolo del percorso di ricerca 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 l'applicazione ha caricato).
Ordine di ricerca alternativo per le app non in pacchetto
Per modificare l'ordine di ricerca standard usato dal sistema, è possibile chiamare la funzioneLoadLibraryExcon 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 relativo comportamento continua fino a quando non si trovano tutti i moduli eseguibili associati. Dopo l'avvio dell'elaborazione delle routine di inizializzazione dll, il sistema ripristina la strategia di ricerca standard.
La funzioneLoadLibraryExsupporta un ordine di ricerca alternativo se la chiamata specifica LOAD_WITH_ALTERED_SEARCH_PATHe 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 è in corso il caricamento.
Questo è l'unico modo in cui differiscono.
Se la modalità di ricerca DLL sicura è abilitata, l'ordine di ricerca alternativo è il seguente:
I passaggi da 1 a 6 corrispondono all'ordine di ricerca standard.
- Cartella specificata da lpFileName.
- Cartella di sistema. Usare la funzioneGetSystemDirectoryper recuperare il percorso di questa cartella.
- Cartella di sistema a 16 bit. Non esiste alcuna funzione che ottiene il percorso di questa cartella, ma viene eseguita la ricerca.
- Cartella Di Windows. Usare la funzioneGetWindowsDirectoryper ottenere il percorso di questa cartella.
- Cartella corrente.
- Directory elencate nella variabile di ambiente
PATH
. Questo non include il percorso per applicazione specificato dalla chiave del Registro di sistema Percorsi app. La chiave percorsi dell'app non viene usata durante il calcolo del percorso di ricerca dll.
Se la modalità di ricerca DLL sicura è disabilitata, l'ordine di ricerca alternativo è lo stesso, ad eccezione del fatto che la cartella corrente si sposta 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 da 1 a 6 corrispondono all'ordine di ricerca standard.
- Cartella da cui è stata caricata l'applicazione.
- Cartella specificata dal parametro lpPathName di SetDllDirectory.
- Cartella di sistema.
- Cartella di sistema a 16 bit.
- Cartella Di Windows.
- Directory elencate nella variabile di ambiente
PATH
.
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 SafeDllSearchMode e ripristinare la cartella corrente nell'ordine di ricerca, chiamare SetDllDirectory con lpPathName come NULL.
Ordine di ricerca con flag LOAD_LIBRARY_SEARCH
È possibile specificare un ordine di ricerca usando uno o più flag di LOAD_LIBRARY_SEARCH con la funzioneLoadLibraryEx. È anche possibile usare flag LOAD_LIBRARY_SEARCH con la funzione SetDefaultDllDirectories per stabilire un ordine di ricerca DLL per un processo. È possibile specificare altre directory per l'ordine di ricerca dll del processo usando le funzioni diAddDllDirectoryo setDllDirectory.
Le directory in cui viene eseguita la ricerca dipendono dai flag specificati con SetDefaultDllDirectories o LoadLibraryEx. Se si utilizzano più flag, le directory corrispondenti vengono cercate in questo ordine:
- LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR. Viene eseguita la ricerca nella cartella contenente la DLL. Questa cartella viene cercata solo per le dipendenze della DLL da caricare.
- LOAD_LIBRARY_SEARCH_APPLICATION_DIR. Viene eseguita la ricerca nella cartella dell'applicazione.
- LOAD_LIBRARY_SEARCH_USER_DIRS. I percorsi aggiunti in modo esplicito con la funzioneAddDllDirectoryo la funzioneSetDllDirectoryvengono cercati. Se si aggiungono più percorsi, l'ordine in cui vengono cercati i percorsi non è specificato.
- LOAD_LIBRARY_SEARCH_SYSTEM32. Viene eseguita la ricerca nella cartella System.
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.
Argomenti correlati
- registrazione dell'applicazione
- reindirizzamento della libreria a collegamento dinamico
- di sicurezza della libreria a collegamento dinamico
- componenti side-by-side
- AddDllDirectory
- loadLibrary
- LoadLibraryEx
- loadPackagedLibrary
- SetDefaultDllDirectories
- SetDllDirectory