次の方法で共有


RequestProcessing の規則セット (KMDF)

これらの規則を使用して、ドライバーが I/O 要求パケット (IRP) を正しく完了またはキャンセルするかを確認します。

このセクションの内容

トピック 説明

ChangeQueueState

ChangeQueueState 規則は、WDF ドライバーが同時実行スレッドからキューの状態を変更しようとしたり、同じスレッド内から状態変更 DDI を次々に呼び出さないことを指定します。 キュー状態変更コールバック関数は、WdfIoQueueStopWdfIoQueueStopSynchronouslyWdfIoQueuePurgeWdfIoQueuePurgeSynchronouslyWdfIoQueueDrainWdfIoQueueDrainSynchronouslyWdfIoQueueStopAndPurgeWdfIoQueueStopAndPurgeAndPurgeSynchronously です。 キューの状態の変更が既に進行中のときにこれらの DDI が呼び出されると、コンピューターがクラッシュしたり、応答しなくなります。

CompleteCanceledReq

CompleteCanceledReq 規則は、要求がすでに取り消されている場合、要求は無効になり、ドライバーが要求を完了しないように指定します。 ドライバーは、以前にキャンセル可能とマークされた要求のマークを解除しますが、要求がまだ取り消されていないことを確認する必要があります。 ドライバーがこの確認を行わない場合、ドライバーは解除された要求を完了する可能性があります。

DoubleCompletion

DoubleCompletion 規則は、ドライバーが I/O 要求を 2 回完了しないように指定します。 次のメソッドは、同じ要求に対して 1 行に 2 回呼び出さないでください。WdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoost

DoubleCompletionLocal

DoubleCompletionLocal 規則は、ドライバーが I/O 要求を 2 回完了しないように指定します。

EvtIoStopCancel

EvtIoStopCancel 規則は、EvtIoStop コールバック関数内で、ドライバーは取り消し不可能な I/O 要求に対して次のいずれかのメソッドを呼び出すよう指定します。

EvtIoStopCompleteOrStopAck

EvtIoStopCompleteOrStopAck 規則は、EvtIoStop コールバック関数内で、フレームワークによって提示される各 I/O 要求に対して次のいずれかのメソッドをドライバーが呼び出すよう指定します。 これを行わない場合、ドライバーは、システムが別の低い電源状態に入るのをブロックする可能性があります。

EvtSurpriseRemoveNoSuspendQueue

EvtSurpriseRemoveNoSuspendQueue 規則は、WDF ドライバーが EvtDeviceSurpriseRemoval コールバック関数からキューをドレイン、停止、または消去しないように指定します。代わりに、セルフマネージド I/O コールバック関数を使用する必要があります。 EvtDeviceSurpriseRemoval コールバック関数は、電源ダウン パスと同期されません。

FileObjectConfigured

FileObjectConfigured 規則では、WdfRequestGetFileObject メソッドの呼び出しの前に WdfDeviceInitSetFileObjectConfig の呼び出しが行われるよう指定されています。

InternalIoctlReqs

InternalIoctlReqs 規則は、内部 IOCTL 要求が不適切な KMDF 要求送信デバイス ドライバー インターフェイス (DDI) に渡されないことを指定します。

InvalidReqAccess

InvalidReqAccess 規則は、要求が完了またはキャンセル後にアクセスしないよう指定します。 この規則は、二重で完了をチェックする規則や、要求にチェックする規則が 2 回キャンセルできるものとしてマークされているなど、他の規則と重複する場合があります。

InvalidReqAccessLocal

InvalidReqAccessLocal 規則は、ローカルで作成された要求が完了または取り消された後にアクセスしないよう指定します。 この規則は、二重で完了をチェックする規則や、要求にチェックする規則が 2 回キャンセルできるものとしてマークされているなど、他の規則と重複する場合があります。

IoctlReqs

IoctlReqs 規則は、不適切な KMDF 要求に IOCTL 要求を渡したり、デバイス ドライバー インターフェイス (DDI) を送信したりしないように指定します。

MarkCancOnCancReqLocal

MarkCancOnCancReqLocal 規則は、同じ I/O 要求で WdfRequestMarkCancelable メソッドを 2 回連続して呼び出すことができないことを指定します。

NoIoQueuePurgeSynchronously

NoIoQueuePurgeSynchronously 規則は、WDF ドライバーが次の EvtIO キュー オブジェクト イベント コールバック関数から WdfIoQueueStopSynchronouslyWdfIoQueueDrainSynchronouslyWdfIoQueueStopAndPurgeSynchronously、または WdfIoQueuePurgeSynchronously 関数を呼び出さないことを検証します。

OutputBufferAPI

OutputBufferAPI 規則は、バッファー取得用の適切な DDI が EvtIoWrite コールバック関数で使用されることを指定します。 EvtIoWrite コールバック関数内では、バッファー取得のために次の DDI を呼び出すことはできません。

ReadReqs

ReadReqs 規則は、読み取り要求が不適切な KMDF メソッドに渡されないことを指定します。

ReqCompletionRoutine

ReqCompletionRoutine 規則は、要求が I/O ターゲットに送信される前に完了ルーチンを設定する必要があることを指定します。

ReqDelete

ReqDelete 規則は、ドライバーによって作成された要求が WdfRequestCompleteXxx 関数に渡されないことを指定します。 代わりに、完了時に要求を削除する必要があります。

ReqIsCancOnCancReq

ReqIsCancOnCancReq 規則は、キャンセル可能としてマークされていない要求でのみ WdfRequestIsCanceled メソッドを呼び出すことができることを指定します。

ReqMarkCancelableSend

ReqMarkCancelableSend 規則は、ドライバーによって転送された要求が WdfRequestMarkCancelable を呼び出すことによってキャンセル可能としてマークされないことを指定します。

RequestCompleted

RequestCompleted 規則は、フィルター以外のドライバーの場合、要求が遅延または転送されない限り、または WdfRequestStopAcknowledge が呼び出された場合を除き、ドライバーの既定の I/O キューに提示される各要求を完了する必要があることを指定します。

RequestFormattedValid

RequestFormattedValid 規則は、ドライバーが I/O ターゲットに送信する前に、WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 要求を除くすべての要求を書式設定することを指定します。

RequestGetStatusValid

RequestGetStatusValid 規則は、次のいずれかの状況で要求に対して WdfRequestGetStatus を呼び出す必要があることを指定します:

  • WdfRequestSend がエラーを返す場合。
  • 要求がWDF_REQUEST_Standard Edition ND_OPTION_SYNCHRONOUSと共に送信されたとき。

RequestSendAndForgetNoFormatting

RequestSendAndForgetNoFormatting 規則は、送信オプション WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET で I/O ターゲットに送信する前に、ドライバーが I/O ターゲット書式設定関数を使用して要求を書式設定しないことを確認します。

RequestSendAndForgetNoFormatting2

RequestSendAndForgetNoFormatting2 規則は、送信オプション WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET で I/O ターゲットに送信する前に、ドライバーが I/O ターゲット書式設定関数を使用して要求を書式設定しないことを確認します。

StopAckWithinEvtIoStop

StopAckWithinEvtIoStop 規則は、WdfRequestStopAcknowledge 関数が EvtIoStop コールバック関数内からのみ呼び出されることを指定します。

WdfIoQueueFindRequestFailed

WdfIoQueueFindRequestFailed 規則では、WdfIoQueueRetrieveFoundRequest または WdfObjectDereference を呼び出す必要があるのは、WdfIoQueueFindRequestFailed が STATUS_SUCCESS を返した後に限られます。

WdfIoQueueRetrieveFoundRequest

WdfIoQueueRetrieveFoundRequest 規則では、WdfIoQueueRetrieveFoundRequest メソッドが呼び出されるのは、WdfIoQueueFindRequest が呼び出されて STATUS_SUCCESS が返され、同じ要求に対して WdfObjectDereference が呼び出されなかった場合のみです。

WdfIoQueueRetrieveNextRequest

WdfIoQueueRetrieveNextRequest 規則は、WdfIoQueueFindRequest が呼び出された後に WdfIoQueueRetrieveNextRequest が呼び出されないことを指定します。

WriteReqs

WriteReqs 規則は、不適切な KMDF メソッドに書き込み要求が渡されないことを指定します。

LocalIrpProcessing 規則セットを選択する方法

  1. Microsoft Visual Studio でドライバー プロジェクト (.vcxProj) を選択します。 [ドライブ] メニューから [スタティック ドライバー ベリファイアを起動] をクリックします。

  2. [規則] タブをクリックします。[規則セット] で、[LocalIrpProcessing] を選択します。

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

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

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