Windows Драйвер IOCTL неверный возврат; - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь выполнить IOCTL (связь между KM и UM)

Дело здесь в том, чтобы получить базовый адрес процесса.

Вот моя функция в моем драйвере:

PVOID ioBuffer = NULL;
PUCHAR UserBuffer;
PIO_STACK_LOCATION io;
io = IoGetCurrentIrpStackLocation(irp);
ULONG inputBufferLength = NULL;
ULONG outputBufferLength = NULL;
ULONG ioControlCode = NULL;
PIO_STACK_LOCATION irpStack;
BASE_ADDRESS2 info = { 0 };
BASE_ADDRESS pOutput = { 0 };
    
irpStack = IoGetCurrentIrpStackLocation(irp);
ioBuffer = (*irp).AssociatedIrp.SystemBuffer;
inputBufferLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
    
if (inputBufferLength >= sizeof(BASE_ADDRESS2) &&
outputBufferLength >= sizeof(PBASE_ADDRESS) && ioBuffer) {
irp->IoStatus.Status = GetModuleBaseAddress((PBASE_ADDRESS)ioBuffer, &pOutput);
memcpy(ioBuffer, &pOutput, sizeof(pOutput));
irp->IoStatus.Information = sizeof(pOutput);
DbgPrintEx(0, 0, "pOutput.baseaddress :%p\n", pOutput.baseAddress);
DbgPrintEx(0, 0, "IoStatus.Information :%p\n", irp->IoStatus.Information);
IoCompleteRequest(irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}

Моя отладочная печать показывает, что я правильно получаю базовый адрес: Возврат из dbgview

Однако, когда я возвращаю это значение в свое приложение единой системы обмена сообщениями, я получаю 0:

    typedef struct _BASEADDRESS
        {
            ULONGLONG baseAddress;
        } BASE_ADDRESS, * PBASE_ADDRESS;
    
        typedef struct _BASEADDRESS2
        {
            LONG pid;
        } BASE_ADDRESS2, * PBASE_ADDRESS2;


        DWORD bytes = 0;
        HANDLE DriverHdl;
        BASE_ADDRESS2 info = { 0 };
        BASE_ADDRESS pResult = { 0 };
        info.pid = pID;
        HANDLE hDevice = INVALID_HANDLE_VALUE;
        hDevice = CreateFileW(DRIVER_NAME, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
        if (!hDevice)
            return 0;

        if (DeviceIoControl(hDevice, IOCTL_BASEADDR, &info, sizeof(info), &pResult, sizeof(pResult), &bytes, nullptr))
            printf("%08p", pResult.baseAddress);
        return pResult.baseAddress;

Здесь pResult всегда равен 0.

Есть идеи, что я делаю неправильно? Честно говоря, новинка в C.

1 Ответ

0 голосов
/ 20 июня 2020

Отметьте ссылки https://docs.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-deviceiocontrol

Если ваша функция DeviceIoControl возвращает 0, что означает, что операция завершилась неудачно или ожидает выполнения, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Вы также можете указать https://docs.microsoft.com/en-us/windows/win32/DevIO/calling-deviceiocontrol, например.

...