IrpTracking の規則セット (WDM)

これらのルールを使用して、IRP が未処理のときにデバイスが削除されないよう、ドライバーが I/O 要求パケット (IRP) を正しく追跡することを検証します。

このセクションの内容

トピック 説明

IoReleaseRemoveLockAndWaitOutsideRemoveDevice

IoReleaseRemoveLockAndWaitOutsideRemoveDevice 規則では、PnP ドライバーの IRP_MN_REMOVE_DEVICE を使用して、IoReleaseRemoveLockAndWait を IRP_MJ_PNP の外部で呼び出さないでください。

NsRemoveLockMnRemove

NsRemoveLockMnRemove ルールは、MinorFunction IRP_MN_REMOVE_DEVICEでIRP_MJ_PNP を処理するときに、ドライバーが STATUS_NOT_SUPPORTED を返さないよう検証します。 この規則は、FDO ドライバーと FIDO ドライバーだけに適用されます。

NsRemoveLockMnSurpriseRemove

NsRemoveLockMnSurpriseRemove ルールは、minorFunction IRP_MN_SUPRISE_REMOVAL で IRP_MJ_PNP 要求を処理するときに、ドライバーが STATUS_NOT_SUPPORTED を返さないことを確認します。 この規則は、FDO ドライバーと FIDO ドライバーだけに適用されます。

NsRemoveLockQueryMnRemove

NsRemoveLockQueryMnRemove ルールは、MinorFunction IRP_MN_QUERY_REMOVE で IRP_MJ_PNP を処理するときに、ドライバーが STATUS_NOT_SUPPORTED を返さないよう検証します。 この規則は、FDO ドライバーと FIDO ドライバーだけに適用されます。

RemoveLock

RemoveLock ルールは、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが正しく使用されるように指定します。 加えて、IRP_MJ_PNP または IRP_MJ_POWER ルーチンの最後に、ドライバーは RemoveLock を保持しないでください。

RemoveLockCheck

RemoveLockCheck ルールは、MinorFunction IRP_MN_REMOVE_DEVICE で IRP_MJ_PNP を処理するときに、IoAcquireRemoveLock と IoReleaseRemoveLockAndWait の呼び出しが正しく使用されているかを検証します。

RemoveLockForward

RemoveLockForward 規則は、IRP を別のデバイスに転送するときに、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが正しく使用されていることを確認します。

RemoveLockForward2

RemoveLockForward2 ルールは、IRP を別のデバイスに転送するときに、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが正しく使用されているかを検証します。

RemoveLockForwardDeviceControl

RemoveLockForwardDeviceControl ルールは、ドライバーが IoCallDriver を使用して IRP を別のデバイスに転送するときに、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが正しく使用されていることを確認します。

RemoveLockForwardDeviceControl2

RemoveLockForwardDeviceControl2 ルールは、ドライバーが IoCallDriver を使用して IRP を別のデバイスに転送するときに、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが正しく使用されることを確認します。

RemoveLockForwardDeviceControlInternal

RemoveLockForwardDeviceControlInternal ルールは、IoCallDriver を使用して別のデバイスに IRP を転送するときに、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが正しく使用されていることを確認します。

RemoveLockForwardDeviceControlInternal2

RemoveLockForwardDeviceControlInternal2 規則は、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが、IoCallDriver を使用して別のデバイスに IRP を転送するときに正しく使用されていることを確認します。

RemoveLockForwardRead

RemoveLockForwardRead ルールは、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが正しく使用されているかを検証します。

RemoveLockForwardRead2

RemoveLockForwardRead2 規則は、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが、IoCallDriver を使用して別のデバイスに IRP を転送するときに正しく使用されることを確認します。

RemoveLockForwardWrite

RemoveLockForwardWrite 規則は、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが、IoCallDriver を使用して別のデバイスに IRP を転送するときに正しく使用されることを確認します。

RemoveLockForwardWrite2

RemoveLockForwardWrite2 規則は、IoAcquireRemoveLock と IoReleaseRemoveLock への呼び出しが、IoCallDriver を使用して別のデバイスに IRP を転送するときに正しく使用されることを確認します。

RemoveLockMnRemove

RemoveLockMnRemove ルールは、MinorFunction IRP_MN_REMOVE_DEVICE で IRP_MJ_PNP を処理するときに、IoAcquireRemoveLock と IoReleaseRemoveLockAndWait の呼び出しが正しく使用されているかを検証します。

RemoveLockMnRemove2

RemoveLockMnRemove2 ルールは、IRP が下位ドライバーに転送される前に、IRP_MN_REMOVE_DEVICE 要求を処理するときに、IoAcquireRemoveLock と IoReleaseRemoveLockAndWait への呼び出しが正しく使用されているかを検証します。

RemoveLockMnSurpriseRemove

RemoveLockMnSurpriseRemove ルールは、MinorFunction IRP_MN_SUPRISE_REMOVAL で IRP_MJ_PNP を処理するときに、IoAcquireRemoveLock と IoReleaseRemoveLockAndWait の呼び出しが正しく使用されているかを検証します。 ドライバーは、スタックの下に IRP を転送する前に削除ロックを取得する必要があります。

RemoveLockQueryMnRemove

RemoveLockQueryMnRemove ルールは、MinorFunction IRP_MN_QUERY_REMOVE_DEVICE で IRP_MJ_PNP を処理するときに、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが正しく使用されているかを検証します。 ドライバーは、スタックの下に IRP を転送する前に削除ロックを取得する必要があります。

RemoveLockRelease2

ルール RemoveLockRelease2 は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleaseCleanup

RemoveLockReleaseCleanup ルールは、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを指定します。 IoAcquireRemoveLock の各呼び出しには、 IoReleaseRemoveLock への呼び出しと一致する呼び出しが必要です。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleaseClose

ルール RemoveLockReleaseClose は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleaseCreate

RemoveLockReleaseCreate ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleaseDeviceControl

RemoveLockReleaseDeviceControl ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleaseInternalDeviceControl

RemoveLockReleaseInternalDeviceControl ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleasePnp

RemoveLockReleasePnp ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleasePower

RemoveLockReleasePower ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleaseRead

RemoveLockReleaseRead ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleaseShutdown

RemoveLockReleaseShutdown ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleaseSystemControl

RemoveLockReleaseSystemControl ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

RemoveLockReleaseWrite

RemoveLockReleaseWrite ルール は、IoAcquireRemoveLock と IoReleaseRemoveLock の呼び出しが厳密な代替で使用されているかを検証します。 加えて、ディスパッチ ルーチンの最後に、ドライバーが削除ロックを保持していないようにしてください。

IrpTracking ルール セットを選択するには

  1. Microsoft Visual Studio でドライバー プロジェクト (.vcxProj) を選択します。 [ドライバー] メニューから [静的ドライバー検証ツールの起動...] をクリックします。

  2. [ルール] タブをクリックします。[ルール セット] で、[IrpTracking] を選択します。

    Visual Studio の開発者コマンド プロンプト ウィンドウから既定のルール セットを選択するには、/check オプションで IrpTracking.sdv を指定します。 次に例を示します。

    msbuild /t:sdv /p:Inputs="/check:IrpTracking.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    詳細については、「静的ドライバー検証ツールを使用して、ドライバーの欠陥を検出する」と「静的ドライバー検証ツールコマンド (MSBuild)」をご参照ください。