StorPortAcquireSpinLockEx 函数 (storport.h)
StorPortAcquireSpinLockEx 例程获取指定的旋转锁。
语法
ULONG StorPortAcquireSpinLockEx(
PVOID HwDeviceExtension,
STOR_SPINLOCK SpinLock,
PVOID LockContext,
PSTOR_LOCK_HANDLE LockHandle
);
参数
HwDeviceExtension
[in]指向每个适配器设备扩展的微型端口驱动程序的指针。
SpinLock
[in]指定要获取的旋转锁的 STOR_SPINLOCK 类型的枚举器值。
LockContext
[in]如果 SpinLock 设置为 DpcLock,则指向锁定的 DPC 对象的指针。 如果 SpinLock 指示 InterruptLock 类型或 StartIoLock,则此成员应为 NULL。
LockHandle
[in/out]指向返回的缓冲区的指针将包含锁句柄。 若要释放锁,调用方必须将此句柄传递给 StorPortReleaseSpinLock 例程。
返回值
StorPortAcquireSpinLockEx 成功获取旋转锁时返回STOR_STATUS_SUCCESS。 否则,它将返回如下状态代码之一:
状态代码 | 描述 |
---|---|
STOR_STATUS_INVALID_PARAMETER | 参数无效。 |
STOR_STATUS_INVALID_IRQL | 调用方在尝试获取的 SpinLock 类型 的 IRQL 无效。 |
言论
微型端口驱动程序必须确保它们不会尝试获取已持有的锁或按不正确的顺序获取锁。 其中任一错误都将导致系统死锁。
某些锁在调用微型端口驱动程序回调例程之前由端口驱动程序自动保留。 对于每个微型端口驱动程序回调例程,下表指示在调用回调例程之前,端口驱动程序会自动获取哪些锁。
微型端口驱动程序例程 | 端口驱动程序持有的旋转锁 |
---|---|
HwStorFindAdapter | 没有 |
HwStorInitialize | 中断(物理微型端口)、无(虚拟微型端口) |
HwStorInterrupt | 中断 |
HwMSIInterruptRoutine | 中断 |
HwStorStartIo | StartIo (仅当请求的并发通道 <= 1 时的物理微型端口) |
HwStorBuildIo | 没有 |
HwStorTimer | Startio,中断(当 SynchronizationModelPORT_CONFIGURATION_INFORMATION 成员设置为 StorSynchronizeHalfDuplex) |
HwStorResetBus | Startio,中断(当 SynchronizationModelPORT_CONFIGURATION_INFORMATION 成员设置为 StorSynchronizeHalfDuplex) |
HwStorAdapterControl | 没有。 (在 Windows Server 2003 中,当控件类型为 ScsiStopAdapter 时,StartIo 旋转锁被保留。 |
HwStorUnitControl | 没有 |
HwStorTracingEnabled | 没有 |
HwStorPassiveInitializeRoutine | 没有 |
HwStorDpcRoutine | 没有 |
HwStorStateChange | Startio,中断(当 SynchronizationModelPORT_CONFIGURATION_INFORMATION 成员设置为 StorSynchronizeHalfDuplex) |
端口驱动程序持有的锁会影响允许获取回调例程的锁,因为必须按以下顺序获取旋转锁:
- DPC 或 StartIo
- 中断
例如,如果端口驱动程序在调用回调例程之前获取 中断 旋转锁,该回调例程将无法再获取 DPC 或 StartIo 旋转锁,因为 DPC 和 StartIo 旋转锁的顺序低于 中断 旋转锁。 另一方面,如果端口驱动程序在调用回调例程之前获取 StartIo 旋转锁,则执行该回调例程仍可能获取 中断 或 DPC 旋转锁。
下表指示每个微型端口驱动程序例程可以获取哪些旋转锁。 如果微型端口驱动程序例程必须同时获取 StartIo 旋转锁和 中断 旋转锁,则例程必须始终首先获取 StartIo 旋转锁。
微型端口驱动程序例程 | 允许的旋转锁 |
---|---|
HwStorFindAdapter | 没有 |
HwStorInitialize | 没有 |
HwStorInterrupt | 没有 |
HwMSIInterruptRoutine | 没有 |
HwStorStartIo | DPC,中断。 请注意,StartIo 可以在虚拟微型端口驱动程序或使用多个并发通道的物理微型端口驱动程序中获取。 |
HwStorBuildIo | DPC、StartIo、中断 |
HwStorTimer | 中断(当 SynchronizationModel 成员 PORT_CONFIGURATION_INFORMATION 未设置为 StorSynchronizeHalfDuplex) |
HwStorResetBus | 中断(当 SynchronizationModel 成员 PORT_CONFIGURATION_INFORMATION 未设置为 StorSynchronizeHalfDuplex) |
HwStorAdapterControl | DPC、StartIo、中断。 (在 Windows Server 2003 中,当控件类型为 ScsiStopAdapter 时,不允许任何旋转锁。 |
HwStorUnitControl | DPC、StartIo、中断 |
HwStorTracingEnabled | DPC、StartIo、中断 |
HwStorPassiveInitializeRoutine | 没有 |
HwStorDpcRoutine | DPC、StartIo、中断 |
HwStorStateChange | 中断(当 SynchronizationModel 成员 PORT_CONFIGURATION_INFORMATION 未设置为 StorSynchronizeHalfDuplex) |
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 10 版本 1809 |
标头 | storport.h |