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

时间:2012-06-22 09:17:11

标签: 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(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.为什么?

2 个答案:

答案 0 :(得分:1)

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

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

DuplicateHandle的调用应为

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

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

答案 1 :(得分:1)

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