私はCでミニWindowsプロセスエクスプローラーに取り組んでいます。スレッドへのハンドルがあります。
そのスレッドの開始アドレスを取得するにはどうすればよいですか? このようなもの:
3 に答える
そのような質問は、数日前にすでに尋ねられました。サンプル ソリューションは次のとおりです。
DWORD WINAPI GetThreadStartAddress(HANDLE hThread)
{
NTSTATUS ntStatus;
HANDLE hDupHandle;
DWORD dwStartAddress;
pNtQIT NtQueryInformationThread = (pNtQIT)GetProcAddress(GetModuleHandle("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
。もう 1 つの可能性は、スレッドのスタックを でウォークすることStackWalk64
です。
開始アドレスのみが必要な場合NtQueryInformationProcess
は、はるかに簡単です。かなり簡潔なコーディングでも、スタックをたどるには数百行程度のコードが必要です。
StackWalk64または関連する関数を使用してスタック トレースを取得し、それを dbghelp.dll で解析できるはずです。
この CodeProject の記事では、すべて詳細に説明しています: http://www.codeproject.com/KB/threads/StackWalker.aspx