【发布时间】:2015-11-24 16:08:26
【问题描述】:
由于http://undocumented.ntinternals.net 上指向此特定问题的大多数链接显然已失效,并且 NtQueryInfoThread 以及相关的 THREADINFOCLASSes 已从 Winternl.h 中消失,所以我现在坐在这里努力寻找我知道的进程的 TEB 句柄. 我尝试从 ntdll.dll 加载该方法,这是另一种似乎可行的解决方案,但遗憾的是我仍然无法获得所需的地址。
typedef NTSTATUS(*ThreadInfoProc)(HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG);
PVOID CProcessHelper::GetThreadStackTopAddress(HANDLE hThread)
{
HINSTANCE ntdllInstance;
ThreadInfoProc NtQueryInfoThread;
ntdllInstance = LoadLibrary("Ntdll.dll");
if (ntdllInstance != NULL)
{
NtQueryInfoThread = (ThreadInfoProc)GetProcAddress(ntdllInstance, "NtQueryInformationThread");
if (NtQueryInfoThread != NULL)
{
THREAD_BASIC_INFORMATION bi;
NT_TIB tib;
NTSTATUS ntstat = 0;
NTSTATUS ntstat = (NtQueryInfoThread)(hThread, (THREADINFOCLASS)0, &bi, sizeof(THREAD_BASIC_INFORMATION),NULL);
ReadProcessMemory(CurrentProcessHandle, bi.TebBaseAddress, &tib, sizeof(NT_TIB), 0);
PrintHex(tib.StackBase); // output: CCCCCCCCCC
}
}
return nullptr;
}
有没有其他方法,也许使用公共 api 调用来获取线程的 TEB? (正如 MSDN 所说,不应再使用这种方法。)
最好的问候,
亚历克斯
【问题讨论】:
标签: c++ multithreading memory process handle