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

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

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

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; в драйвере и затем эхо (n.PID); это на самом деле работает … Я понятия не имею, почему PCHAR вызывает проблемы, но это, скорее всего, так. Есть идеи, как это исправить?

0

Решение

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]