WaitForDebugEvent: как узнать имя загружаемой DLL?
От: eXXXplosivo Латвия  
Дата: 13.05.02 06:58
Оценка:
Ситуация: делаем до смешного простой отладчик, для этого обрабатываем отладочные события с помощью WaitForDebugEvent. Эта функция возвращает структуру DEBUG_EVENT. То событие, которое меня интересует — LOAD_DLL_DEBUG_EVENT, то есть событие подгрузки DLL отлаживаемым процессом. В этом случае в DEBUG_EVENT возвращается следующая информация:

typedef struct _LOAD_DLL_DEBUG_INFO { 
  HANDLE hFile; 
  LPVOID lpBaseOfDll; 
  DWORD  dwDebugInfoFileOffset; 
  DWORD  nDebugInfoSize; 
  LPVOID lpImageName; 
  WORD fUnicode; 
} LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO;


Нужно узнать имя файла загружаемой библиотеки. Казалось бы, чего проще — вон же есть lpImageName, указатель на это самое имя! Но не тут-то было... MSDN говорит, что этот член структуры — "strictly optional", и на практике это подтверждается — во всех случаях, что я встречал, этот указатель есть круглый ноль... или же указатель на ноль — но только не на имя DLL :(

Вопрос: как имея указанную выше информацию (структуру LOAD_DLL_DEBUG_INFO) узнать имя DLL? Думаю, это возможно, ведь реальные отладчики как-то ведь это делают! Может, зная хэндл можно как-то выудить имя файла?

Всем зараннее спасибо за помощь! :))
Re: WaitForDebugEvent: как узнать имя загружаемой DLL?
От: OlegO Россия http://www.mediachase.ru
Дата: 13.05.02 08:07
Оценка:
Здравствуйте eXXXplosivo, Вы писали:

XXX>Вопрос: как имея указанную выше информацию (структуру LOAD_DLL_DEBUG_INFO) узнать имя DLL? Думаю, это возможно, ведь реальные отладчики как-то ведь это делают! Может, зная хэндл можно как-то выудить имя файла?


XXX>Всем зараннее спасибо за помощь!


Действительно не все так просто . Однако решение есть, не мое правда, а Джона Робинсона автора книги "Отладка приложений", в ней кстати эта проблема расипсывается подробно в 4 главе WDBG: A Real Debugger. На примере дебагера WDBG.

Основная идея для NT использовать функцию GetModuleFileNameEx из PSAPI Functions, и
CreateToolhelp32Snapshot, Module32First, Module32Next из Tool Help Library для остальных операционок.

Для ее решения им была написана универсальная функция BSUGetModuleFileNameEx, которая входит в BugslayerUtil.DLL, Она в зависимости от операционки выбирает один из выше приведенных механизмов. Скачать последнюю ее версию c исходниками можно с http://msdn.microsoft.com/msdnmag/issues/02/03/Bugslayer/Bugslayer0203.asp

Если понадабится пример использования могу скинуть отладчик WDBG.
С уважением, OlegO.
Re: WaitForDebugEvent: как узнать имя загружаемой DLL?
От: Digger Россия  
Дата: 13.05.02 09:07
Оценка:
Здравствуйте eXXXplosivo, Вы писали:

XXX>Ситуация: делаем до смешного простой отладчик, для этого обрабатываем отладочные события с помощью WaitForDebugEvent. Эта функция возвращает структуру DEBUG_EVENT. То событие, которое меня интересует — LOAD_DLL_DEBUG_EVENT, то есть событие подгрузки DLL отлаживаемым процессом. В этом случае в DEBUG_EVENT возвращается следующая информация:


XXX>
XXX>typedef struct _LOAD_DLL_DEBUG_INFO { 
XXX>  HANDLE hFile; 
XXX>  LPVOID lpBaseOfDll; 
XXX>  DWORD  dwDebugInfoFileOffset; 
XXX>  DWORD  nDebugInfoSize; 
XXX>  LPVOID lpImageName; 
XXX>  WORD fUnicode; 
XXX>} LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO;
XXX>


XXX>Нужно узнать имя файла загружаемой библиотеки. Казалось бы, чего проще — вон же есть lpImageName, указатель на это самое имя! Но не тут-то было... MSDN говорит, что этот член структуры — "strictly optional", и на практике это подтверждается — во всех случаях, что я встречал, этот указатель есть круглый ноль... или же указатель на ноль — но только не на имя DLL


XXX>Вопрос: как имея указанную выше информацию (структуру LOAD_DLL_DEBUG_INFO) узнать имя DLL? Думаю, это возможно, ведь реальные отладчики как-то ведь это делают! Может, зная хэндл можно как-то выудить имя файла?


XXX>Всем зараннее спасибо за помощь!


Используй EnumerateLoadedModules и все само собой утресется...
Чтобы писать программы голова не нужна, нужна клавиатура.
Re[2]: WaitForDebugEvent: как узнать имя загружаемой DLL?
От: eXXXplosivo Латвия  
Дата: 14.05.02 05:44
Оценка:
Здравствуйте Digger, Вы писали:

D>Используй EnumerateLoadedModules и все само собой утресется... :)


О, спасибо! Мысль ценная, я попробую ;)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.