Пример обработки

Завершение запроса в/в

Для завершения запроса IRP, необходимо установить поле Irp->IoStatus.Information равным числу прочитанных/записанных в буфер байт. В случае буферизованного в/в это поле укажет Диспетчеру в/в, сколько байт нужно скопировать из промежуточного буфера в невыгружаемой области системного адресного пространства в пользовательский буфер.

Пример получения адресов и длин буферов в диспетчерской функции драйвера.

stack = IoGetCurrentIrpStackLocation(Irp);

switch (pIrpStack->MajorFunction)

{

case IRP_MJ_CREATE:

case IRP_MJ_CLOSE:

break;

case IRP_MJ_DEVICE_CONTROL:

switch (stack->Parameters.DeviceIoControl.IoControlCode)

{

case IOCTL_MY_BUFFERED:

InBuffer = Irp->AssociatedIrp.SystemBuffer;

InLength = stack->Parameters.DeviceIoControl.InputBuffer.Length;

OutBuffer = Irp->AssociatedIrp.SystemBuffer;

OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;

case IOCTL_MY_IN_DIRECT:

//OutBuffer доступен только для чтения

InBuffer = Irp->AssociatedIrp.SystemBuffer;

InLength = stack->Parameters.DeviceIoControl.InputBufferLength;

OutBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);

OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;

break;

case IOCTL_MY_OUT_DIRECT:

//OutBuffer доступен для чтения/записи

InBuffer = Irp->AssociatedIrp.SystemBuffer;

InLength = stack->Parameters.DeviceIoControl.InputBufferLength;

OutBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);

OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;

break;

case IOCTL_MY_NEITHER:

InBuffer = irpStack->Parameters.DeviceIoControl.Type3InputBuffer;

InLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;

OutBuffer = Irp->UserBuffer;

OutLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;

break;

}


Лекция №7-8. Подсистема в/в. Пакеты запросов ввода/вывода (IRP)............................................................................................... 1

[7.1] Подсистема в/в и её характеристики......................................................................................................................................... 1

[7.2] Структура IRP............................................................................................................................................................................. 1

[7.2.1] Поля в Фиксированной части IRP...................................................................................................................................... 3

[7.2.2.] Поля в Стеке размещения Ввода - вывода IRP............................................................................................................... 4

[7.3] Описание Буфера Данных.......................................................................................................................................................... 5

[7.4] Коды Функции Ввода - вывода................................................................................................................................................. 6

[8.1] Передача данных посредством IRP и диспетчерские точки входа драйвера.......................................................................... 8

[8.1.1] Запросы чтения и записи IRP_MJ_READ и IRP_MJ_WRITE.......................................................................................... 9

[8.1.1.1] Определение метода передачи буфера для запросов чтения-записи......................................................................... 9

[8.1.1.2] Получение буфера...................................................................................................................................................... 10

[8.1.1.3] Завершение запроса в/в.............................................................................................................................................. 10

[8.1.1.4] Пример обработки запросов чтения/записи.............................................................................................................. 10

[8.1.2] IRP_MJ_DEVICE_CONTROL и IRP_MJ_INTERNAL_DEVICE_CONTROL............................................................ 10

[8.1.2.1] Пояснения по использованию................................................................................................................................... 10

[8.1.2.2] Задание кода управления вводом/выводом (IOCTL).............................................................................................. 11

[8.1.2.3] Получение буфера...................................................................................................................................................... 13

[8.1.2.4] Завершение запроса в/в.............................................................................................................................................. 15

[8.1.2.5] Пример обработки...................................................................................................................................................... 15


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: