Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C NtQueryInformationThread在我的代码中总是失败吗?_C_Windows_Multithreading_Winapi - Fatal编程技术网

C NtQueryInformationThread在我的代码中总是失败吗?

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

我想使用进程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。为什么?

假设
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上运行时。