Загрузка библиотеки из другой библиотеки DLL

#windows #dll #path #loadlibrary

#Windows #dll #путь #загрузка библиотеки

Вопрос:

Путь поиска DLL, как описано в MSDN, является:

  1. Каталог, в котором находится исполняемый модуль для текущего процесса.
  2. Текущий каталог.
  3. Системный каталог Windows. Функция GetSystemDirectory извлекает путь к этому каталогу.
  4. Каталог Windows. Функция GetWindowsDirectory извлекает путь к этому каталогу.
  5. Каталоги, перечисленные в переменной среды PATH.

Что вызывает следующее сомнение:

Предположим, у меня есть исполняемый файл в некотором каталоге, скажем: c:execdirmyexe.exe и он загружает библиотеку DLL, которая найдена в PATH и расположена в c:dlldirmydll.dll . Теперь предположим, что mydll.dll пытается загрузить другую библиотеку DLL с помощью LoadLibrary . Какой каталог будет просматриваться первым — c:dlldir или c:execdir ?

Я думаю, что приведенные выше правила поиска говорят, что это будет c:execdir потому что это якобы «каталог, в котором находится исполняемый модуль для текущего процесса», но было бы неплохо получить подтверждение из другого источника.

РЕДАКТИРОВАТЬ: Кроме того, c:dlldir просматривается вообще? В конце концов, это не то, где находится .exe, и не «текущий каталог» (если это подразумевается в общем смысле).

PS Меня интересуют как Windows XP, так и 7.

Комментарии:

1. Я не понимаю, что вас смутило после прочтения документов. Мне это кажется довольно ясным. Почему загрузка второй библиотеки DLL изменяет последовательность поиска пути?

2. @Cody: потому что загружается вторая библиотека DLL, а не .exe — файл .exe даже не знает об этой 2-й библиотеке DLL, которая загружается из первой

3. @Hans: спасибо, я отредактировал другой соответствующий вопрос

4. c:dlldir просматривается неявно. В противном случае библиотека DLL никогда не была бы найдена. Могут применяться только два из 5 правил: PATH или current dir.

Ответ №1:

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

Комментарии:

1. Итак, c:dlldir никогда не просматривается, потому что это ни «где находится исполняемый файл», ни «текущий каталог»?

2. @Eli Если это не указано в PATH, не является текущим каталогом, или специальным системным каталогом, или каталогом исходного исполняемого файла (допустим, это на самом деле, c:dlldir а не c:windowssystem32 , например), тогда нет, этого не будет.