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

UptoLike

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

56
Как видно из прототипа функции, аргументы InvokeOnXxx представляют
собой логические значения, которые указывают, в какой из трех ситуаций должна
вызываться функция завершения.
InvokeOnSuccess означает, что функция завершения должна вызываться
при завершении IRP с кодом состояния, проходящим проверку NT_Success.
InvokeOnError означает, что функция завершения должна вызываться при
завершении IRP с кодом состояния
, не 1проходящим проверку NT_Success.
IwokeOnCancel означает, что функция должна вызываться в том случае,
если перед завершением была вызвана функция IoCancelIrp. На самом деле при
истинном значении параметра IwokeOnCancel проверяется флаг Cancel в IRP,
который и устанавливается функцией IoCancelIrp. Если пакет IRP завершается с
ошибкой, и истинным является параметр InvokeOnError, также будет
вызвана
функция завершения. Если истинным является параметр InvokeOnSuccess,
функция завершения будет вызвана при завершении пакета IRP без ошибки.
Хотя бы один из трех указанных параметров должен быть истинным. Если
истинными являются все три параметра, функция завершения будут вызываться
при любом завершении пакета IRP.
В качестве второго параметра в вызове loSetCompletionRoutine()
передается адрес точки входа драйвера, которая должна быть вызвана при
завершении указанного в первом параметре пакета IRP. Прототип функции
точки входа драйвера:
NTSTATUS CompletionRoutine(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context);
Здесь DeviceObjectуказатель на объект-устройство, которому
предназначался завершившийся пакет IRP, IRPуказатель на завершившийся
пакет IRP, Contextопределенное драйвером значение контекста, переданное,
когда была вызвана функция IoSetCompletionRoutine().
При вызове IoSetCompletionRoutine() указатель на функцию завершения
сохраняется в IRP в следующем после текущего стеке размещения ввода/вывода,
     Как видно из прототипа функции, аргументы InvokeOnXxx представляют
собой логические значения, которые указывают, в какой из трех ситуаций должна
вызываться функция завершения.
     InvokeOnSuccess означает, что функция завершения должна вызываться
при завершении IRP с кодом состояния, проходящим проверку NT_Success.
     InvokeOnError означает, что функция завершения должна вызываться при
завершении IRP с кодом состояния, не 1проходящим проверку NT_Success.
     IwokeOnCancel означает, что функция должна вызываться в том случае,
если перед завершением была вызвана функция IoCancelIrp. На самом деле при
истинном значении параметра IwokeOnCancel проверяется флаг Cancel в IRP,
который и устанавливается функцией IoCancelIrp. Если пакет IRP завершается с
ошибкой, и истинным является параметр InvokeOnError, также будет вызвана
функция завершения. Если истинным является параметр InvokeOnSuccess,
функция завершения будет вызвана при завершении пакета IRP без ошибки.
     Хотя бы один из трех указанных параметров должен быть истинным. Если
истинными являются все три параметра, функция завершения будут вызываться
при любом завершении пакета IRP.
     В качестве     второго   параметра     в   вызове   loSetCompletionRoutine()
передается адрес точки входа драйвера, которая должна быть вызвана при
завершении указанного в первом параметре пакета IRP. Прототип функции –
точки входа драйвера:
     NTSTATUS CompletionRoutine(IN PDEVICE_OBJECT DeviceObject,
     IN PIRP Irp,
     IN PVOID Context);
     Здесь   DeviceObject     –   указатель     на   объект-устройство,   которому
предназначался завершившийся пакет IRP, IRP – указатель на завершившийся
пакет IRP, Context – определенное драйвером значение контекста, переданное,
когда была вызвана функция IoSetCompletionRoutine().
     При вызове IoSetCompletionRoutine() указатель на функцию завершения
сохраняется в IRP в следующем после текущего стеке размещения ввода/вывода,


                                       56