IrpProcessing の規則セット (WDM)
これらのルールを使用して、ドライバーが I/O 要求パケット (IRP) を正しく処理するかを確認します。
このセクションの内容
裁判官 | 説明 |
---|---|
CompleteRequest ルールは、完了ルーチンの実行後に IoCompleteRequest ルーチンが呼び出されないこと、および STATUS_MORE_PROCESSING_REQUIRED を返さないことを確認します。 |
|
CompleteRequestStatusCheck 規則は、IRP の I/O 状態値が下位ドライバーから返された状態値と一致することを確認します。 |
|
CompletionRoutineRegistered ルールは、ディスパッチ ルーチンが IoSetCompletionRoutineEx を使用して IoCompletion ルーチンを登録する場合、ディスパッチ ルーチンは、その後、IoCallDriver または PoCallDriver を呼び出す必要があることを指定します。 |
|
DoubleCompletion (WDM) 規則は、ドライバーが同じ IRP に対して IoCompleteRequest ルーチンを 2 回呼び出してはならないことを指定します。 |
|
IoReuseIrp ルールでは、ドライバーが IoAllocateIrp で以前に割り当てた IRP でのみ IoReuseIrp を使用するよう指定します。 |
|
IoReuseIrp2 ルールは、ドライバーが以前にドライバー内で割り当てた IRP でのみ IoReuseIrp を使用するよう指定します。 |
|
IoSetCompletionExCompleteIrp ルールは、IoSetCompletionRoutineEx ルーチンが NTSTATUS 値を返すよう指定します。 ドライバーは、IoCallDriver または PoCallDriver を呼び出す前に IoCompletion ルーチンが正常に登録されたかどうかを判断するには、この値をチェックする必要があります。また、IoSetCompletionRoutineEx が失敗した場合は、IRP を完了し、ディスパッチ ルーチンを返す必要があります。 |
|
IoSetCompletionRoutineExCheck ルールは、IoSetCompletionRoutineEx ルーチンが NTSTATUS 値を返すよう指定します。 ドライバーは、IoCallDriver または PoCallDriver を呼び出す前に、IoCompletion ルーチンが正常に登録されたかどうかを判断するには、この値をチェックする必要があります。 |
|
IoSetCompletionRoutineExCheckDeviceObject ルールは、現在のデバイス オブジェクトが IoSetCompletionRoutineEx に渡されず、下位のデバイス オブジェクトが渡された場合、完了ルーチンが実行されていない場合でも、現在のデバイス オブジェクトがアンロードされる競合状態につながる可能性があることを指定します。 |
|
IoSetCompletionRoutineNonPnpDriver ルールでは、PnP ドライバーではないドライバーは、IoSetCompletionRoutineEx ではなく IoSetCompletionRoutineEx を使用する必要があることを指定します。 |
|
IrpCancelField ルールは、ドライバーが保留注の IRP のキャンセル ルーチンを設定するときに Irp->Cancel メンバーの値をチェックすることを指定します。 |
|
IrpProcessingComplete ルールは、ディスパッチ ルーチンが STATUS_SUCCESS を返す場合に、ドライバー自体または下位レベルのドライバーによって IRP が完了している必要があることを指定します。 |
|
LowerDriverReturn ルールは、PoCallDriver または IoCallDriver を使用して下位ドライバーを呼び出した後、ドライバーが呼び出しから戻りステータスを保存し、ディスパッチ ルーチンに受信した戻りステータスを渡すように指定します。 |
|
SignalEventInCompletion ルールは、非同期 IRP を処理する場合、Irp->PendingReturned フラグが設定されているときに、ドライバーが完了ルーチンで KeSetEvent を呼び出す必要があることを指定します。 |
|
SignalEventInCompletion2 ルールは、非同期 IRP を処理する場合、Irp->PendingReturned フラグが設定されているときに、ドライバーが完了ルーチンで KeSetEvent を呼び出す必要があることを指定します。 |
|
SignalEventInCompletion3 ルールは、非同期 IRP を処理する場合、Irp->PendingReturned フラグが設定されているときに、ドライバーが完了ルーチンで KeSetEvent を呼び出す必要があることを指定します。 |
|
StartIoCancel ルールは、NULL 以外のキャンセル ルーチンで IoSetCancelRoutine を呼び出す前に、NonCancelable パラメーターを FALSE に設定した IoSetStartIoAttributes を呼び出してはならないことを指定します。 |
|
StartIoRecursion ルールは、ドライバーの StartIo ルーチンに IoStartNextPacket への呼び出しが含まれている場合、ドライバーは最初に DeferredStartIo 属性を TRUE に設定して IoSetStartIoAttributes を呼び出す必要があることを指定します。 指定しないと、無限再帰が発生する可能性があります。 |
|
PnpRemove ルールは、ドライバーが失敗した IRP_MN_SURPRI Standard Edition_REMOVAL、IRP_MN_CANCEL_REMOVE_DEVICE、IRP_MN_CANCEL_STOP_DEVICE、IRP_MN_REMOVE_DEVICE 要求を完了できないことを指定します。 |
|
PnpSurpriseRemove ルールは、ドライバーが IRP_MN_SURPRI Standard Edition_REMOVAL 要求の処理中に IoDeleteDevice または IoDetachDevice を呼び出さないよう指定します。 |
|
PowerDownAllocate ルールでは、s0 から [S1...S5] に移行する SystemPowerState 遷移の IRP_MN_Standard Edition T_POWER 要求を処理するときに、FDO ドライバーと FIDO ドライバーがメモリを割り当てないように指定します。 |
|
PowerDownFail ルールでは、デバイスの電源が切れている場合に、FDO ドライバーまたは FIDO ドライバーが IRP_MN_Standard Edition T_POWER 要求を失敗しないように指定します。 この規則は、FDO ドライバーと FIDO ドライバーだけに適用されます。 |
|
PowerIrpDDIs ルールは、ドライバーがシステムまたはデバイスの IRP_MJ_POWER with IRP_MN_SET_POWERR で処理しているときに、PASSIVE_LEVEL でのみ呼び出すことができる DDI を呼び出さないことを指定します。 |
|
PowerUpFail ルールでは、デバイスの電源が入っている場合に、FDO ドライバーまたは FIDO ドライバーが IRP_MN_Standard Edition T_POWER 要求を失敗しないように指定します。 |
|
PnpIrpCompletion ルールは、FDO ドライバーが下位ドライバーに PnP IRP を渡すかどうかを検証します。 |
|
WmiComplete ルールは、WMI マイナー IRP を処理するときに、ドライバーが DispatchSystemControl ルーチンから戻る前に IoCompleteRequest を呼び出すように指定します。 |
|
WmiForward ルールは、ドライバーが転送が必要な場合に WMI マイナー IRP を転送する必要があることを指定します。 |
IrpProcessing ルールセットを選択するには
Microsoft Visual Studio でドライバー プロジェクト (.vcxProj) を選択します。 [ドライバー] メニューから [静的ドライバー検証ツールの起動...] をクリックします。
[ルール] タブをクリックします。[ルール セット] で、[IrpProcessing] を選択します。
Visual Studio の開発者コマンド プロンプト ウィンドウから既定のルール セットを選択するには、/check オプションで IrpProcessing.sdv を指定します。 次に例を示します。
msbuild /t:sdv /p:Inputs="/check:IrpProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
詳細については、「静的ドライバー検証ツールを使用して、ドライバーの欠陥を検出する」と「静的ドライバー検証ツールコマンド (MSBuild)」を参照してください。