Как определить имя DLL (строка), которая загрузила мою DLL? - PullRequest
0 голосов
/ 04 июня 2010

Я пишу драйвер устройства, загруженный сторонним драйвером. Мне нужен способ определения имени стороннего драйвера, который загружает мой драйвер устройства (для целей отладки).

Например, GetModuleFileName предоставит мне имя исполняемого файла. Вместо этого я бы хотел получить имена DLL.

Трассировка стека может быть одной из следующих:

(а)

app0.exe
abc.dll <- detect "abc"
common.dll
my.dll

(б)

app1.exe
xyz.dll <- detect "xyz"
common.dll
my.dll

(с)

app2.exe
common.dll
my.dll

p.s. - мне нужен только метод для C ++ \ Windows

Ответы [ 2 ]

3 голосов
/ 04 июня 2010

Я предполагаю, что у вас есть дескриптор процесса или идентификатор процесса, в который загружен ваш my.dll.

См. Пример MSDN по адресу http://msdn.microsoft.com/en-us/library/ms686701(v=VS.85).aspx, который сделает снимок процесса и предоставит всю информацию.

Интересный метод на BOOL ListProcessModules( DWORD dwPID ):

MODULEENTRY32 имеет поле с именем szModule, которое содержит название модуля. См http://msdn.microsoft.com/en-us/library/ms684225(VS.85).aspx

Все записи модуля могут быть получены из процесса с помощью CreateToolhelp32Snapshot, для которого требуется идентификатор процесса (th32ProcessID из PROCESSENTRY32).

Затем вы будете перебирать все модули снимка, используя Module32First и Module32Next. Также не забудьте закрыть ручку, указанную CreateToolhelp32Snapshot.

(Примечание: эти методы доступны из kernel32.dll )

Это называется модулем Walking, подробнее здесь: http://msdn.microsoft.com/en-us/library/ms684236(v=VS.85).aspx (описано, что уже есть в этом ответе)

0 голосов
/ 04 июня 2010

Если это только для целей отладки, вы можете просто сделать стек по стеку

См. Этот stackoverflow подробный ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...