ロックの規則セット (Storport)
これらの規則を使用して、ドライバーが共有リソースを正しく管理していることを確認します。
このセクションの内容
裁判官 | 説明 |
---|---|
CancelSpinLock Rule (Storport) ルールでは、 IoAcquireCancelSpinLock への各呼び出しの後に、 IoReleaseCancelSpinLock の呼び出しが迅速に続くことを確認します。 |
|
QueuedSpinLock ルールは、 KeAcquireInStackQueuedSpinLock を使用して取得されたスタック内キュースピン ロックが、 KeReleaseInStackQueuedSpinLock を使用して迅速にリリースされるのを確認します。 さらに、ディスパッチ ルーチンまたはキャンセル ルーチンの終了時に、ドライバーはロックを保持できません。 |
|
このルールでは、最初に KeAcquireInStackQueuedSpinLock を介してロックを取得せずに、ドライバーが KeReleaseInStackQueuedSpinLock を呼び出さないことが検証されます。 |
|
このルールでは、 KeAcquireSpinLock の呼び出しの後に KeReleaseSpinlock への呼び出しが迅速に続くことが検証されます。 ドライバーが、ロックをリリースする前に KeAcquireSpinLockRaiseToDpc または KeAcquireSpinLock を再度呼び出した場合、ルールは失敗します。 さらに、ディスパッチ ルーチンまたはキャンセル ルーチンを終了する前に、ドライバーはスピン ロックをリリースする必要があります。 |
|
このルールでは、 KeAcquireSpinLock の呼び出しの後に KeAcquireSpinLockRaiseToDpc への呼び出しが迅速に続くことが検証されます。 ドライバーが、ロックをリリースする前に KeAcquireSpinLock または KeAcquireSpinLockRaiseToDpc を再度呼び出した場合、ルールは失敗します。 さらに、ディスパッチ ルーチンまたはキャンセル ルーチンを終了する前に、ドライバーはスピン ロックをリリースする必要があります。 |
|
この規則は、最初に KeAquireSpinlock または KeAcquireSpinLockRaiseToDpc を使用して取得しないと、ドライバーが KeReleaseSpinLock 経由でロックを解放しようとしないことを確認します。 取得したスピン ロックが解放されると、ルールが渡されます。 |
|
この規則は、スピン ロックを 保持しているときに IoStartNextPacket ルーチンと IoCompleteRequest ルーチンが呼び出されないことを確認します。 ルールは、保持されているスピン ロックの数をいつでも追跡し、いずれかのルーチンが呼び出されたときにその数が 0 でない場合、ドライバーはルールに失敗します。 |
|
PORT_CONFIGURATION_INFORMATION (Storport) 構造体の InterruptSynchronizationMode メンバーが InterruptSynchronizePerMessage に設定されている場合にのみ、メッセージの MSI スピン ロックを取得するには、ミニポート ドライバーが必要です。 このルールでは、同期モードが InterruptSynchronizePerMessage の場合にのみ、 StorPortAcquireMSISpinLock の呼び出しが行われることが検証されます。 |
|
このルールでは、 StorPortAcquireSpinLock を介して取得されたロックが、 StorPortReleaseSpinLock を介して迅速にリリースされていることが検証されます。 ミニポート ドライバーは、既に取得したロックを取得しようとした場合、または取得していないロックをリリースしようとした場合、ルールに失敗します。 さらに、ディスパッチ ルーチンまたはキャンセル ルーチンの終了時に、ドライバーはスピン ロックを保持できません。 |
|
StorPortSpinLock3 ルールでは、 StorPortAcquireSpinLock ルーチンのドキュメントで説明されているロック取得階層を検証します。 |
|
この規則は、 StorPortSpinLock の リリース に対応します。 SpinLockRelease ルールに似ています。 |
Irql ルール セットをロックするには
Microsoft Visual Studio でドライバー プロジェクト (.vcxProj) を選択します。 [ドライバー] メニューから [静的ドライバー検証ツールの起動...] をクリックします。
[ルール] タブをクリックします。 [ルール セット] で、 [Locking] を選択します。
Visual Studio の開発者コマンド プロンプト ウィンドウから既定のルール セットを選択するには、/check オプションで Locking.sdv を指定します。 次に例を示します。
msbuild /t:sdv /p:Inputs="/check:Locking.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
詳細については、「静的ドライバー検証ツールを使用して、ドライバーの欠陥を検出する」と「静的ドライバー検証ツールコマンド (MSBuild)」を参照してください。