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

UptoLike

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

63
Следует отметить, что последним аргументом функции StartPacket должна
быть передана функция отмены.
При завершении IRP в функции DPC вызывается функция
StartNextPacket.
VOID DpcForIsr(PKDPC junk1, PDEVICE_OBJECT fdo, PIRP junk2,
PDEVICE_EXTENSION pdx)
{
StartNextPacket(pdx->dqReadWrite, fdo);
}
3.18 Отмена запросов ввода-вывода
Достаточно часто возникает необходимость в отмене запроса ввода-вывода.
Например, приложение может завершиться после выдачи запроса, но до его
выполнения. Появление нового оборудования также может потребовать
приостановки запросов, пока менеджер конфигурации не закончит настройку.
Чтобы отменить запрос ввода-вывода в режиме ядра, кто-то должен
вызвать
функцию IoCancelIrp. Система автоматически вызовет IoCancelIrp для всех IRP,
принадлежащих потоку, завершаемому с необработанными запросами.
Приложение пользовательского режима может вызвать CancelIo, чтобы
отменить все незавершенные асинхронные операции, выданные потоком для
дескриптора (handle) файла. IoCancelIrp могла бы просто завершить указанный
IRP с кодом завершения STATUS_CANCELED. Однако, функция IoCancelIrp не
знает, где находятся
указатели на IRP, и еще она не знает, обрабатывается ли
данный IRP в данное время, или нет.
Если бы в системе не было многозадачности, и был только один процессор,
взаимодействие диспетчера ввода-вывода с функцией StartIo было бы достаточно
простым:
При постановке IRP в очередь в поле CancelRoutine структуры
IRP
заносится адрес функции отмены. При извлечении IRP из очереди поле
CancelRoutine задается равным NULL.
     Следует отметить, что последним аргументом функции StartPacket должна
быть передана функция отмены.
     При      завершении   IRP      в    функции       DPC      вызывается   функция
StartNextPacket.
VOID DpcForIsr(PKDPC junk1, PDEVICE_OBJECT fdo, PIRP junk2,
 PDEVICE_EXTENSION pdx)
 {
 …
 StartNextPacket(pdx->dqReadWrite, fdo);
      }


     3.18 Отмена запросов ввода-вывода
     Достаточно часто возникает необходимость в отмене запроса ввода-вывода.
Например, приложение может завершиться после выдачи запроса, но до его
выполнения.    Появление   нового       оборудования    также     может   потребовать
приостановки запросов, пока менеджер конфигурации не закончит настройку.
     Чтобы отменить запрос ввода-вывода в режиме ядра, кто-то должен вызвать
функцию IoCancelIrp. Система автоматически вызовет IoCancelIrp для всех IRP,
принадлежащих потоку, завершаемому с необработанными запросами.
     Приложение пользовательского режима может вызвать CancelIo, чтобы
отменить все незавершенные асинхронные операции, выданные потоком для
дескриптора (handle) файла. IoCancelIrp могла бы просто завершить указанный
IRP с кодом завершения STATUS_CANCELED. Однако, функция IoCancelIrp не
знает, где находятся указатели на IRP, и еще она не знает, обрабатывается ли
данный IRP в данное время, или нет.
     Если бы в системе не было многозадачности, и был только один процессор,
взаимодействие диспетчера ввода-вывода с функцией StartIo было бы достаточно
простым:
     − При постановке IRP в очередь в поле CancelRoutine структуры IRP
          заносится адрес функции отмены. При извлечении IRP из очереди поле
          CancelRoutine задается равным NULL.

                                          63