【问题标题】:How to get a DLL loading process handle如何获取 DLL 加载进程句柄
【发布时间】:2010-07-29 17:09:14
【问题描述】:

我正在尝试获取从 dll 加载 dll 的进程的句柄。

我的方法是: 在 DLL_PROCESS_ATTACH 我调用 EnumWindows(EnumWindowsProc,NULL);

我的 EnumWindowsProc 实现如下:

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    if(GetCurrentProcessId() == GetWindowThreadProcessId(hWnd,NULL)){
        MessageBox(hWnd,L"I loaded your dll!",L"it's me",MB_OK);
        return TRUE;
}
    return FALSE;
}

问题是 GetCurrentProcessId() == GetWindowThreadProcessId(hWnd,NULL) 永远不会为真(如果我将消息框调用放在 if 块之外一切正常,但它会为每个列出的窗口调用一次)。

还有其他方法可以直截了当吗?这种方法是完全错误的还是我只是错过了什么?

提前感谢

【问题讨论】:

  • GetWindowThreadProcessId 返回线程id,第二个参数获取进程id。 (注意:你不应该在 DllMain 中发疯,在该函数中实际上可以安全使用的函数只有少数)
  • 我知道,但我的问题是我需要在 DLLmain 中做所有的事情,因为我的 dll 是在一个正在运行的进程中注入的。

标签: c++ windows winapi dll code-injection


【解决方案1】:

使用GetCurrentProcess,它返回当前进程的伪句柄。如果您需要真正的句柄,请将伪句柄传递给DuplicateHandle

请注意,在DllMain 中做太多事情是非常危险的。调用除KERNEL32 函数之外的任何函数都是非常危险的,即便如此,您也不应该调用一些KERNEL32 函数。请参阅 DllMain 文档、this documentseveral blog posts from Microsoft 开发人员建议不要在 DllMain 中做太多事情。

【讨论】:

    【解决方案2】:

    最简单的方法是在需要句柄时简单地使用GetCurrentProcess

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        你犯了一个错误:

        GetWindowThreadProcessId 不返回进程 ID,而是返回线程 ID。

        你的程序必须这样写:

        BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
            DWORD process;
            GetWindowThreadProcessId(hWnd,&process);
            if(GetCurrentProcessId() == process){
                MessageBox(hWnd,L"I loaded your dll!",L"it's me",MB_OK);
                return TRUE;
            }
            return FALSE;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          相关资源
          最近更新 更多