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

UptoLike

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

55
PDEVICE_EXTENSION pdx)
{
StartNextPacket(&pdx->dqSomething, fdo); //a
IoCompleteRequest(Irp, boost); //b
}
a. StartNextPacket удаляет следующий IRP из очереди и посылает его
StartIo,
b. IoCompleteRequest завершает IRP, указанный в первом аргументе;
второй аргумент задает приращение приоритета для потока,
ожидающего этого IRP.
3.14 Функции завершения
Для получения драйвером вышележащего уровня информации о
результатах выполнения конкретного запроса ввода-вывода IRP драйвером
нижележащего уровня (CompletionNotification) можно
вызвать функцию
IoSetCompletionRoutine():
VOID loSetCompletionRoutine(IN PIRP Irp,
IN PIO_COMPLETION_ROUTINE CompletionRoutine,
INPVOID Context,
IN BOOLEAN InvokeOnSuccess,
IN BOOLEAN InvokeOnError,
IN BOOLEAN InvokeOnCahcel);
Здесь Irpуказатель на IRP, информация о завершении которого
необходима, CompletionRoutineуказатель на точку входа драйвера,
вызываемую при завершении IRP, Contextопределенное драйвером значение,
которое нужно передать как третий параметр для точки входа
CompletionRoutine, InvokeOnSuccess, InvokeOnError, IwokeOnCancel
параметры, которые указывают, должна ли точка входа CompletionRoutine быть
вызвана при завершении IRP с указанным состоянием
.
          PDEVICE_EXTENSION pdx)
          {
          …
          StartNextPacket(&pdx->dqSomething, fdo);                  //a
          IoCompleteRequest(Irp, boost);                            //b
          }
     a. StartNextPacket удаляет следующий IRP из очереди и посылает его
          StartIo,
     b. IoCompleteRequest завершает IRP, указанный в первом аргументе;
          второй      аргумент    задает       приращение        приоритета     для     потока,
          ожидающего этого IRP.


     3.14 Функции завершения
     Для       получения      драйвером        вышележащего       уровня      информации     о
результатах выполнения конкретного запроса ввода-вывода IRP драйвером
нижележащего         уровня    (CompletionNotification)       можно       вызвать     функцию
IoSetCompletionRoutine():
     VOID loSetCompletionRoutine(IN PIRP Irp,
     IN PIO_COMPLETION_ROUTINE CompletionRoutine,
     INPVOID Context,
     IN BOOLEAN InvokeOnSuccess,
     IN BOOLEAN InvokeOnError,
     IN BOOLEAN InvokeOnCahcel);
     Здесь Irp – указатель на IRP, информация о завершении которого
необходима,      CompletionRoutine         –    указатель   на    точку     входа     драйвера,
вызываемую при завершении IRP, Context – определенное драйвером значение,
которое       нужно    передать     как        третий   параметр      для      точки     входа
CompletionRoutine,         InvokeOnSuccess,          InvokeOnError,       IwokeOnCancel      –
параметры, которые указывают, должна ли точка входа CompletionRoutine быть
вызвана при завершении IRP с указанным состоянием.




                                                55