我有这种代码的和平作为驱动程序的一部分。此驱动程序适用于Windows 7 x64,因此它在同一系统上执行。
PVOID GetProcessInformation(ULONG PID)
{
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
HANDLE hProcess;
PEPROCESS pProcess = NULL;
PVOID pProcInfo = NULL;
ULONG ulRet = 0;
if ((pProcInfo = ExAllocatePoolWithTag(NonPagedPool, sizeof(PROCESS_BASIC_INFORMATION), 'QPI')) == NULL)
{
DbgPrint("ExAllocatePoolWithTag failed");
return NULL;
}
ntStatus = PsLookupProcessByProcessId(PID, &pProcess);
if (!NT_SUCCESS(ntStatus))
{
DbgPrint("PsLookupProcessByProcessId Returned: 0x%08x\n", ntStatus);
ExFreePool(pProcInfo);
return NULL;
}
ntStatus = ObOpenObjectByPointer(pProcess, 0, NULL, 0, 0, KernelMode, &hProcess);
if (!NT_SUCCESS(ntStatus))
{
DbgPrint("ObOpenObjectByPointer sReturned: 0x%08x\n", ntStatus);
ExFreePool(pProcInfo);
return NULL;
}
ObDereferenceObject(pProcess);
ntStatus = ZwQueryInformationProcess(hProcess, ProcessBasicInformation, pProcInfo, sizeof(PROCESS_BASIC_INFORMATION), &ulRet);
if (!NT_SUCCESS(ntStatus))
{
DbgPrint("ZwQueryInformationProcess Returned: 0x%08x\n", ntStatus);
ExFreePool(pProcInfo);
return NULL;
}
if (ulRet != sizeof(PROCESS_BASIC_INFORMATION))
DbgPrint("Warning : ZwQueryInformationProcess Returned Length is different than ProcessInformationLength");
return pProcInfo;
}
在ntddk中定义的PROCESS_BASIC_INFORMATION。 PID值是正确的。但是ZwQueryInformationProcess的结果很奇怪。我只得到PEB地址的下半部分(PROCESS_BASIC_INFORMATION结构中的PPEB部分)。例如,另一个工具说PPEB等于0x000007FFFFFDC000。我的驱动程序只知道0xFFFDC000。我也尝试PsGetprocessPeb(...)函数,结果相同。 ZwQueryInformationProcess函数是成功的。
更正:
为了解决问题,我只得到你问题的PEB地址的一小部分,
因为pProcess
是一个指针,使用指针格式说明符:%p
。
ntStatus = PsLookupProcessByProcessId(PID, &pProcess);
// your error handling code
printf("PsLookupProcessByProcessId: 0x%p\n", pProcess);
"%p"
pointer format specifier将参数显示为十六进制地址。