使用系统的取消自旋锁

系统提供单个 取消旋转锁,在调用某些系统例程时获取或释放该锁。

更改可取消 IRP 状态的驱动程序例程(包括可能使用STATUS_CANCELLED完成 IRP 的所有例程)必须根据本部分中的准则获取并释放系统取消旋转锁。

在使用 I/O 管理器提供的设备队列的驱动程序中,除 取消 例程之外更改 IRP 可取消状态的任何驱动程序例程都必须首先调用 IoAcquireCancelSpinLock 以获取系统取消旋转锁。

获取取消自旋锁可确保只有调用方才能更改该 IRP 的可取消状态。 当调用方持有旋转锁时,I/O 管理器无法为该 IRP 调用驱动程序的 Cancel 例程。 同样,另一个驱动程序例程(如 DispatchCleanup 例程)不能同时尝试更改该 IRP 的可取消状态。

在管理自己的 IRP 队列并使用驱动程序提供的旋转锁来同步队列访问的驱动程序中,驱动程序例程不需要在调用 IoSetCancelRoutine 之前获取取消旋转锁。 但是,这些驱动程序应检查 IoSetCancelRoutine 返回的 Cancel 例程指针,以确定 Cancel 例程是否已启动。 有关详细信息 ,请参阅使用Driver-Supplied旋转锁

调用 IoAcquireCancelSpinLock 的任何驱动程序例程都必须尽快调用 IoReleaseCancelSpinLock

驱动程序不得在按住旋转锁时使用 IRP 调用 IoCompleteRequest 。 尝试在按住旋转锁时完成 IRP 可能会导致死锁。