我正在编写由第三方驱动程序加载的设备驱动程序。我需要一种方法来确定加载我的设备驱动程序的第三方驱动程序的名称(用于调试目的)。
例如,GetModuleFileName
将为我提供可执行文件的名称。我希望能够获得DLL名称。
堆栈跟踪可能是以下之一:
(a)中
app0.exe
abc.dll <- detect "abc"
common.dll
my.dll
(b)中
app1.exe
xyz.dll <- detect "xyz"
common.dll
my.dll
(c)中
app2.exe
common.dll
my.dll
P.S。 - 我只需要一个C ++ \ Windows
的方法答案 0 :(得分:3)
我假设您有一个流程句柄,或者您加载了my.dll
的流程的ID。
请参阅http://msdn.microsoft.com/en-us/library/ms686701(v=VS.85).aspx上的MSDN示例,该示例将获取流程的快照并提供所有信息。
有趣的方法是BOOL ListProcessModules( DWORD dwPID )
:
MODULEENTRY32
有一个名为szModule
的字段,其中包含模块的名称。见http://msdn.microsoft.com/en-us/library/ms684225(VS.85).aspx
可以使用CreateToolhelp32Snapshot
从流程中检索所有模块条目,这需要流程ID(th32ProcessID
的{{1}})。
然后,您将使用PROCESSENTRY32
和Module32First
迭代快照的所有模块。另外,不要忘记关闭Module32Next
给出的句柄。
(注意:这些方法可从 kernel32.dll 获得)
这称为模块行走,更多信息请点击此处:http://msdn.microsoft.com/en-us/library/ms684236(v=VS.85).aspx(已在此答案中说明)
答案 1 :(得分:0)
如果它仅用于调试目的,您可以执行stackwalk
有关详细信息,请参阅此stackoverflow答案