Ошибка нарушения доступа после DeviceIoControl

Я пытаюсь отправить INOUT_PARAM своему драйверу ядра, и, кажется, мне это удалось. Когда я пытаюсь отредактировать его и отправить обратно в приложение, я получаю следующую ошибку: < img src="https://i.stack.imgur.com/gjk7y.png" alt="ошибка">

Вот код приложения:

typedef struct _INOUT_PARAM {
    ULONG PID;
    ULONG Addr;
    PCHAR Str;
    ULONG RAddr;
    PCHAR RStr;
} INOUT_PARAM, *PINOUTPARAM;

INOUT_PARAM TellDriver(DWORD IOCTL, INOUT_PARAM rtmp)
{
    INOUT_PARAM tmp = rtmp;
    HANDLE          h;
    DWORD           bytesIO;

    h = CreateFile(TEXT("\\\\.\\KJPA"), GENERIC_READ | GENERIC_WRITE,
        0, NULL, OPEN_EXISTING, 0, NULL);
    if (h != INVALID_HANDLE_VALUE) {

        DeviceIoControl(h, IOCTL,
            &tmp, sizeof(tmp), &tmp,
            sizeof(tmp), &bytesIO, NULL);
        CloseHandle(h);
    }
    return tmp;
}

int __cdecl main(int argc, char* argv[])
{
    echo("Input some text for IOCTL_Entry");
    gecho();

    INOUT_PARAM parms;
    initParms(&parms);

    INOUT_PARAM n = TellDriver(IOCTL_ENTRY, parms);
    echo(n.RStr);

    gecho();
    return 0;
}

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

NTSTATUS Function_IRP_DEVICE_CONTROL(PDEVICE_OBJECT pDeviceObject, PIRP Irp)
{
    NTSTATUS                status = STATUS_SUCCESS;
    ULONG                   bytesIO = 0;
    PIO_STACK_LOCATION      stack;
    BOOLEAN                 condition = FALSE;

    PINOUTPARAM             wp;

    UNREFERENCED_PARAMETER(pDeviceObject);

    stack = IoGetCurrentIrpStackLocation(Irp);

    if (stack == NULL) {
        status = STATUS_INTERNAL_ERROR;
    }

    wp = (PINOUTPARAM)Irp->AssociatedIrp.SystemBuffer;

    wp->RStr = "Test";

    Irp->IoStatus.Status = status;
    Irp->IoStatus.Information = sizeof(INOUT_PARAM);

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    return status;
}

Кажется, я не могу найти, в чем проблема, любая помощь будет оценена по достоинству.

Заранее спасибо.

Примечание. Когда я отправляю INOUT_PARAM без wp->RStr = "Test"; он успешно повторяет начальное значение, что означает, что редактирование или чтение отредактированной памяти драйвером не работает должным образом.

Примечание 2. Ошибка появляется только тогда, когда я вывожу/вывожу значение n.RStr PCHAR.

ВАЖНОЕ ПРИМЕЧАНИЕ: если у меня wp->PID = 6969; в драйвере, а затем echo(n.PID); это действительно работает ... Я понятия не имею, почему PCHAR вызывает проблемы, но, скорее всего, это так. Есть идеи, как это исправить?


person Johnaudi    schedule 13.03.2016    source источник


Ответы (1)


Я нашел решение, чтобы заставить его работать. Я использовал следующее:

typedef struct _INOUT_PARAM {
    ULONG PID;
    ULONG Addr;
    CHAR Str[1024];
    ULONG RAddr;
    CHAR RStr[1024];
} INOUT_PARAM, *PINOUTPARAM;

Изменение PCHAR на Char[] действительно помогло — я использовал strcpy() для своих строк. Но я не понимаю, почему, любое объяснение, пожалуйста? Я не буду отмечать это как ответ, как будто объяснение для меня важнее ответа.

person Johnaudi    schedule 14.03.2016