【问题标题】:NtQueryInformationThread always fails in my code?NtQueryInformationThread 在我的代码中总是失败?
【发布时间】:2012-06-22 09:17:11
【问题描述】:

我想使用进程 ID 和线程 ID 检索进程的线程起始地址。
这是我的代码:

DWORD WINAPI GetThreadStartAddress(DWORD tid, DWORD pid)
{

 NTSTATUS ntStatus;

 HANDLE hDupHandle;

 DWORD dwStartAddress;

 HANDLE hProcess;

HANDLE hTread;

pNtQIT NtQueryInformationThread;

hTread = OpenThread(THREAD_ALL_ACCESS, FALSE, tid);

NtQueryInformationThread = (pNtQIT)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationThread");

if(NtQueryInformationThread == NULL)
    return 0;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
SuspendThread(hTread);
if(!DuplicateHandle(hProcess, hTread, hProcess, &hDupHandle, THREAD_QUERY_INFORMATION, FALSE, 0)){

    SetLastError(ERROR_ACCESS_DENIED);

    return 0;

}

ntStatus = NtQueryInformationThread(hDupHandle, ThreadQuerySetWin32StartAddress, &dwStartAddress, sizeof(DWORD), NULL);
ResumeThread(hTread );
CloseHandle(hTread);
CloseHandle(hProcess);

CloseHandle(hDupHandle);



if (ntStatus != 0)
    return 0;

return dwStartAddress;

}

但 ntStatus 总是不为 0。为什么?

【问题讨论】:

  • ntStatus 的值是多少?来自文档:“NTSTATUS 错误代码的形式和意义在 DDK 中可用的 Ntstatus.h 头文件中列出,并在内核模式驱动程序架构/设计指南/驱动程序编程技术/记录错误下的 DDK 文档中进行了描述。”
  • 您是否为调用进程启用了SeDebugPrivilege?您还应该检查来自OpenThread()OpenProcess() 的返回值。
  • 我不知道 SeDebugPrivilege 是什么!我该如何启用它?它们运行良好且不返回 NULL。
  • dwStartAddress 也应该是 PVOID,尤其是在 64 位 Windows 上运行时。

标签: c windows multithreading winapi


【解决方案1】:

假设pid 指向您尝试获取信息的进程,那么您将在该远程进程的上下文中创建hDupHandle,而不是您自己的。您自己的进程可能有也可能没有具有相同数值的句柄,但它不是您打算使用的。

此外,出于同样的原因,您正在从远程进程复制一个随机句柄,而不是从 OpenThread 获得的句柄。

DuplicateHandle的调用应该是

DuplicateHandle(GetCurrentProcess(), hTread, GetCurrentProcess(), &hDupHandle, 
  THREAD_QUERY_INFORMATION, FALSE, 0)

虽然我不知道你为什么要复制句柄而不是直接使用它。

【讨论】:

    【解决方案2】:

    OpenThread & OpenProcess 可能会失败(尤其是由于权限不足)。在调用 NtQueryInformationThread 之前,您需要确保您有有效的句柄。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      相关资源
      最近更新 更多