ВУЗ:
Составители:
57
то есть в стеке размещения ввода/вывода нижележащего драйвера. Из этого
следуют два важных вывода:
− если драйвер установит функцию завершения для некоторого IRP и
завершит этот IRP, функция завершения не будет вызвана,
− драйвер низшего уровня (либо монолитный драйвер) не может
устанавливать функции завершения, так как, во-первых, это
бессмысленно
(см. предыдущий вывод), а во-вторых, это ошибка, так как
следующего (за текущим) стека размещения ввода/вывода для таких
драйверов не существует.
Функция завершения вызывается при том же уровне IRQL, при котором
нижележащим драйвером была вызвана функция завершения обработки IRP –
loComplete Request(). Это может быть любой уровень IRQL меньший либо
равный
IRQL_ DISPATCH_LEVEL.
Если драйвер вышележащего уровня создавал новые пакеты IRP для
передачи драйверу нижележащего уровня, он обязан использовать функцию
завершения для этих IRP, причем параметры InvokeOnSuccess, InvokeOnError,
IwokeOnCancel должны быть установлены в TRUE.
В этих случаях функция завершения должна освободить созданные
драйвером IRP с помощью функции IoFreeIrp() и завершить первоначальный
пакет IRP.
Функция завершения может возвращать два возможных значения [3]:
STATUS_MORE_PROCESSING_REQUIRED (требуется
дополнительная обработка) – процесс завершения немедленно отменяется.
Любое другое значение просто разрешает продолжить процесс завершения.
Так как все значения, кроме STATUS_MORE_PROCESSING_REQUIRED
имеют один и тот же смысл, целесообразно использовать код
STATUS_SACCESS.
то есть в стеке размещения ввода/вывода нижележащего драйвера. Из этого следуют два важных вывода: − если драйвер установит функцию завершения для некоторого IRP и завершит этот IRP, функция завершения не будет вызвана, − драйвер низшего уровня (либо монолитный драйвер) не может устанавливать функции завершения, так как, во-первых, это бессмысленно (см. предыдущий вывод), а во-вторых, это ошибка, так как следующего (за текущим) стека размещения ввода/вывода для таких драйверов не существует. Функция завершения вызывается при том же уровне IRQL, при котором нижележащим драйвером была вызвана функция завершения обработки IRP – loComplete Request(). Это может быть любой уровень IRQL меньший либо равный IRQL_ DISPATCH_LEVEL. Если драйвер вышележащего уровня создавал новые пакеты IRP для передачи драйверу нижележащего уровня, он обязан использовать функцию завершения для этих IRP, причем параметры InvokeOnSuccess, InvokeOnError, IwokeOnCancel должны быть установлены в TRUE. В этих случаях функция завершения должна освободить созданные драйвером IRP с помощью функции IoFreeIrp() и завершить первоначальный пакет IRP. Функция завершения может возвращать два возможных значения [3]: STATUS_MORE_PROCESSING_REQUIRED (требуется дополнительная обработка) – процесс завершения немедленно отменяется. Любое другое значение просто разрешает продолжить процесс завершения. Так как все значения, кроме STATUS_MORE_PROCESSING_REQUIRED имеют один и тот же смысл, целесообразно использовать код STATUS_SACCESS. 57
Страницы
- « первая
- ‹ предыдущая
- …
- 55
- 56
- 57
- 58
- 59
- …
- следующая ›
- последняя »