2016-03-13 4 views
0

Я пытаюсь отправить INOUT_PARAM в мой драйвер ядра, и кажется, что я преуспел. Как я пытаюсь изменить его и отправить его обратно в приложение я получаю следующее сообщение об ошибке: errorОшибка доступа при нарушении DeviceIoControl

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

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: Ошибка появляется только в том случае, если I echo/cout значение n.RStr PCHAR.

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

ответ

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^