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


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

Система предоставляет одну блокировку отмены спина, которая получается или освобождается при вызове определенных системных подпрограмм.

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

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

Получение блокировки отмены спина гарантирует, что только вызывающий объект может изменить отменяемое состояние этого IRP. В то время как вызывающий объект удерживает спин-блокировку, диспетчер операций ввода-вывода не может вызвать процедуру отмены драйвера для этого IRP. Аналогичным образом, другая подпрограмма драйвера, например dispatchCleanup , не может одновременно попытаться изменить отменяемое состояние этого IRP.

В драйверах, которые управляют собственными очередями IRP и используют предоставленные драйвером спиновые блокировки для синхронизации доступа к очередям, подпрограммам драйвера не нужно получать блокировку отмены спина перед вызовом IoSetCancelRoutine. Тем не менее эти драйверы должны проверка указатель на подпрограмму Отмена, который возвращает IoSetCancelRoutine, чтобы определить, запущена ли подпрограмма Отмена. Дополнительные сведения см. в статье Использование Driver-Supplied спиновой блокировки .

Любая подпрограмма драйвера, которая вызывает IoAcquireCancelSpinLock , должна вызывать IoReleaseCancelSpinLock как можно скорее.

Драйвер никогда не должен вызывать IoCompleteRequest с IRP, удерживая спин-блокировку. Попытка завершить IRP при удержании спиновой блокировки может привести к взаимоблокировки.