Ordre de recherche de la bibliothèque de liens dynamiques

Il est courant que plusieurs versions de la même bibliothèque de liens dynamiques (DLL) existent dans différents emplacements de système de fichiers au sein d’un système d’exploitation. Vous pouvez contrôler l’emplacement spécifique à partir duquel une DLL donnée est chargée en spécifiant un chemin d’accès complet. Mais si vous n’utilisez pas cette méthode, le système recherche la DLL au moment du chargement, comme décrit dans cette rubrique. Le chargeur DLL est la partie du système d’exploitation qui charge les DLL et/ou résout les références aux DLL.

Conseil

Pour les définitions des applications empaquetées et non empaquetées , consultez Avantages et inconvénients de l’empaquetage de votre application.

Facteurs qui affectent la recherche

Voici quelques facteurs de recherche spéciaux qui sont abordés dans cette rubrique. Vous pouvez les considérer comme faisant partie de l’ordre de recherche de DLL. Les sections ultérieures de cette rubrique répertorient ces facteurs dans l’ordre de recherche approprié pour certains types d’applications, ainsi que d’autres emplacements de recherche. Cette section est simplement destinée à présenter les concepts et à leur donner des noms que nous utiliserons pour y faire référence plus loin dans la rubrique.

  • Redirection de DLL. Pour plus d’informations, consultez Redirection de bibliothèque de liens dynamiques.
  • Ensembles d’API. Pour plus d’informations, consultez Ensembles d’API Windows.
  • Redirection de manifeste côte à côte (SxS) : applications de bureau uniquement (pas les applications UWP). Vous pouvez effectuer la redirection à l’aide d’un manifeste d’application (également appelé manifeste d’application côte à côte ou manifeste fusion). Pour plus d’informations, consultez Manifestes.
  • Liste des modules chargés. Le système peut vérifier si une DLL portant le même nom de module est déjà chargée en mémoire (quel que soit le dossier à partir duquel elle a été chargée).
  • DLL connues. Si la DLL figure dans la liste des DLL connues pour la version de Windows sur laquelle l’application s’exécute, le système utilise sa copie de la DLL connue (et les DLL dépendantes de la DLL connue, le cas échéant). Pour obtenir la liste des DLL connues sur le système actuel, consultez la clé HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLsde Registre .

Si une DLL a des dépendances, le système recherche les DLL dépendantes comme si elles avaient été chargées en utilisant uniquement leurs noms de module. Cela est vrai même si la première DLL a été chargée en spécifiant un chemin d’accès complet.

Ordre de recherche pour les applications empaquetées

Lorsqu’une application empaquetée charge un module empaqueté (en particulier, un module de bibliothèque, un .dll fichier) en appelant la fonction LoadPackagedLibrary , la DLL doit se trouver dans le graphique de dépendances de package du processus. Pour plus d’informations, consultez LoadPackagedLibrary. Lorsqu’une application empaquetée charge un module par d’autres moyens et ne spécifie pas de chemin d’accès complet, le système recherche la DLL et ses dépendances au moment du chargement, comme décrit dans cette section.

Lorsque le système recherche un module ou ses dépendances, il utilise toujours l’ordre de recherche pour les applications empaquetées ; même si une dépendance n’est pas empaquetée du code d’application.

Ordre de recherche standard pour les applications empaquetées

Le système recherche dans cet ordre :

  1. Redirection de DLL.
  2. Ensembles d’API.
  3. Applications de bureau uniquement (pas les applications UWP). Redirection de manifeste SxS.
  4. Liste des modules chargés.
  5. DLL connues.
  6. Graphique de dépendance de package du processus. Il s’agit du package de l’application, ainsi que des dépendances spécifiées comme <PackageDependency> dans la <Dependencies> section du manifeste du package de l’application. Les dépendances sont recherchées dans l’ordre dans lequel elles apparaissent dans le manifeste.
  7. Dossier à partir duquel le processus appelant a été chargé (dossier de l’exécutable).
  8. Dossier système (%SystemRoot%\system32).

Si une DLL a des dépendances, le système recherche les DLL dépendantes comme si elles étaient chargées uniquement avec leurs noms de module (même si la première DLL a été chargée en spécifiant un chemin d’accès complet).

Autre ordre de recherche pour les applications empaquetées

Si un module modifie l’ordre de recherche standard en appelant la fonction LoadLibraryEx avec LOAD_WITH_ALTERED_SEARCH_PATH, l’ordre de recherche est identique à l’ordre de recherche standard, sauf qu’à l’étape 7, le système recherche le dossier à partir duquel le module spécifié a été chargé (dossier du module de chargement supérieur) au lieu du dossier de l’exécutable.

Ordre de recherche pour les applications non empaquetées

Lorsqu’une application non empaquetée charge un module et ne spécifie pas de chemin d’accès complet, le système recherche la DLL au moment du chargement, comme décrit dans cette section.

Important

Si un attaquant prend le contrôle de l’un des répertoires recherchés, il peut placer une copie malveillante de la DLL dans ce dossier. Pour savoir comment empêcher de telles attaques, consultez Sécurité des bibliothèques de liens dynamiques.

Ordre de recherche standard pour les applications non empaquetées

L’ordre de recherche de DLL standard utilisé par le système dépend de l’activation ou non du mode de recherche de DLL sans échec .

Le mode de recherche dll sans échec (qui est activé par défaut) déplace le dossier actuel de l’utilisateur plus tard dans l’ordre de recherche. Pour désactiver le mode de recherche de DLL sans échec, créez la valeur de HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode Registre et définissez-la sur 0. L’appel de la fonction SetDllDirectory désactive efficacement le mode de recherche de DLL sans échec (alors que le dossier spécifié se trouve dans le chemin de recherche) et modifie l’ordre de recherche comme décrit dans cette rubrique.

Si le mode de recherche dll sans échec est activé, l’ordre de recherche est le suivant :

  1. Redirection DE DLL.
  2. API sets.
  3. SxS manifest redirection.
  4. Loaded-module list.
  5. Known DLLs.
  6. Windows 11, version 21H2 (10.0; Build 22000), et versions ultérieures. 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. Dossier à partir duquel l’application a été chargée.
  8. Dossier système. Utilisez la fonction GetSystemDirectory pour récupérer le chemin d’accès de ce dossier.
  9. Dossier système 16 bits. Aucune fonction n’obtient le chemin d’accès de ce dossier, mais elle fait l’objet d’une recherche.
  10. Dossier Windows. Utilisez la fonction GetWindowsDirectory pour obtenir le chemin d’accès de ce dossier.
  11. Dossier actif.
  12. Répertoires répertoriés dans la variable d’environnement PATH . Cela n’inclut pas le chemin d’accès par application spécifié par la clé de Registre Chemins d’accès aux applications. La clé Chemins d’accès de l’application n’est pas utilisée lors du calcul du chemin de recherche dll.

Si le mode de recherche de DLL sans échec est désactivé, l’ordre de recherche est le même, sauf que le dossier actif passe de la position 11 à la position 8 dans la séquence (immédiatement après l’étape 7). Dossier à partir duquel l’application a chargé).

Autre ordre de recherche pour les applications non empaquetées

Pour modifier l’ordre de recherche standard utilisé par le système, vous pouvez appeler la fonction LoadLibraryEx avec LOAD_WITH_ALTERED_SEARCH_PATH. Vous pouvez également modifier l’ordre de recherche standard en appelant la fonction SetDllDirectory .

Notes

L’ordre de recherche standard du processus sera également affecté par l’appel de la fonction SetDllDirectory dans le processus parent avant le début du processus actuel.

Si vous spécifiez une autre stratégie de recherche, son comportement continue jusqu’à ce que tous les modules exécutables associés aient été localisés. Une fois que le système a commencé à traiter les routines d’initialisation de DLL, le système revient à la stratégie de recherche standard.

La fonction LoadLibraryEx prend en charge un autre ordre de recherche si l’appel spécifie LOAD_WITH_ALTERED_SEARCH_PATH et si le paramètre lpFileName spécifie un chemin absolu.

  • La stratégie de recherche standard commence (après les étapes initiales) dans le dossier de l’application appelante.
  • La stratégie de recherche alternative spécifiée par LoadLibraryEx avec LOAD_WITH_ALTERED_SEARCH_PATH commence (après les étapes initiales) dans le dossier du module exécutable que LoadLibraryEx est en cours de chargement.

C’est la seule façon dont ils diffèrent.

Si le mode de recherche dll sans échec est activé, l’autre ordre de recherche est le suivant :

Les étapes 1 à 6 sont identiques à l’ordre de recherche standard.

  1. Dossier spécifié par 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. Utilisez la fonction GetWindowsDirectory pour obtenir le chemin d’accès de ce dossier.
  5. Dossier actif.
  6. Répertoires répertoriés dans la variable d’environnement PATH . Cela n’inclut pas le chemin d’accès par application spécifié par la clé de Registre Chemins d’accès d’application . La clé Chemins d’accès de l’application n’est pas utilisée lors du calcul du chemin de recherche dll.

Si le mode de recherche dll sans échec est désactivé, l’ordre de recherche de remplacement est le même, sauf que le dossier actif passe de la position 11 à la position 8 dans la séquence (immédiatement après l’étape 7. Dossier spécifié par lpFileName).

La fonction SetDllDirectory prend en charge un autre ordre de recherche si le paramètre lpPathName spécifie un chemin d’accès. L’ordre de recherche de remplacement est le suivant :

Les étapes 1 à 6 sont identiques à l’ordre de recherche standard.

  1. Dossier à partir duquel l’application a été chargée.
  2. Dossier spécifié par le paramètre lpPathName de SetDllDirectory.
  3. Dossier système.
  4. Dossier système 16 bits.
  5. Dossier Windows.
  6. Répertoires répertoriés dans la variable d’environnement PATH .

Si le paramètre lpPathName est une chaîne vide, l’appel supprime le dossier actif de l’ordre de recherche.

SetDllDirectory désactive efficacement le mode de recherche de DLL sans échec lorsque le dossier spécifié se trouve dans le chemin de recherche. Pour restaurer le mode de recherche DLL sans échec en fonction de la valeur de Registre SafeDllSearchMode et restaurer le dossier actif dans l’ordre de recherche, appelez SetDllDirectory avec lpPathName comme NULL.

Ordre de recherche à l’aide d’indicateurs de LOAD_LIBRARY_SEARCH

Vous pouvez spécifier un ordre de recherche à l’aide d’un ou plusieurs indicateurs LOAD_LIBRARY_SEARCH avec la fonction LoadLibraryEx . Vous pouvez également utiliser LOAD_LIBRARY_SEARCH indicateurs avec la fonction SetDefaultDllDirectories pour établir un ordre de recherche DLL pour un processus. Vous pouvez spécifier des répertoires supplémentaires pour l’ordre de recherche de dll de processus à l’aide des fonctions AddDllDirectory ou SetDllDirectory .

Les répertoires recherchés dépendent des indicateurs spécifiés avec SetDefaultDllDirectories ou LoadLibraryEx. Si vous utilisez plusieurs indicateurs, les répertoires correspondants sont recherchés dans cet ordre :

  1. LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR. Le dossier qui contient la DLL fait l’objet d’une recherche. Ce dossier est recherché uniquement pour les dépendances de la DLL à charger.
  2. LOAD_LIBRARY_SEARCH_APPLICATION_DIR. Le dossier d’application fait l’objet d’une recherche.
  3. LOAD_LIBRARY_SEARCH_USER_DIRS. Les chemins d’accès explicitement ajoutés avec la fonction AddDllDirectory ou la fonction SetDllDirectory font l’objet d’une recherche. Si vous ajoutez plusieurs chemins d’accès, l’ordre dans lequel les chemins sont recherchés n’est pas spécifié.
  4. LOAD_LIBRARY_SEARCH_SYSTEM32. Le dossier Système fait l’objet d’une recherche.

Si vous appelez LoadLibraryEx sans indicateur LOAD_LIBRARY_SEARCH , ou si vous établissez un ordre de recherche DLL pour le processus, le système recherche des DLL à l’aide de l’ordre de recherche standard ou de l’ordre de recherche de remplacement.