【问题标题】:How to determine the name of the DLL (string) that loaded my DLL?如何确定加载我的 DLL 的 DLL(字符串)的名称?
【发布时间】:2011-02-27 13:33:51
【问题描述】:

我正在编写一个由第 3 方驱动程序加载的设备驱动程序。我需要一种方法来确定正在加载我的设备驱动程序的第 3 方驱动程序的名称(出于调试目的)。

例如,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

附言- 我只需要 C++\Windows 的方法

【问题讨论】:

    标签: c++ dll windows-7


    【解决方案1】:

    我假设你有一个进程句柄,或者你的 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(PROCESSENTRY32th32ProcessID)。

    然后您将使用Module32FirstModule32Next 迭代快照的所有模块。另外,不要忘记关闭CreateToolhelp32Snapshot提供的句柄。

    (注意:这些方法可从 kernel32.dll 获得)

    这被称为模块行走,更多信息在这里:http://msdn.microsoft.com/en-us/library/ms684236(v=VS.85).aspx(已经描述了这个答案中的内容)

    【讨论】:

      【解决方案2】:

      如果只是为了调试目的,你可以做一个stackwalk

      详情请参阅stackoverflow 答案

      【讨论】:

        猜你喜欢
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多