Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Система предоставляет одну отменяемую блокировку спина , которая захватывается или освобождается при вызове определенных системных подпрограмм.
Подпрограммы драйверов, которые изменяют текущее состояние отменяемых IRP, включая все подпрограммы, которые могут завершить IRP со статусом STATUS_CANCELLED, должны получить и освободить внутреннюю блокировку отмены согласно рекомендациям раздела.
В драйверах, использующих очередь устройств, предоставленную диспетчером ввода-вывода, все подпрограммы драйвера, отличные от подпрограммы отмены, которые изменяют отменяемое состояние IRP, необходимо сначала вызвать IoAcquireCancelSpinLock, чтобы получить системную блокировку спина отмены.
Получение блокировки спин-замка отмены гарантирует, что только вызывающая сторона может изменить отменяемое состояние этого IRP. Хотя вызывающий объект удерживает блокировку спина, диспетчер ввода-вывода не может вызывать драйвера отмены подпрограммы для этого IRP. Аналогичным образом, другая подпрограмма драйвера, например dispatchCleanup подпрограмма, не может одновременно пытаться изменить отменяемое состояние этого IRP.
В драйверах, которые управляют собственными очередями IRP и используют спин-блокировки, предоставляемые драйвером, для синхронизации доступа к очереди, подпрограммы драйверов не должны получать блокировку отмены перед вызовом IoSetCancelRoutine. Однако эти драйверы должны проверить указатель подпрограммы отмены, который возвращает IoSetCancelRoutine, чтобы определить, началась ли подпрограмма отмены. Дополнительные сведения см. в статье Использование Driver-Supplied спин-блокировки.
Любая подпрограмма драйвера, вызывающая IoAcquireCancelSpinLock, должна вызывать IoReleaseCancelSpinLock как можно скорее.
Драйвер никогда не должен вызывать IoCompleteRequest с IRP, удерживая крутящуюся блокировку. Попытка завершить IRP при удержании спинлока может вызвать зависание.