указатель на неполный тип класса недопустим при использовании типа PPEB для получения пути к образу процесса в драйвере ядра windows - PullRequest
0 голосов
/ 10 февраля 2020

Я пишу драйвер ядра windows, поэтому мне нужно получить путь к процессу. Я написал GetProcessPath функцию, но мой код вызывает ошибку: pointer to incomplete class type is not allowed для myPEB (тип PPEB) переменной. Поэтому я могу Не используйте myPEB->ProcessParameters->ImagePathName для получения пути к процессу. Пожалуйста, помогите мне решить эту проблему. Я использую Visual Studio 2019, Last SDK и Last WDK.

PVOID
GetProcessPath()
{
    NTSTATUS status;

    if (NT_SUCCESS(InitZwQueryInformationProcess())) {
        __try {

            PEPROCESS peProcess = IoGetCurrentProcess();
            HANDLE hObjectProcess;
            OBJECT_ATTRIBUTES   objectAttributes;
            CLIENT_ID           ٌlientID;
            ULONG returnedLength;

            InitializeObjectAttributes(&objectAttributes, 0, OBJ_KERNEL_HANDLE, 0, 0);
            ٌlientID.UniqueProcess = PsGetProcessId(peProcess);
            ٌlientID.UniqueThread = 0;

            status = ZwOpenProcess(&hObjectProcess,
                0x0400,
                &objectAttributes,
                &ٌlientID);

            if (!NT_SUCCESS(status)) {
                DbgPrint("GetProcessFileName: ZwOpenProcess failed: %08X\n", status);
                return NULL;
            }

            status = ZwQueryInformationProcess(hObjectProcess, ProcessImageFileName, NULL, 0, &returnedLength);
            if (status == STATUS_INFO_LENGTH_MISMATCH)
            {

                PROCESS_BASIC_INFORMATION  pProcInfo;
                ULONG ulRet = 0;
                status = ZwQueryInformationProcess(hObjectProcess, ProcessBasicInformation, &pProcInfo, sizeof(PROCESS_BASIC_INFORMATION), &ulRet);
                if (NT_SUCCESS(status)) 
                {
                    PPEB myPEB = NULL;
                    myPEB = pProcInfo.PebBaseAddress;
                    if (myPEB != NULL)
                    {
                        //pointer to incomplete class type is not allowed is here:
                        return myPEB->ProcessParameters->ImagePathName;
                    }
                    ZwClose(hObjectProcess);

                }
            }
            ZwClose(hObjectProcess);
        }
        __except (EXCEPTION_EXECUTE_HANDLER) {
            DbgPrint("GetProcessFileName: EXCEPTION - %08x\n", GetExceptionCode());
        }
    }
    return NULL;
}
...