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

UptoLike

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

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