我正在C的迷你Windows进程资源pipe理器,我有一个线程的句柄。
我怎样才能检索该线程的起始地址? 像这样的东西:
这个问题几天前已经被问到了。 这是一个示例解决方案:
DWORD WINAPI GetThreadStartAddress(HANDLE hThread) { NTSTATUS ntStatus; HANDLE hDupHandle; DWORD dwStartAddress; pNtQIT NtQueryInformationThread = (pNtQIT)GetProcAddress(GetmoduleeHandle("ntdll.dll"), "NtQueryInformationThread"); if(NtQueryInformationThread == NULL) return 0; HANDLE hCurrentProcess = GetCurrentProcess(); if(!DuplicateHandle(hCurrentProcess, hThread, hCurrentProcess, &hDupHandle, THREAD_QUERY_INFORMATION, FALSE, 0)){ SetLastError(ERROR_ACCESS_DENIED); return 0; } ntStatus = NtQueryInformationThread(hDupHandle, ThreadQuerySetWin32StartAddress, &dwStartAddress, sizeof(DWORD), NULL); CloseHandle(hDupHandle); if(ntStatus != STATUS_SUCCESS) return 0; return dwStartAddress; }
资料来源: http : //forum.sysinternals.com/how-to-get-the-start-address-and-modu_topic5127_post18072.html#18072
您可能必须包含此文件: http : //pastebin.com/ieEqR0eL
相关问题: 如何使用LoadLibrary()和GetProcAddress()函数将ntdll.dll添加到项目库?
NtQueryInformationThread
与ThreadQuerySetWin32StartAddress
。 另一种可能是用StackWalk64
走线程的堆栈。
如果你只需要起始地址, NtQueryInformationProcess
就简单多了。 即使编码相当简洁,走栈也需要几百行代码 。
你应该可以用StackWalk64或相关函数获得堆栈跟踪,然后用dbghelp.dll解析它。
这个CodeProject文章详细解释了这一点: http : //www.codeproject.com/KB/threads/StackWalker.aspx