【问题标题】:Determining main thread id of extern process (ReadProcessMemory - Err 299)确定外部进程的主线程 ID(ReadProcessMemory - 错误 299)
【发布时间】:2014-08-06 11:22:44
【问题描述】:

我试图获取另一个进程的主线程 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 64 位。 这和TIB有关系吗?据我了解,只要我按照我的方式为 Win32 构建它应该没问题,不是吗。

感谢任何提示。

【问题讨论】:

  • Win32 not 没问题,此代码不适用于 64 位进程。他们的 TEB 位于完全不同的地址,您永远无法通过 32 位进程访问该地址。构建为 x64 也不是解决办法,现在您无法读取 32 位进程的 TEB。
  • @HansPassant 雅。在我写完这篇文章后,我意识到 Notepad.exe 和 Calculator.exe 可能是 64 位进程。但我也尝试将它与 32 位版本的程序一起使用,但它不起作用。

标签: c++ multithreading assembly


【解决方案1】:

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

【讨论】:

  • 是的。我现在用这个。但据我了解,除了查看快照时间之外,没有简单的方法可以确定其他进程的主线程。即使那样它也不可靠,因为主线程可能已经关闭。对我来说,在进程中获取一个随机线程的id就足够了,所以这个解决方案很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多