C NtQueryInformationThread在我的代码中总是失败吗?
我想使用进程ID和线程ID检索进程的线程开始地址。C NtQueryInformationThread在我的代码中总是失败吗?,c,windows,multithreading,winapi,C,Windows,Multithreading,Winapi,我想使用进程ID和线程ID检索进程的线程开始地址。 这是我的密码: DWORD WINAPI GetThreadStartAddress(DWORD tid, DWORD pid) { NTSTATUS ntStatus; HANDLE hDupHandle; DWORD dwStartAddress; HANDLE hProcess; HANDLE hTread; pNtQIT NtQueryInformationThread; hTread = OpenThread(T
这是我的密码:
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。为什么?假设
pid
指向您试图获取有关信息的进程,您是在该远程进程的上下文中创建hDupHandle
。您自己的进程可能有一个具有相同数值的句柄,也可能没有,但它不是您想要使用的句柄
同样,出于同样的原因,您正在从远程进程复制一个随机句柄,而不是从OpenThread获得的句柄
对DuplicateHandle
的调用应该是
DuplicateHandle(GetCurrentProcess(), hTread, GetCurrentProcess(), &hDupHandle,
THREAD_QUERY_INFORMATION, FALSE, 0)
虽然我不知道为什么您首先要复制句柄,而不是直接使用它。OpenThread&OpenProcess可能会失败(特别是由于权限不足)。在调用NtQueryInformationThread之前,需要确保具有有效的句柄。ntStatus的值是多少?文档中:“NTSTATUS错误代码的形式和意义列在DDK中可用的NTSTATUS.h头文件中,并在DDK文档的内核模式驱动程序体系结构/设计指南/驱动程序编程技术/日志错误下进行了描述。”您是否为调用过程启用了
SeDebugPrivilege
?您还应该检查OpenThread()
和OpenProcess()
的返回值。我不知道SeDebugPrivilege是什么!我如何启用它?它们工作正常,不返回NULL。而且dwStartAddress
应该是PVOID
,尤其是在64位Windows上运行时。