Синхронизация отмены IRP

С точки зрения водителя, IRP можно отменить в любое время. Отмена IRP выполняется асинхронно; таким образом, водители должны иметь возможность обрабатывать ряд потенциальных условий гонки, созданных в случае отмены IRP в любой из следующих моментов:

  • После вызова подпрограммы драйвера, но перед тем, как она ставит в очередь IRP.

  • После вызова подпрограммы драйвера, но до того, как она попытается обработать IRP. Например, IRP может быть отменен после вызова подпрограммы StartIo драйвера, но до того, как подпрограмма StartIo удалит IRP из очереди устройств.

  • После того, как драйвер вывел из очереди IRP, но до запуска запрошенного ввода-вывода.

Обратите внимание, что после того, как драйвер помещает в очередь IRP и освобождает все блокировки спина, защищающие очередь, другой поток может получить доступ к IRP и изменить его. Когда исходный поток возобновляется ( даже после следующей строки кода), IRP может быть уже отменен или иным образом изменен.

Драйвер может использовать безопасную для отмены платформу очередей IRP для реализации очереди IRP. Затем система регистрирует подпрограмму отмены для драйвера, который автоматически обрабатывает синхронизацию для безопасной отмены IRP. Дополнительные сведения см. в разделе Отмена безопасных очередей IRP . В противном случае драйверы должны реализовать собственную синхронизацию.

Следующие элементы IRP содержат сведения об отмене:

  • Irp-> Отмена указывает, отменяется ли IRP или должна быть отменена.

  • Irp-> CancelRoutine указывает, является ли IRP отмененным. Если этот элемент содержит указатель на подпрограмму отмены, то IRP можно отменить. Если этот элемент имеет значение NULL, то IRP не может быть отменен. Если этот элемент имеет значение NULL, но задан параметр Irp-Cancel>, это означает, что подпрограмма отмены запущена и IRP находится в процессе отмены.

Если драйвер обрабатывает отменяемые irP, он отвечает за настройку соответствующей процедуры отмены в каждом IRP, который он хранит в состоянии отмены.

Этот раздел содержит следующие разделы, посвященные синхронизации отмены IRP.

Использование системной блокировки отмены спина

Синхронизация отмены в подпрограммах драйвера, обрабатывающих IRP

Синхронизация отмены в драйверах Higher-Level без процедур отмены

Использование Driver-Supplied спин-блокировки