Завершение запроса в/в
Для завершения запроса 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