У меня есть этот код в составе драйвера.Этот драйвер предназначен для 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;
}
PROCESS_BASIC_INFORMATION, определенный в ntddk.Значение PID правильное.Но результат ZwQueryInformationProcess странный.Я получаю только нижнюю часть адреса PEB (часть PPEB в структуре PROCESS_BASIC_INFORMATION).Например, другой инструмент сообщает, что PPEB равен 0x000007FFFFFDC000.Мои драйверы знают только 0xFFFDC000.Также я пробую функцию PsGetprocessPeb (...), с тем же результатом.Функция ZwQueryInformationProcess выполнена успешно.