Partager via


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. Toutefois, 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 fait partie du système d’exploitation qui charge des DLL et/ou résout les références aux DLL.

Pourboire

Pour obtenir des définitions de empaquetées et applications 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 abordés dans cette rubrique : vous pouvez les considérer comme faisant partie de l’ordre de recherche 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 allons utiliser pour les référencer plus loin dans la rubrique.

  • redirection 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 une redirection à l’aide d’un manifeste d’application (également appelé manifeste d’application côte à côte ou manifeste de fusion). Pour plus d’informations, consultez manifestes.
  • liste de 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 il a été chargé).
  • 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é de Registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs.

Si une DLL a des dépendances, le système recherche les DLL dépendantes comme s’ils étaient chargés en utilisant uniquement leurs noms de module. C’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 fichier .dll) en appelant la fonction LoadPackagedLibrary, la DLL doit se trouver dans le graphique de dépendance 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 de modules chargés.
  5. DLL connues.
  6. Graphique de dépendance de package du processus. Il s’agit du package de l’application et de toutes les dépendances spécifiées comme <PackageDependency> dans la section <Dependencies> du manifeste de 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 s’ils étaient chargés avec uniquement 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 que dans 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 du fichier 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 obtient le contrôle de l’un des répertoires recherchés, il peut placer une copie malveillante de la DLL dans ce dossier. Pour obtenir des moyens d’empêcher ces attaques, consultez sécurité de la bibliothèque de liens dynamiques.

Ordre de recherche standard pour les applications non empaquetées

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

Le mode de recherche DLL sans échec (activé par défaut) déplace le dossier actif de l’utilisateur plus loin dans l’ordre de recherche. Pour désactiver le mode de recherche DLL sans échec, créez la valeur de Registre HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode et définissez-la sur 0. L’appel de la fonction SetDllDirectory désactive efficacement le mode de recherche DLL sans échec (tandis 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. Ensembles d’API.
  3. Redirection de manifeste SxS.
  4. Liste de modules chargés.
  5. DLL connues.
  6. Windows 11, version 21H2 (10.0 ; Build 22000), et versions ultérieures. Graphique de dépendance de package du processus. Il s’agit du package de l’application et de toutes les dépendances spécifiées comme <PackageDependency> dans la section <Dependencies> du manifeste de package de l’application. Les dépendances sont recherchées dans l’ordre dans lequel elles apparaissent dans le manifeste.
  7. Dossier à partir duquel l’application a chargé.
  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. Il n’existe aucune fonction qui obtient le chemin d’accès de ce dossier, mais elle est recherchée.
  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 les chemins d’accès d’application clé de Registre. Les chemins d’accès d’application clé ne sont pas utilisés lors de l’informatique du chemin de recherche DLL.

Si le mode de recherche 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.

Note

L’ordre de recherche standard du processus est é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 se poursuit jusqu’à ce que tous les modules exécutables associés se trouvent. 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_PATHet que le paramètre lpFileName spécifie un chemin d’accès 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 qui LoadLibraryEx est chargé.

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. Dossier système. Utilisez la fonction GetSystemDirectory pour récupérer le chemin d’accès de ce dossier.
  3. Dossier système 16 bits. Il n’existe aucune fonction qui obtient le chemin d’accès de ce dossier, mais elle est recherchée.
  4. Dossier Windows. 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 les chemins d’accès d’application clé de Registre. Les chemins d’accès d’application clé ne sont pas utilisés lors de l’informatique 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 chargé.
  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 DLL sans échec pendant que 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 des indicateurs LOAD_LIBRARY_SEARCH 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 dll de processus à l’aide des fonctions AddDllDirectory ou SetDllDirectory.

Les répertoires qui sont 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 est recherché. Ce dossier est recherché uniquement pour les dépendances de la DLL à charger.
  2. LOAD_LIBRARY_SEARCH_APPLICATION_DIR. Le dossier de l’application est recherché.
  3. LOAD_LIBRARY_SEARCH_USER_DIRS. Les chemins d’accès explicitement ajoutés avec la fonctionAddDllDirectoryou la fonction SetDllDirectory sont recherchés. Si vous ajoutez plusieurs chemins d’accès, l’ordre dans lequel les chemins d’accès sont recherchés n’est pas spécifié.
  4. LOAD_LIBRARY_SEARCH_SYSTEM32. Le dossier système est recherché.

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’autre ordre de recherche.