次の方法で共有


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 ルールは、IoAcquireRemoveLockIoReleaseRemoveLock の呼び出しが正しく使用されるように指定します。 加えて、IRP_MJ_PNP または IRP_MJ_POWER ルーチンの最後に、ドライバーは RemoveLock を保持しないでください。

RemoveLockCheck

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

RemoveLockForward

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

RemoveLockForward2

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

RemoveLockForwardDeviceControl

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

RemoveLockForwardDeviceControl2

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

RemoveLockForwardDeviceControlInternal

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

RemoveLockForwardDeviceControlInternal2

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

RemoveLockForwardRead

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

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 を処理するときに、IoAcquireRemoveLockIoReleaseRemoveLockAndWait の呼び出しが正しく使用されているかを検証します。

RemoveLockMnRemove2

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

RemoveLockMnSurpriseRemove

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

RemoveLockQueryMnRemove

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

RemoveLockRelease2

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

RemoveLockReleaseCleanup

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

RemoveLockReleaseClose

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

RemoveLockReleaseCreate

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

RemoveLockReleaseDeviceControl

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

RemoveLockReleaseInternalDeviceControl

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

RemoveLockReleasePnp

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

RemoveLockReleasePower

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

RemoveLockReleaseRead

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

RemoveLockReleaseShutdown

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

RemoveLockReleaseSystemControl

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

RemoveLockReleaseWrite

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

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)」をご参照ください。