IrpTracking の規則セット (WDM)
これらのルールを使用して、IRP が未処理のときにデバイスが削除されないよう、ドライバーが I/O 要求パケット (IRP) を正しく追跡することを検証します。
このセクションの内容
トピック | 説明 |
---|---|
IoReleaseRemoveLockAndWaitOutsideRemoveDevice 規則では、PnP ドライバーの IRP_MN_REMOVE_DEVICE を使用して、IoReleaseRemoveLockAndWait を IRP_MJ_PNP の外部で呼び出さないでください。 |
|
NsRemoveLockMnRemove ルールは、MinorFunction IRP_MN_REMOVE_DEVICEでIRP_MJ_PNP を処理するときに、ドライバーが STATUS_NOT_SUPPORTED を返さないよう検証します。 この規則は、FDO ドライバーと FIDO ドライバーだけに適用されます。 |
|
NsRemoveLockMnSurpriseRemove ルールは、minorFunction IRP_MN_SUPRISE_REMOVAL で IRP_MJ_PNP 要求を処理するときに、ドライバーが STATUS_NOT_SUPPORTED を返さないことを確認します。 この規則は、FDO ドライバーと FIDO ドライバーだけに適用されます。 |
|
NsRemoveLockQueryMnRemove ルールは、MinorFunction IRP_MN_QUERY_REMOVE で IRP_MJ_PNP を処理するときに、ドライバーが STATUS_NOT_SUPPORTED を返さないよう検証します。 この規則は、FDO ドライバーと FIDO ドライバーだけに適用されます。 |
|
RemoveLock ルールは、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが正しく使用されるように指定します。 加えて、IRP_MJ_PNP または IRP_MJ_POWER ルーチンの最後に、ドライバーは RemoveLock を保持しないでください。 |
|
RemoveLockCheck ルールは、MinorFunction IRP_MN_REMOVE_DEVICE で IRP_MJ_PNP を処理するときに、IoAcquireRemoveLock と IoReleaseRemoveLockAndWait の呼び出しが正しく使用されているかを検証します。 |
|
RemoveLockForward 規則は、IRP を別のデバイスに転送するときに、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが正しく使用されていることを確認します。 |
|
RemoveLockForward2 ルールは、IRP を別のデバイスに転送するときに、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが正しく使用されているかを検証します。 |
|
RemoveLockForwardDeviceControl ルールは、ドライバーが IoCallDriver を使用して IRP を別のデバイスに転送するときに、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが正しく使用されていることを確認します。 |
|
RemoveLockForwardDeviceControl2 ルールは、ドライバーが IoCallDriver を使用して IRP を別のデバイスに転送するときに、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが正しく使用されることを確認します。 |
|
RemoveLockForwardDeviceControlInternal ルールは、IoCallDriver を使用して別のデバイスに IRP を転送するときに、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが正しく使用されていることを確認します。 |
|
RemoveLockForwardDeviceControlInternal2 規則は、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが、IoCallDriver を使用して別のデバイスに IRP を転送するときに正しく使用されていることを確認します。 |
|
RemoveLockForwardRead ルールは、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが正しく使用されているかを検証します。 |
|
RemoveLockForwardRead2 規則は、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが、IoCallDriver を使用して別のデバイスに IRP を転送するときに正しく使用されることを確認します。 |
|
RemoveLockForwardWrite 規則は、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが、IoCallDriver を使用して別のデバイスに IRP を転送するときに正しく使用されることを確認します。 |
|
RemoveLockForwardWrite2 規則は、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが、IoCallDriver を使用して別のデバイスに IRP を転送するときに正しく使用されることを確認します。 |
|
RemoveLockMnRemove ルールは、MinorFunction IRP_MN_REMOVE_DEVICE で IRP_MJ_PNP を処理するときに、IoAcquireRemoveLock と IoReleaseRemoveLockAndWait の呼び出しが正しく使用されているかを検証します。 |
|
RemoveLockMnRemove2 ルールは、IRP が下位ドライバーに転送される前に、IRP_MN_REMOVE_DEVICE 要求を処理するときに、IoAcquireRemoveLock と IoReleaseRemoveLockAndWait への呼び出しが正しく使用されているかを検証します。 |
|
RemoveLockMnSurpriseRemove ルールは、MinorFunction IRP_MN_SUPRISE_REMOVAL で IRP_MJ_PNP を処理するときに、IoAcquireRemoveLock と IoReleaseRemoveLockAndWait の呼び出しが正しく使用されているかを検証します。 ドライバーは、スタックの下に IRP を転送する前に削除ロックを取得する必要があります。 |
|
RemoveLockQueryMnRemove ルールは、MinorFunction IRP_MN_QUERY_REMOVE_DEVICE で IRP_MJ_PNP を処理するときに、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが正しく使用されているかを検証します。 ドライバーは、スタックの下に IRP を転送する前に削除ロックを取得する必要があります。 |
|
ルール RemoveLockRelease2 は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
RemoveLockReleaseCleanup ルールは、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを指定します。 IoAcquireRemoveLock の各呼び出しには、 IoReleaseRemoveLock への呼び出しと一致する呼び出しが必要です。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
ルール RemoveLockReleaseClose は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
RemoveLockReleaseCreate ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
RemoveLockReleaseDeviceControl ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
RemoveLockReleaseInternalDeviceControl ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
RemoveLockReleasePnp ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
RemoveLockReleasePower ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
RemoveLockReleaseRead ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
RemoveLockReleaseShutdown ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
RemoveLockReleaseSystemControl ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
|
RemoveLockReleaseWrite ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。 |
IrpTracking ルール セットを選択するには
Microsoft Visual Studio でドライバー プロジェクト (.vcxProj) を選択します。 [ドライバー] メニューから [静的ドライバー検証ツールの起動...] をクリックします。
[ルール] タブをクリックします。[ルール セット] で、[IrpTracking] を選択します。
Visual Studio の開発者コマンド プロンプト ウィンドウから既定のルール セットを選択するには、/check オプションで IrpTracking.sdv を指定します。 次に例を示します。
msbuild /t:sdv /p:Inputs="/check:IrpTracking.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
詳細については、「静的ドライバー検証ツールを使用して、ドライバーの欠陥を検出する」と「静的ドライバー検証ツールコマンド (MSBuild)」をご参照ください。