警告の規則セット (KMDF)
これらの規則を使用して、ドライバーがさまざまなコンテキストで IRP を正しく処理できることを確認し、Microsoft が推奨するベスト プラクティスに従います。
このセクションの内容
裁判官 | 説明 |
---|---|
DeferredRequestCompleted ルールは、ドライバーの既定の I/O キューに提示された I/O 要求がコールバック関数で完了せず、後処理のために遅延される場合、要求がフレームワークに転送されて配信されない、または WdfRequestStopAcknowledge メソッドが呼び出されない限り、遅延処理コールバック関数で要求を完了しなければならないことを指定します。 |
|
DriverAttributeChanged ルールは、ドライバーが KMDF ドライバーの実行レベルまたは同期スコープを変更してはならないことを指定します。 |
|
DrvAckIoStop ルールは、電源管理キューの電源が切れている間に、ドライバーが保留中の要求を認識していることを確認し、それに応じて、ドライバーが保留中の要求を確認、完了、または取り消します。 自己管理 I/O 要求の場合、ドライバーは EvtDeviceSelfManagedIoSuspend 関数からのこれらの要求も正しく処理する必要があります。 ドライバーが電源切断中にこれらの要求を処理に失敗すると 、バグ チェック 0x9F が発生します。DRIVER_POWER_STATE_FAILURE |
|
EvtIoResumeGetParam ルールは、WdfRequestGetParameters が EvtIoResumeGetParam コールバック関数内で呼び出されないよう指定します。 |
|
EvtIoStopGetParam ルールは、WdfRequestGetParameters が EvtIoStop コールバック内で呼び出されないことを確認します。 |
|
EvtIoStopResume ルールは、ドライバーが EvtIoStop コールバック関数を登録し、FALSE と等しい Requeue パラメーターを使用して WdfRequestStopAcknowledge を呼び出す場合、ドライバーが EvtIoResume コールバック関数を登録しなければならないことを指定します。 フレームワークは、デバイスが D0 状態に再び入ったときに、EvtIoResume コールバック関数に要求を配信します。 |
|
EvtSurpriseRemoveNoRequestComplete ルールは、WDF ドライバーが EvtDeviceSurpriseRemoval コールバックからの要求を完了しないように指定しますが、代わりに、自己管理 I/O コールバック関数を使用する必要があります。 EvtDeviceSurpriseRemoval コールバックは、電源ダウン パスと同期されません。 |
|
FDOPowerPolicyOwnerAPI ルールは、FDO ドライバーが電源ポリシーの所有権を放棄した場合、WdfDeviceInitSetPowerPolicyEventCallbacks、WdfDeviceAssignS0IdleSettings、および WdfDeviceAssignSxWakeSettings メソッドを呼び出すことができるのは、ドライバーが電源ポリシー所有者の実行パスでのみ呼び出すことができることを指定します。 SDV は、このルールの警告を発行します。 |
|
NoCancelFromEvtSurpriseRemove ルールは、WDF ドライバーが EvtDeviceSurpriseRemoval コールバック関数からの要求をキャンセルすべきではないことを指定します。代わりに、自己管理 I/O コールバック関数を使用する必要があります。 EvtDeviceSurpriseRemoval コールバック関数は、電源ダウン パスと同期されません。 |
|
PagedCodeAtD0 ルールは、ドライバーが電源投入コード パス内にあるコールバック関数内でページング可能なコードとしてマークしないように指定します。 |
|
ParentObjectCheck ルールは、ドライバーが WDF_OBJECT_ATTRIBUTES 構造体を使用して親オブジェクトを指定して WdfMemoryCreate を呼び出す必要があることを指定します。 ドライバーがフレームワーク メモリ オブジェクトの親オブジェクトを設定しない場合、フレームワークは既定の親としてドライバーを設定します。そのため、ドライバーがフレームワーク メモリ オブジェクトを明示的に削除しない限り、ドライバー オブジェクトがアンロードされるまでメモリ内でメインされます。 |
|
ReqNotCanceledLocal ルールは、取り消し可能としてマークされた要求が既定の I/O キュー コールバック関数で完了した場合、完了前に I/O 要求で WdfRequestUnmarkCancelable メソッドを呼び出す必要があることを指定します。 要求が WdfRequestUnmarkCancelable を呼び出す前に取り消されない限り、I/O 要求を完了する必要があります。 |
|
ReqSendFail 規則は、 WdfRequestSend メソッドが失敗する可能性がある場合にドライバーが正しい完了状態を設定する必要があることを指定します。 |
|
RequestCompletedLocal ルールは、 EvtIoDefault、 EvtIoRead、 EvtIoWrite、EvtIoDeviceControl、EvtIoDeviceControl コールバック関数のいずれかで I/O 要求が完了しなかった場合、コールバック関数内の要求で WdfRequestMarkCancelable が呼び出されなかった場合に、ドライバーのコードで要求の完了に問題がある可能性があることを指定します。 |
|
クライアント ドライバーが WdfUsbTargetDeviceCreateWithParameters を呼び出し、(Windows 8 用 USB ドライバー スタックの新機能を使用するために) WDF_USB_DEVICE_CREATE_CONFIG構造体にUSBD_CLIENT_CONTRACT_VERSION_602クライアント コントラクト バージョンを指定する場合、URB を内部的に使用する DDI は、次のいずれかの前提条件が適用される場合にのみ URB コンテキスト を使用します。 |
|
SyncReqSend 規則は、すべての同期送信要求が同期固有の KMDF デバイス ドライバー インターフェイス メソッドを使用して実行され、メソッドに 0 以外のタイムアウト値が設定されていることを指定します。 |
|
SyncReqSend2 規則は、同期要求送信に 0 以外のタイムアウト値が設定されていることを指定します。 |
警告ルール セットをロックするには
Microsoft Visual Studio でドライバー プロジェクト (.vcxProj) を選択します。 Driver メニューから Launch Static Driver Verifier… をクリックします。
[ルール] タブをクリックします。 [ルール セット] で、 警告 を選択します。
Visual Studio の開発者コマンド プロンプト ウィンドウから既定のルール セットを選択するには、Warning オプションで Locking.sdv を指定します。 次に例を示します。
msbuild /t:sdv /p:Inputs="/check:Warning.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
詳細については、「静的ドライバー検証ツールを使用して、ドライバーの欠陥を検出する」と「静的ドライバー検証ツールコマンド (MSBuild)」を参照してください。