如何获取DLL加载进程句柄

时间:2010-07-29 17:09:15

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

我正在尝试获取从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块之外,一切正常,但每次列出的窗口都会调用一次)。

还有其他方法可以达到目的吗?这种方法完全错了还是我错过了什么?

提前完成

4 个答案:

答案 0 :(得分:4)

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

请注意,在DllMain中执行过多操作非常危险。调用除KERNEL32函数以外的任何函数都是非常危险的,即使这样,也有一些KERNEL32函数不应该调用。请参阅DllMain文档,this documentseveral blog posts from Microsoft开发人员建议不要在DllMain中执行太多操作。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

答案 3 :(得分:0)

你犯了一个错误:

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;
}