【发布时间】: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