Общие сведения об отмене процедур
Любой драйвер, в котором irP могут находиться в состоянии ожидания в течение неопределенного интервала времени, должен иметь одну или несколько процедур отмены . Например, драйвер клавиатуры может бесконечно ждать нажатия клавиши пользователем. И наоборот, если драйвер никогда не будет ставить в очередь больше IRP, чем он может завершить за пять минут, ему, вероятно, не потребуется процедура отмены .
Предположим, поток пользовательского режима выполняет запрос ввода-вывода, который помещается в очередь подпрограммой диспетчеризации драйвера устройства самого высокого уровня, и запрашивающий поток завершается, пока IRP помещается в очередь. Поставщики irPs, помещенные в очередь от имени завершенного потока, должны быть отменены. Следовательно, драйвер должен задать предоставленную драйвером процедуру отмены в каждой очереди IRP.
Драйвер, создающий связанные irp, должен отменить их при отмене master IRP. Так как связанные irp не связаны с потоком запроса, подпрограмма отмены master IRP отвечает за отмену всех связанных irp при отмене master IRP.
Количество процедур отмены , которые имеет любой драйвер, зависит от его структуры. Как правило, драйвер должен иметь подпрограмму Отмена для каждого этапа обработки ввода-вывода, на котором IRP может находиться в состоянии ожидания в течение неопределенного интервала времени. Считается, что такие ожидающие IRP находятся в состоянии отмены.
Примите во внимание следующие рекомендации по проектированию:
Драйвер верхнего уровня в цепочке многоуровневых драйверов должен иметь по крайней мере одну процедуру отмены , если он помещает в очередь IRP или иным образом удерживает IRP в отменяемом состоянии. При необходимости в нем может быть несколько подпрограмм отмены .
Драйверы более низкого уровня, в которых IRP могут храниться в состоянии отмены в течение относительно длительных интервалов времени, также должны иметь одну или несколько процедур отмены .
Если драйвер управляет собственными внутренними очередями IRP, он должен иметь отдельную подпрограмму отмены для каждой из своих очередей.
Некоторые драйверы самого высокого уровня для интерактивных устройств, такие как клавиатура, мышь, звук, параллельные классы и последовательные драйверы, должны иметь процедуры отмены . Некоторые драйверы более низкого уровня, например драйвер параллельного порта, который содержит irps, помещенные в очередь для некоторого количества драйверов класса более высокого уровня на относительно длительные интервалы времени, также должны иметь процедуры отмены .
Драйверы запоминающих устройств, а также промежуточные драйверы, наложенные на них, вряд ли будут иметь процедуры отмены . За отмену запросов файлового ввода-вывода отвечает драйвер файловой системы, в то время как входные данные IRP для драйверов хранилища с более низким уровнем памяти обычно обрабатываются слишком быстро, чтобы их можно было отменить.