8

私はCでミニWindowsプロセスエクスプローラーに取り組んでいます。スレッドへのハンドルがあります。
そのスレッドの開始アドレスを取得するにはどうすればよいですか? このようなもの:
ここに画像の説明を入力

4

3 に答える 3

7

そのような質問は、数日前にすでに尋ねられました。サンプル ソリューションは次のとおりです。

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 を追加する方法を教えてください。

于 2012-06-21T22:57:39.280 に答える
4

NtQueryInformationThreadThreadQuerySetWin32StartAddress。もう 1 つの可能性は、スレッドのスタックを でウォークすることStackWalk64です。

開始アドレスのみが必要な場合NtQueryInformationProcessは、はるかに簡単です。かなり簡潔なコーディングでも、スタックをたどるには数百程度のコードが必要です。

于 2012-06-21T22:52:17.243 に答える
1

StackWalk64または関連する関数を使用してスタック トレースを取得し、それを dbghelp.dll で解析できるはずです。

この CodeProject の記事では、すべて詳細に説明しています: http://www.codeproject.com/KB/threads/StackWalker.aspx

于 2012-06-21T22:51:19.413 に答える