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. 另一种可能性是使用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 回答