Порядок поиска библиотеки динамической компоновки (DLL)

Система может содержать несколько версий одной библиотеки динамической компоновки (DLL). Приложения могут управлять расположением, из которого загружается DLL, путем указания полного пути или использования другого механизма, например манифеста. Если эти методы не используются, система выполняет поиск библиотеки DLL во время загрузки, как описано в этом разделе.

Факторы, влияющие на поиск

На то, что система осуществляет поиск библиотеки DLL, влияют следующие факторы:

  • Если библиотека DLL с таким же именем модуля уже загружена в память, система проверяет только перенаправление и манифест перед разрешением в загруженную библиотеку DLL, независимо от того, в каком каталоге он находится. Система не выполняет поиск библиотеки DLL.
  • Если библиотека DLL находится в списке известных библиотек DLL для версии Windows, в которой выполняется приложение, система использует свою копию известной библиотеки DLL (и зависимые библиотеки DLL, если они есть) вместо поиска библиотеки DLL. Список известных библиотек DLL в текущей системе см. в следующем разделе реестра: hKey _ локальный _ компьютер \ System \ CurrentControlSet \ Control \ Manager \ кновндллс.
  • Если библиотека DLL имеет зависимости, система выполняет поиск зависимых библиотек DLL, как если бы они загружались только с именами модулей. Это справедливо, даже если первая библиотека DLL была загружена путем указания полного пути.

Порядок поиска для приложений UWP

Когда приложение UWP для Windows 10 (или приложение магазина для Windows 8. x) загружает упакованный модуль путем вызова функции LoadPackagedLibrary , Библиотека DLL должна находиться в графе зависимостей пакета процесса. Дополнительные сведения см. в разделе LoadPackagedLibrary. Когда приложение UWP загружает модуль другими способами и не указывает полный путь, система выполняет поиск библиотеки DLL и ее зависимостей во время загрузки, как описано в этом разделе.

Прежде чем система будет искать библиотеку DLL, она проверяет следующее:

  • Если библиотека DLL с таким же именем модуля уже загружена в память, система использует загруженную библиотеку DLL независимо от того, в каком каталоге она находится. Система не выполняет поиск библиотеки DLL.
  • Если библиотека DLL находится в списке известных библиотек DLL для версии Windows, в которой выполняется приложение, система использует свою копию известной библиотеки DLL (и зависимые от нее библиотеки DLL, если таковые имеются). Система не выполняет поиск библиотеки DLL. Список известных библиотек DLL в текущей системе см. в следующем разделе реестра: hKey _ локальный _ компьютер \ System \ CurrentControlSet \ Control \ Manager \ кновндллс.

Если система должна искать модуль или его зависимости, она всегда использует порядок поиска для приложений UWP, даже если зависимость не является кодом приложения UWP.

Стандартный порядок поиска для приложений UWP

Если модуль еще не загружен или в списке известных библиотек DLL, система выполняет поиск в следующих расположениях в следующем порядке:

  1. Граф зависимостей пакета для процесса. Это пакет приложения, а также все зависимости, указанные как <PackageDependency> в <Dependencies> разделе манифеста пакета приложения. Поиск зависимостей осуществляется в том порядке, в котором они отображаются в манифесте.
  2. Каталог, из которого был загружен вызывающий процесс.
  3. Системный каталог (% SystemRoot% \ System32).

Если библиотека DLL имеет зависимости, система выполняет поиск зависимых библиотек DLL, как если бы они загружались только с именами модулей. Это справедливо, даже если первая библиотека DLL была загружена путем указания полного пути.

Альтернативный порядок поиска для приложений UWP

Если модуль изменяет стандартный порядок поиска, вызывая функцию LoadLibraryEx с параметром Load _ с _ измененным _ _ путем поиска, система выполняет поиск в каталоге указанного модуля вместо каталога вызывающего процесса. Система выполняет поиск в следующих расположениях в следующем порядке:

  1. Граф зависимостей пакета для процесса. Это пакет приложения, а также все зависимости, указанные как <PackageDependency> в <Dependencies> разделе манифеста пакета приложения. Поиск зависимостей осуществляется в том порядке, в котором они отображаются в манифесте.
  2. Каталог, из которого был загружен указанный модуль.
  3. Системный каталог (% SystemRoot% \ System32).

Порядок поиска для настольных приложений

Настольные приложения могут управлять расположением, из которого загружается DLL, путем указания полного пути, использования перенаправления DLLили манифеста. Если ни один из этих методов не используется, система выполняет поиск библиотеки DLL во время загрузки, как описано в этом разделе.

Прежде чем система будет искать библиотеку DLL, она проверяет следующее:

  • Если библиотека DLL с таким же именем модуля уже загружена в память, система использует загруженную библиотеку DLL независимо от того, в каком каталоге она находится. Система не выполняет поиск библиотеки DLL.
  • Если библиотека DLL находится в списке известных библиотек DLL для версии Windows, в которой выполняется приложение, система использует свою копию известной библиотеки DLL (и зависимые от нее библиотеки DLL, если таковые имеются). Система не выполняет поиск библиотеки DLL. Список известных библиотек DLL в текущей системе см. в следующем разделе реестра: hKey _ локальный _ компьютер \ System \ CurrentControlSet \ Control \ Manager \ кновндллс.

Если библиотека DLL имеет зависимости, система выполняет поиск зависимых библиотек DLL, как если бы они загружались только с именами модулей. Это справедливо, даже если первая библиотека DLL была загружена путем указания полного пути.

Важно!

Если злоумышленник получает контроль над одним из каталогов, в котором выполняется поиск, он может поместить в этот каталог вредоносную копию библиотеки DLL. Способы предотвращения таких атак см. в разделе безопасность библиотеки динамической компоновки.

Стандартный порядок поиска для настольных приложений

Стандартный порядок поиска библиотек DLL, используемый системой, зависит от того, включен или отключен режим поиска "Защищенная библиотека DLL". Режим поиска в защищенных библиотеках DLL помещает текущий каталог пользователя в последующий порядок поиска.

Защищенный режим поиска DLL включен по умолчанию. Чтобы отключить эту функцию, создайте параметр реестра hKey _ Local _ Machine \ System \ CurrentControlSet \ Control \ Manager \ сафедллсеарчмоде и задайте для него значение 0. Вызов функции сетдллдиректори эффективно отключает сафедллсеарчмоде , пока указанный каталог находится в пути поиска и изменяет порядок поиска, как описано в этом разделе.

Если сафедллсеарчмоде включен, порядок поиска выглядит следующим образом:

  1. Каталог, из которого загружено приложение.
  2. Системный каталог. Чтобы получить путь к этому каталогу, используйте функцию GetSystemDirectory .
  3. 16-разрядный системный каталог. Отсутствует функция, которая получает путь к этому каталогу, но ищет его.
  4. Каталог Windows. Чтобы получить путь к этому каталогу, используйте функцию жетвиндовсдиректори .
  5. Текущий каталог.
  6. Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что сюда не входит путь для каждого приложения, указанный в разделе реестра пути к приложению. Ключ путей приложений не используется при вычислении пути поиска DLL.

Если сафедллсеарчмоде отключен, то порядок поиска выглядит следующим образом:

  1. Каталог, из которого загружено приложение.
  2. Текущий каталог.
  3. Системный каталог. Чтобы получить путь к этому каталогу, используйте функцию GetSystemDirectory .
  4. 16-разрядный системный каталог. Отсутствует функция, которая получает путь к этому каталогу, но ищет его.
  5. Каталог Windows. Чтобы получить путь к этому каталогу, используйте функцию жетвиндовсдиректори .
  6. Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что сюда не входит путь для каждого приложения, указанный в разделе реестра пути к приложению. Ключ путей приложений не используется при вычислении пути поиска DLL.

Альтернативный порядок поиска для настольных приложений

Стандартный порядок поиска, используемый системой, можно изменить, вызвав функцию LoadLibraryEx с параметром Load _ с _ измененным _ _ путем поиска. Стандартный порядок поиска также можно изменить, вызвав функцию сетдллдиректори .

Примечание

Стандартный порядок поиска процесса также будет зависеть от вызова функции сетдллдиректори в родительском процессе перед началом текущего процесса.

Если указать альтернативную стратегию поиска, ее поведение будет продолжаться до тех пор, пока не будут найдены все связанные исполняемые модули. После того как система начнет обработку подпрограмм инициализации DLL, система вернется к стандартной стратегии поиска.

Функция LoadLibraryEx поддерживает альтернативный порядок поиска, если вызов указывает загрузку _ с _ измененным _ _ путем поиска , а параметр лпфиленаме указывает абсолютный путь.

Обратите внимание, что стандартная стратегия поиска и альтернативная стратегия поиска, заданная параметром LoadLibraryEx с _ путем загрузки с _ измененным _ _ путем поиска , отличаются только одним способом: Стандартный поиск начинается в каталоге вызывающего приложения, а альтернативный Поиск начинается в каталоге исполняемого модуля, который загружает LoadLibraryEx .

Если сафедллсеарчмоде включен, альтернативный порядок поиска выглядит следующим образом:

  1. Каталог, заданный параметром лпфиленаме.
  2. Системный каталог. Чтобы получить путь к этому каталогу, используйте функцию GetSystemDirectory .
  3. 16-разрядный системный каталог. Отсутствует функция, которая получает путь к этому каталогу, но ищет его.
  4. Каталог Windows. Чтобы получить путь к этому каталогу, используйте функцию жетвиндовсдиректори .
  5. Текущий каталог.
  6. Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что сюда не входит путь для каждого приложения, указанный в разделе реестра пути к приложению. Ключ путей приложений не используется при вычислении пути поиска DLL.

Если сафедллсеарчмоде отключен, альтернативный порядок поиска выглядит следующим образом:

  1. Каталог, заданный параметром лпфиленаме.
  2. Текущий каталог.
  3. Системный каталог. Чтобы получить путь к этому каталогу, используйте функцию GetSystemDirectory .
  4. 16-разрядный системный каталог. Отсутствует функция, которая получает путь к этому каталогу, но ищет его.
  5. Каталог Windows. Чтобы получить путь к этому каталогу, используйте функцию жетвиндовсдиректори .
  6. Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что сюда не входит путь для каждого приложения, указанный в разделе реестра пути к приложению. Ключ путей приложений не используется при вычислении пути поиска DLL.

Функция сетдллдиректори поддерживает альтернативный порядок поиска, если параметр лппаснаме задает путь. Альтернативный порядок поиска выглядит следующим образом:

  1. Каталог, из которого загружено приложение.
  2. Каталог, указанный параметром лппаснаме параметра сетдллдиректори.
  3. Системный каталог. Чтобы получить путь к этому каталогу, используйте функцию GetSystemDirectory . Имя этого каталога — System32.
  4. 16-разрядный системный каталог. Отсутствует функция, которая получает путь к этому каталогу, но ищет его. Имя этого каталога — System.
  5. Каталог Windows. Чтобы получить путь к этому каталогу, используйте функцию жетвиндовсдиректори .
  6. Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что сюда не входит путь для каждого приложения, указанный в разделе реестра пути к приложению. Ключ путей приложений не используется при вычислении пути поиска DLL.

Если параметр лппаснаме является пустой строкой, вызов удаляет текущий каталог из порядка поиска.

Сетдллдиректори эффективно отключает режим поиска в защищенных библиотеках DLL, пока указанный каталог находится в пути поиска. Чтобы восстановить защищенный режим поиска DLL на основе значения реестра сафедллсеарчмоде и восстановить текущий каталог в порядке поиска, вызовите сетдллдиректори с лппаснаме как null.

Порядок поиска с помощью флагов _ _ поиска "загрузить библиотеку "

Приложение может указать порядок поиска, используя один или несколько флагов _ _ поиска в библиотеке загрузки с помощью функции LoadLibraryEx . Приложение также может использовать флаги _ _ поиска библиотеки Load с функцией сетдефаултдллдиректориес , чтобы установить порядок поиска библиотек DLL для процесса. Приложение может указать дополнительные каталоги для порядка поиска DLL процесса с помощью функций адддллдиректори или сетдллдиректори .

Искомые каталоги зависят от флагов, указанных в сетдефаултдллдиректориес или LoadLibraryEx. Если используется более одного флага, поиск соответствующих каталогов выполняется в следующем порядке:

  1. Каталог, содержащий библиотеку DLL (Загрузка _ библиотеки _ DLL поиска _ _ _ по библиотеке Load). Этот каталог ищет только зависимости загружаемой библиотеки DLL.
  2. Каталог приложения (Загрузка _ библиотеки поиск _ каталога _ приложения _).
  3. Пути, явно добавленные с помощью функции адддллдиректори (Загрузка _ библиотеки _ Поиск _ пользователя _ dirs) или функции сетдллдиректори . Если добавлен более одного пути, порядок поиска путей не определен.
  4. Системный каталог (загрузить _ библиотеку _ поиска _ system32).

Если приложение не вызывает LoadLibraryEx с любыми флагами _ _ поиска в библиотеке нагрузки или не устанавливает порядок поиска DLL для процесса, система выполняет поиск библиотек DLL, используя стандартный или альтернативный порядок поиска.

адддллдиректори

Регистрация приложения

Перенаправление библиотек динамической компоновки

Безопасность библиотеки динамической компоновки

LoadLibrary

LoadLibraryEx

LoadPackagedLibrary

сетдефаултдллдиректориес

сетдллдиректори

Параллельные компоненты