ВУЗ:
Составители:
47
− асинхронные IRP могут создаваться как в произвольных, так и в
фиксированных потоках,
− так как диспетчер ввода-вывода не следит за завершением IRP,
программист драйвера должен подготовить функцию завершения,
которая вызовет IoFreeIrp для освобождения памяти, занятой IRP,
− программист драйвера должен позаботиться об отмене IRP, когда
надобность в их
выполнении отпадет,
− так как завершения асинхронных IRP дожидаться не надо, их можно
создавать и отправлять на более высоких уровнях IRQL (<=
DISPATCH_LEVEL); при этом надо следить за тем, чтобы тот драйвер,
которому направляется этот IRP, мог обрабатывать его на повышенном
уровне IRQL; поэтому же возможны создание и отправка асинхронных
IRP при
захвате быстрого мьютекса.
3.6 Передача пакета диспетчерской функции
После создания IRP (синхронного или асинхронного) можно вызвать
функцию IoGetNextIrpStackLocation для получения указателя на первый элемент
стека. Затем необходимо инициализировать первый элемент.
Если IRP был создан функцией IoAllocateIrp, необходимо заполнить поле
MajorFunction (возможно и другие). При создании IRP другими функциями
необходимость инициализации
первого элемента зависит от типа IRP (может
оказаться, что всю необходимую инициализацию уже выполнил диспетчер ввода-
вывода).
После инициализации стека IRP посылается драйверу устройства функцией
IoCallDriver:
PDEVICE_OBJECT DeviceObject // получено извне
PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp);
stack->MajorFunction = IRP_MJ_Xxx;
… // прочая инициализация стека (если необходимо)
NTSTATUS status = IoCallDriver(DeviceObject, Irp);
− асинхронные IRP могут создаваться как в произвольных, так и в фиксированных потоках, − так как диспетчер ввода-вывода не следит за завершением IRP, программист драйвера должен подготовить функцию завершения, которая вызовет IoFreeIrp для освобождения памяти, занятой IRP, − программист драйвера должен позаботиться об отмене IRP, когда надобность в их выполнении отпадет, − так как завершения асинхронных IRP дожидаться не надо, их можно создавать и отправлять на более высоких уровнях IRQL (<= DISPATCH_LEVEL); при этом надо следить за тем, чтобы тот драйвер, которому направляется этот IRP, мог обрабатывать его на повышенном уровне IRQL; поэтому же возможны создание и отправка асинхронных IRP при захвате быстрого мьютекса. 3.6 Передача пакета диспетчерской функции После создания IRP (синхронного или асинхронного) можно вызвать функцию IoGetNextIrpStackLocation для получения указателя на первый элемент стека. Затем необходимо инициализировать первый элемент. Если IRP был создан функцией IoAllocateIrp, необходимо заполнить поле MajorFunction (возможно и другие). При создании IRP другими функциями необходимость инициализации первого элемента зависит от типа IRP (может оказаться, что всю необходимую инициализацию уже выполнил диспетчер ввода- вывода). После инициализации стека IRP посылается драйверу устройства функцией IoCallDriver: PDEVICE_OBJECT DeviceObject // получено извне PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp); stack->MajorFunction = IRP_MJ_Xxx; … // прочая инициализация стека (если необходимо) NTSTATUS status = IoCallDriver(DeviceObject, Irp); 47
Страницы
- « первая
- ‹ предыдущая
- …
- 45
- 46
- 47
- 48
- 49
- …
- следующая ›
- последняя »