次の方法で共有


IrpProcessing の規則セット (WDM)

これらのルールを使用して、ドライバーが I/O 要求パケット (IRP) を正しく処理するかを確認します。

このセクションの内容

裁判官 説明

CompleteRequest

CompleteRequest ルールは、完了ルーチンの実行後に IoCompleteRequest ルーチンが呼び出されないこと、および STATUS_MORE_PROCESSING_REQUIRED を返さないことを確認します。

CompleteRequestStatusCheck

CompleteRequestStatusCheck 規則は、IRP の I/O 状態値が下位ドライバーから返された状態値と一致することを確認します。

CompletionRoutineRegistered

CompletionRoutineRegistered ルールは、ディスパッチ ルーチンが IoSetCompletionRoutineEx を使用して IoCompletion ルーチンを登録する場合、ディスパッチ ルーチンは、その後、IoCallDriver または PoCallDriver を呼び出す必要があることを指定します。

DoubleCompletion

DoubleCompletion (WDM) 規則は、ドライバーが同じ IRP に対して IoCompleteRequest ルーチンを 2 回呼び出してはならないことを指定します。

IoReuseIrp

IoReuseIrp ルールでは、ドライバーが IoAllocateIrp で以前に割り当てた IRP でのみ IoReuseIrp を使用するよう指定します。

IoReuseIrp2

IoReuseIrp2 ルールは、ドライバーが以前にドライバー内で割り当てた IRP でのみ IoReuseIrp を使用するよう指定します。

IoSetCompletionExCompleteIrp

IoSetCompletionExCompleteIrp ルールは、IoSetCompletionRoutineEx ルーチンが NTSTATUS 値を返すよう指定します。 ドライバーは、IoCallDriver または PoCallDriver を呼び出す前に IoCompletion ルーチンが正常に登録されたかどうかを判断するには、この値をチェックする必要があります。また、IoSetCompletionRoutineEx が失敗した場合は、IRP を完了し、ディスパッチ ルーチンを返す必要があります。

IoSetCompletionRoutineExCheck

IoSetCompletionRoutineExCheck ルールは、IoSetCompletionRoutineEx ルーチンが NTSTATUS 値を返すよう指定します。 ドライバーは、IoCallDriver または PoCallDriver を呼び出す前に、IoCompletion ルーチンが正常に登録されたかどうかを判断するには、この値をチェックする必要があります。

IoSetCompletionRoutineExCheckDeviceObject

IoSetCompletionRoutineExCheckDeviceObject ルールは、現在のデバイス オブジェクトが IoSetCompletionRoutineEx に渡されず、下位のデバイス オブジェクトが渡された場合、完了ルーチンが実行されていない場合でも、現在のデバイス オブジェクトがアンロードされる競合状態につながる可能性があることを指定します。

IoSetCompletionRoutineNonPnpDriver

IoSetCompletionRoutineNonPnpDriver ルールでは、PnP ドライバーではないドライバーは、IoSetCompletionRoutineEx ではなく IoSetCompletionRoutineEx を使用する必要があることを指定します。

IrpCancelField

IrpCancelField ルールは、ドライバーが保留注の IRP のキャンセル ルーチンを設定するときに Irp->Cancel メンバーの値をチェックすることを指定します。

IrpProcessingComplete

IrpProcessingComplete ルールは、ディスパッチ ルーチンが STATUS_SUCCESS を返す場合に、ドライバー自体または下位レベルのドライバーによって IRP が完了している必要があることを指定します。

LowerDriverReturn

LowerDriverReturn ルールは、PoCallDriver または IoCallDriver を使用して下位ドライバーを呼び出した後、ドライバーが呼び出しから戻りステータスを保存し、ディスパッチ ルーチンに受信した戻りステータスを渡すように指定します。

SignalEventInCompletion

SignalEventInCompletion ルールは、非同期 IRP を処理する場合、Irp->PendingReturned フラグが設定されているときに、ドライバーが完了ルーチンで KeSetEvent を呼び出す必要があることを指定します。

SignalEventInCompletion2

SignalEventInCompletion2 ルールは、非同期 IRP を処理する場合、Irp->PendingReturned フラグが設定されているときに、ドライバーが完了ルーチンで KeSetEvent を呼び出す必要があることを指定します。

SignalEventInCompletion3

SignalEventInCompletion3 ルールは、非同期 IRP を処理する場合、Irp->PendingReturned フラグが設定されているときに、ドライバーが完了ルーチンで KeSetEvent を呼び出す必要があることを指定します。

StartIoCancel

StartIoCancel ルールは、NULL 以外のキャンセル ルーチンで IoSetCancelRoutine を呼び出す前に、NonCancelable パラメーターを FALSE に設定した IoSetStartIoAttributes を呼び出してはならないことを指定します。

StartIoRecursion

StartIoRecursion ルールは、ドライバーの StartIo ルーチンに IoStartNextPacket への呼び出しが含まれている場合、ドライバーは最初に DeferredStartIo 属性を TRUE に設定して IoSetStartIoAttributes を呼び出す必要があることを指定します。 指定しないと、無限再帰が発生する可能性があります。

PnpRemove

PnpRemove ルールは、ドライバーが失敗した IRP_MN_SURPRI Standard Edition_REMOVAL、IRP_MN_CANCEL_REMOVE_DEVICE、IRP_MN_CANCEL_STOP_DEVICE、IRP_MN_REMOVE_DEVICE 要求を完了できないことを指定します。

PnpSurpriseRemove

PnpSurpriseRemove ルールは、ドライバーが IRP_MN_SURPRI Standard Edition_REMOVAL 要求の処理中に IoDeleteDevice または IoDetachDevice を呼び出さないよう指定します。

PowerDownAllocate

PowerDownAllocate ルールでは、s0 から [S1...S5] に移行する SystemPowerState 遷移の IRP_MN_Standard Edition T_POWER 要求を処理するときに、FDO ドライバーと FIDO ドライバーがメモリを割り当てないように指定します。

PowerDownFail

PowerDownFail ルールでは、デバイスの電源が切れている場合に、FDO ドライバーまたは FIDO ドライバーが IRP_MN_Standard Edition T_POWER 要求を失敗しないように指定します。 この規則は、FDO ドライバーと FIDO ドライバーだけに適用されます。

PowerIrpDDIs

PowerIrpDDIs ルールは、ドライバーがシステムまたはデバイスの IRP_MJ_POWER with IRP_MN_SET_POWERR で処理しているときに、PASSIVE_LEVEL でのみ呼び出すことができる DDI を呼び出さないことを指定します。

PowerUpFail

PowerUpFail ルールでは、デバイスの電源が入っている場合に、FDO ドライバーまたは FIDO ドライバーが IRP_MN_Standard Edition T_POWER 要求を失敗しないように指定します。

PnpIrpCompletion

PnpIrpCompletion ルールは、FDO ドライバーが下位ドライバーに PnP IRP を渡すかどうかを検証します。

WmiComplete

WmiComplete ルールは、WMI マイナー IRP を処理するときに、ドライバーが DispatchSystemControl ルーチンから戻る前に IoCompleteRequest を呼び出すように指定します。

WmiForward

WmiForward ルールは、ドライバーが転送が必要な場合に WMI マイナー IRP を転送する必要があることを指定します。

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

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

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

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

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

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