1
因爲大多數關於http://undocumented.ntinternals.net上這個特定問題的鏈接顯然已經死亡,並且NtQueryInfoThread和相關的THREADINFOCLASSes已經從Winternl.h消失了。我現在坐在這裏掙扎找到我知道句柄的過程的TEB。 我嘗試從ntdll.dll加載方法,這是另一種解決方案,似乎工作,但遺憾的是我仍然無法獲得所需的地址。通過它的線程處理獲取線程的TIB/TEB(2015)
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指出,這種做法不應再使用。)
最好的問候,
亞歷
謝謝你,我通過您的代碼閱讀,並注意到在我自己犯了一些錯誤。我的一個無關但重要的錯誤是,我仍然有winternal.h包括在內。當我試圖再次聲明THREADINFOCLASS時,我收到了類型錯誤(因此在我的第一次嘗試中投) 我也注意到NTSTATUS在很多情況下返回0xc000008之前,這應該是我首先檢查的東西...因此顯然,我在從其他進程中得到句柄的方式中也出現了一個錯誤,導致了一堆無效的線程句柄。 謝謝! –