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
[入力/出力]返されるとロック ハンドルを格納するバッファーへのポインター。 ロックを解除するには、呼び出し元がこのハンドルを 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、割り込み (の SynchronizationModel メンバー PORT_CONFIGURATION_INFORMATION が StorSynchronizeHalfDuplex に設定されている場合) |
HwStorResetBusの | Startio、割り込み (の SynchronizationModel メンバー PORT_CONFIGURATION_INFORMATION が StorSynchronizeHalfDuplex に設定されている場合) |
HwStorAdapterControlの | 何一つ。 (Windows Server 2003 では、コントロールの種類が ScsiStopAdapter の場合、StartIo スピン ロックが保持されていました)。 |
HwStorUnitControlの | 何一つ |
HwStorTracingEnabledの | 何一つ |
HwStorPassiveInitializeRoutineの | 何一つ |
HwStorDpcRoutineの | 何一つ |
HwStorStateChangeの | Startio、割り込み (の SynchronizationModel メンバー PORT_CONFIGURATION_INFORMATION が StorSynchronizeHalfDuplex に設定されている場合) |
スピン ロックは次の順序で取得する必要があるため、ポート ドライバーによって保持されるロックは、コールバック ルーチンを取得できるロックに影響します。
- DPC または StartIo
- 割り込む
たとえば、ポート ドライバーがコールバック ルーチンを呼び出す前に 割り込み スピン ロックを取得した場合、そのコールバック ルーチンは、DPC または startIo スピン ロック 取得できなくなります。これは、DPC と StartIo スピン ロックが 割り込み スピン ロックよりも低い順序であるためです。 一方、ポート ドライバーがコールバック ルーチンを呼び出す前に、StartIo スピン ロックを取得した場合でも、そのコールバック ルーチンは、実行時に、割り込み または DPC スピン ロックを取得できます。
次の表は、各ミニポート ドライバー ルーチンが取得できるスピン ロックを示しています。 ミニポート ドライバー ルーチンが StartIo スピン ロックと 割り込み スピン ロックの両方を取得する必要がある場合、ルーチンは常に最初に StartIo スピン ロックを取得する必要があります。
ミニポート ドライバー ルーチン | 許可されたスピン ロック |
---|---|
HwStorFindAdapterの | 何一つ |
HwStorInitializeの | 何一つ |
HwStorInterrupt | 何一つ |
HwMSIInterruptRoutineの | 何一つ |
HwStorStartIoをする | DPC、割り込み。 StartIo は、仮想ミニポート ドライバーで、または複数の同時実行チャネルを使用する物理ミニポート ドライバーから取得できることに注意してください。 |
HwStorBuildIoの | DPC、StartIo、割り込み |
HwStorTimerの | 割り込み (PORT_CONFIGURATION_INFORMATIONSynchronizationModel メンバーが StorSynchronizeHalfDuplex に設定されていない場合) |
HwStorResetBusの | 割り込み (PORT_CONFIGURATION_INFORMATIONSynchronizationModel メンバーが StorSynchronizeHalfDuplex に設定されていない場合) |
HwStorAdapterControlの | DPC、StartIo、割り込み。 (Windows Server 2003 では、コントロールの種類が ScsiStopAdapter の場合、スピン ロックは許可されません)。 |
HwStorUnitControlの | DPC、StartIo、割り込み |
HwStorTracingEnabledの | DPC、StartIo、割り込み |
HwStorPassiveInitializeRoutineの | 何一つ |
HwStorDpcRoutineの | DPC、StartIo、割り込み |
HwStorStateChangeの | 割り込み (PORT_CONFIGURATION_INFORMATIONSynchronizationModel メンバーが StorSynchronizeHalfDuplex に設定されていない場合) |
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 10 バージョン 1809 |
ヘッダー | storport.h |
関連項目
StorPortReleaseSpinLockの