Организация ввода-вывода. Драйверы WDM. Рощин А.В. - 51 стр.

UptoLike

Составители: 

51
вызов функций завершения, установленных разными драйверами,
снятие блокировки со страниц MDL (Memory Descriptor List),
ассоциированных с IRP (они связаны с буферами запросов чтения и
записи),
планирование специального APC режима ядра для выполнения итоговой
зачистки.
В итоговую зачистку, в частности, входит:
копирование входных данных обратно в пользовательский буфер,
копирование итогового состояния IRP,
установка события, которого ожидает создатель IRP.
3.9 Передача IRP вниз по стеку
Возможность простой передачи IRP с одного уровня на следующий,
низший, обеспечивает создаваемая иерархия объектов устройств.
Создание стека объектов устройств обеспечивается, в частности, функцией
AddDevice:
pdx->LowerDeviceObject = IoAttachDeviceToDeviceStack(fdo, pdo);
Здесь fdoадрес вашего объекта устройства, а pdoадрес физического
объекта устройства на нижнем уровне стека устройств. Функция
IoAttachDeviceToDeviceStack возвращает адрес объекта устройства,
расположенного непосредственно под вашим объектом. Для передачи IRP,
полученного с высшего уровня, именно этот объект устройства указывается в
функции IoCallDriver.
При передаче IRP на низший уровень, на программиста
драйвера
возлагаются обязанности по инициализации структуры IO_STACK_LOCATION.
Данные из этой структуры используются следующим драйвером для получения
параметров.
Простейший способ инициализациифизическое копирование:
IoCopyCurrentIrpStackLocationToNext(Irp);
status = IoCallDriver(pdx->LowerDeviceObject, Irp);
     − вызов функций завершения, установленных разными драйверами,
     − снятие блокировки со страниц MDL (Memory Descriptor List),
          ассоциированных с IRP (они связаны с буферами запросов чтения и
          записи),
     − планирование специального APC режима ядра для выполнения итоговой
          зачистки.
     В итоговую зачистку, в частности, входит:
     − копирование входных данных обратно в пользовательский буфер,
     − копирование итогового состояния IRP,
     − установка события, которого ожидает создатель IRP.


     3.9 Передача IRP вниз по стеку
     Возможность простой передачи IRP с одного уровня на следующий,
низший, обеспечивает создаваемая иерархия объектов устройств.
     Создание стека объектов устройств обеспечивается, в частности, функцией
AddDevice:
pdx->LowerDeviceObject = IoAttachDeviceToDeviceStack(fdo, pdo);
     Здесь fdo – адрес вашего объекта устройства, а pdo – адрес физического
объекта     устройства   на   нижнем    уровне    стека   устройств.     Функция
IoAttachDeviceToDeviceStack      возвращает      адрес    объекта      устройства,
расположенного непосредственно под вашим объектом. Для передачи IRP,
полученного с высшего уровня, именно этот объект устройства указывается в
функции IoCallDriver.
     При передаче IRP на низший уровень, на программиста драйвера
возлагаются обязанности по инициализации структуры IO_STACK_LOCATION.
Данные из этой структуры используются следующим драйвером для получения
параметров.
     Простейший способ инициализации – физическое копирование:
     …
     IoCopyCurrentIrpStackLocationToNext(Irp);
     status = IoCallDriver(pdx->LowerDeviceObject, Irp);
                                       51