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

UptoLike

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

65
}
}
Примечания к коду.
1. Сначала IoCancelIrp захватывает глобальную спин-блокировку отмены.
Старые драйверы часто использовали эту блокировку, поэтому неизбежно
возникали коллизии при попытке ее использования в процессе обычной
обработки IRP. Новые драйверы используют эту блокировку лишь на короткое
время обработки отмены IRP.
2. Установка флага Cancel = TRUE сообщает всем, что для этого пакета
была вызвана функция IoCancelIrp.
3. Функция IoSetCancelRoutine получает текущий указатель на
CancelRoutine и задает поле равным NULL в течение одной операции.
4. IoCancelIrp вызывает функцию отмены, если она присутствует, без
предварительной освобождения глобальной спин-блокировки отмены. Поэтому
блокировку следует освободить функцией отмены. Следует также обратить
внимание на то, что аргумент объекта устройства
, передаваемый функции
отмены, берется из текущей позиции стека, где он должен был быть оставлен
функцией IoCallDriver.
5. Если функция отмены отсутствует, функция IoCancelIrp сама
освобождает глобальную спин-блокировку.
3.19 Сценарии обработки IRP
Несмотря на все сложности, связанные с обработкой IRP, на практике
встречаются лишь восемь сценариев, существенно отличающихся друг от друга
[3]. Рассмотрим последовательно эти сценарии.
Сценарий 1: передача вниз с функцией завершения
IRP, направленный вашему драйверу, перенаправляется драйверу низшего
уровня в стеке PnP, при этом выполняется некоторая заключительная обработка в
функции завершения (рисунок 3.8).
  }
 }
      Примечания к коду.
      1. Сначала IoCancelIrp захватывает глобальную спин-блокировку отмены.
Старые драйверы часто использовали эту блокировку, поэтому неизбежно
возникали коллизии при попытке ее использования в процессе обычной
обработки IRP. Новые драйверы используют эту блокировку лишь на короткое
время обработки отмены IRP.
      2. Установка флага Cancel = TRUE сообщает всем, что для этого пакета
была вызвана функция IoCancelIrp.
      3.   Функция   IoSetCancelRoutine     получает    текущий   указатель     на
CancelRoutine и задает поле равным NULL в течение одной операции.
      4. IoCancelIrp вызывает функцию отмены, если она присутствует, без
предварительной освобождения глобальной спин-блокировки отмены. Поэтому
блокировку следует освободить функцией отмены. Следует также обратить
внимание на то, что аргумент объекта устройства, передаваемый функции
отмены, берется из текущей позиции стека, где он должен был быть оставлен
функцией IoCallDriver.
      5.   Если   функция   отмены   отсутствует,   функция   IoCancelIrp     сама
освобождает глобальную спин-блокировку.


      3.19 Сценарии обработки IRP
      Несмотря на все сложности, связанные с обработкой IRP,       на практике
встречаются лишь восемь сценариев, существенно отличающихся друг от друга
[3]. Рассмотрим последовательно эти сценарии.
      Сценарий 1: передача вниз с функцией завершения
      IRP, направленный вашему драйверу, перенаправляется драйверу низшего
уровня в стеке PnP, при этом выполняется некоторая заключительная обработка в
функции завершения (рисунок 3.8).




                                       65