确定外部进程的主线程ID(ReadProcessMemory - 错误299)

时间:2014-08-06 11:22:45

标签: c++ multithreading assembly

我试图获取另一个进程的主线程ID,就像这里建议的那样:

https://stackoverflow.com/a/8058710/1386873

DWORD GetMainThreadId(DWORD dwPid)
{
    LPCVOID lpTid;
    _asm
    {
        mov eax, fs:[18h]
        add eax, 36
        mov lpTid, eax
    }

    HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, dwPid);
    if (hProcess == NULL)
        return NULL;

    int dwTid = 0;
    if (ReadProcessMemory(hProcess, lpTid, (LPVOID)&dwTid, sizeof(int), NULL) == FALSE)
    {
        CloseHandle(hProcess);
        return NULL;
    }

    CloseHandle(hProcess);

    return (DWORD)dwTid;
}

但这不起作用:ReadProcessMemory始终从GetLastError()返回299代码,这意味着" ERROR_PARTIAL_COPY - 只完成了ReadProcessMemory或WriteProcessMemory请求的一部分。"。那么错误信息很清楚,但为什么会这样呢? BytesRead也始终为0。 我得到了这样的进程ID:

unsigned long GetTargetProcessIdFromWindow(LPCWSTR className, LPCWSTR windowName)
{
    unsigned long processID = 0;
    HWND targetWnd;

    targetWnd = FindWindow(className, windowName);
    GetWindowThreadProcessId(targetWnd, &processID);

    return processID;
}

似乎工作正常。什么可能导致这个?我尝试了不同的应用程序(计算器,记事本等)。我的应用程序是为Win32构建的,我的操作系统是Windows 64bit。 这与TIB有关吗?据我所知,只要我为Win32构建它,我的方式应该没问题,不应该这样。

感谢您的任何提示。

1 个答案:

答案 0 :(得分:0)

考虑使用Toolhlp函数 - CreateToolhelp32Snapshot()和Thread32First()。