ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 49
- 50
- 51
- 52
- 53
- …
- следующая ›
- последняя »