Поделиться через


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

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

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

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

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

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

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

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

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

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

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

В этом разделе включены следующие темы по синхронизации отмены IRP.

Использование системной аннуляции спин-блокировки

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

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

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