#windows #dll #path #loadlibrary
#Windows #dll #путь #загрузка библиотеки
Вопрос:
Путь поиска DLL, как описано в MSDN, является:
- Каталог, в котором находится исполняемый модуль для текущего процесса.
- Текущий каталог.
- Системный каталог Windows. Функция GetSystemDirectory извлекает путь к этому каталогу.
- Каталог Windows. Функция GetWindowsDirectory извлекает путь к этому каталогу.
- Каталоги, перечисленные в переменной среды 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
, например), тогда нет, этого не будет.