首页 > 解决方案 > GetModuleHandle() 无法检索“notepad.exe”加载的“advapi32.dll”句柄

问题描述

我正在尝试获取由 notepad.exe 处理的文件信息。

所以,我的程序执行以下步骤。

  1. 为 notepad.exe 创建进程

    CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

  2. 等到notepad.exe初始化完成

    WaitForInputIdle(pi.hProcess, 10000);

  3. 将 notepad.exe 进程作为 Debugee 附加到我的程序中。

    DebugActiveProcess(dwPID)

  4. 等待来自 Debugee 的调试事件。

  5. 当我的程序收到CREATE_PROCESS_DEBUG_EVENT时,做我需要的事情。

这是我的功能有问题。

LPVOID g_pfHookingAdd = NULL;
BOOL OnCreateProcessDebugEvent(LPDEBUG_EVENT pde)
{
    DWORD dwLastErr;
    if (NULL == GetModuleHandleA("advapi32.dll"))   // Not able to get a handle here.
    {
        dwLastErr = GetLastError(); // dwLastErr => 126 => (0x7E) 
    }
    g_pfHookingAdd = GetProcAddress(GetModuleHandleA("advapi32.dll"), "IsTextUnicode");
    return TRUE;
}

如您所见,我的目标是检索IsTextUnicode()加载函数的地址。

但是,当我调用 时GetModuleHandleA("advapi32.dll"),我收到错误代码 126,即 ERROR_MOD_NOT_FOUND.

我还检查了advapi32.dll在 notepad.exe 执行期间加载的内容。

谁能告诉我为什么这不起作用?

这是我的环境条件:

Windows 10 专业版 1803(操作系统内部版本 17134.165)

标签: c++winapireverse-engineeringnotepad

解决方案


这不起作用,因为GetModuleHandle() ...

检索指定模块的模块句柄。该模块必须已由调用进程加载。

对于另一个进程中的 DLL,GetModuleHandle() 的答案可能会对您有所帮助。


推荐阅读