次の方法で共有


PnP テスト (Device Fundamental)

Device Fundamentals PnP テストでは、ドライバーがほぼすべての PnP IRP を処理するように強制されます。ただし、具体的には、削除、再調整、および突然の削除という 3 つの領域が強調されています。 PnP テストでは、これらの各テストを個別に行うか、それらをすべてまとめてテストするメカニズム (つまり、ストレス テストとして) が提供されます。 この PnP テストは、ユーザー モード API 呼び出し (テスト アプリケーションを通じて) とカーネル モード API 呼び出し (上位フィルター ドライバーを使用) の組み合わせを使用して実行されます。

PNP テスト

プラグ アンド プレイ (PnP) テストは、ドライバーおよびユーザー モード コンポーネントでさまざまな PnP 関連のコード パスを実行します。 PnP テストは、テスト コンピューターで ドライバー検証ツール を有効にして実行する必要があります。 ドライバー検証ツールを有効にする方法については、ドライバー プロジェクトのドライバー検証ツールのプロパティを参照してください。

テスト 説明

拡張デバイス テスト (EDT) のサポートを無効にする

このテストでは、DQ パラメーターを使用して指定されたデバイスの上位フィルターとして、テスト フィルター ドライバー (msdmfilt.sys) をアンインストールします。 このテスト フィルターは、このテスト カテゴリでのテストの実行の一部としてインストールされます

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

PNP(無効化および有効化)の再起動を、IOの前後で実施する

このテストでは、システムの再起動が行われるデバイスで基本的な PnP の無効化/有効化と I/O を実行します。

バイナリのテスト: Devfund_PNP_DisableEnable_Reboot_With_IO_BeforeAndAfter.wsc

テスト メソッド: PNP_DisableEnable_Reboot_With_IO_Before_And_After

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

IOPeriod

I/O の前後での PNP (無効化と有効化)

このテストでは、デバイスで I/O と基本的な PnP の無効化/有効化を実行します。

このテストでは、次の処理が行われます。

  1. システム上にデバイスの問題コードが報告されていないことを確認します。
  2. WDTF Simple I/O プラグインを使用して、システム上のすべてのデバイスで I/O をテストします。 詳細については、「提供されている WDTF シンプル I/O プラグイン」を参照してください。
  3. WDTF PnP アクション インターフェイスを使用してシステム上のすべてのデバイスを無効にして有効にします。詳細については、「 IWDTFPNPAction2::D isableDevice および IWDTFPNPAction2::EnableDevice メソッド」を参照してください。
  4. システム上にデバイスの問題コードが報告されていないことを確認します。
  5. WDTF Simple I/O プラグインを使用して、システム上のすべてのデバイスで I/O をテストします。 詳細については、「提供されている WDTF シンプル I/O プラグイン」を参照してください。
  6. 手順 3 ~ 5 を数回繰り返します。

バイナリのテスト: Devfund_PNP_DisableEnable_With_IO_BeforeAndAfter.wsc

テスト メソッド: PNP_DisableEnable_With_IO_Before_And_After

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

IOPeriod

PNP デバイスの除去キャンセル テスト

このテストでは、EDT フィルター ドライバーを使用して、ターゲット デバイス スタックにIRP_MN_CANCEL_REMOVE_DEVICEを送信します。

詳細については、「 デバイスの削除テストについて」を参照してください。

テスト バイナリ: Devfund_PnPDTest.dll

テスト メソッド: PNPCancelRemoveDevice

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP Cancel Stop Device テスト

このテストでは、EDT フィルター ドライバーを使用して、ターゲット デバイス スタックにIRP_MN_CANCEL_STOP_DEVICEを送信します。

詳細については、「 再調整テストについて」を参照してください。

テスト バイナリ: Devfund_PnPDTest.dll

テスト メソッド: PNPCancelStopDevice

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP DIF デバイスの削除テスト

このテストでは、SetupDi API を使用して、インストーラーがデバイスを削除するための DIF_REMOVE 要求を送信します。

テスト バイナリ: Devfund_PnPDTest.dll

テスト メソッド: PNPDIFRemoveAndRescanParentDevice

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP デバイス テストを無効にして有効にする

このテストでは、ターゲット デバイスを無効にして有効にします。

テスト バイナリ: Devfund_PnPDTest.dll

テスト メソッド: PNPDisableAndEnableDevice

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

PNP 再調整失敗デバイスの再起動テスト

このテストでは、EDT フィルター ドライバーを使用して、ターゲット デバイス スタックにIRP_MN_STOP_DEVICEを送信しようとします。 その後、EDTフィルタードライバーは、IRP_MN_STOP_DEVICE要求に続くIRP_MN_START_DEVICE要求を意図的に失敗させることで、ターゲットデバイスの不意の削除を引き起こします。

詳細については、「 再調整テストについて」を参照してください。

テスト バイナリ: Devfund_PnPDTest.dll

テストメソッド: PNPTryStopDeviceAndFailRestart

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNPリソース再調整要求の新規デバイステスト

このテストでは、EDT フィルター ドライバーを使用して、ターゲット デバイス スタックにIRP_MN_STOP_DEVICEを送信しようとします。 また、デバイスのリソース要件を操作して、新しいリソースがデバイスに割り当てられる可能性を最大化します。

詳細については、「 再調整テストについて」を参照してください。

テスト バイナリ: Devfund_PnPDTest.dll

テスト メソッド: PNPTryStopDeviceRequestNewResourcesAndRestartDevice

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP デバイスの削除テスト

このテストにより、IRP_MN_QUERY_REMOVE_DEVICEとIRP_MN_REMOVE_DEVICEがターゲット デバイス スタックに送信されます。

詳細については、「 デバイスの削除テストについて」を参照してください。

テスト バイナリ: Devfund_PnPDTest.dll

テスト メソッド: PNPRemoveAndRestartDevice

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP 停止 (再調整) デバイス テスト

このテストでは、EDT フィルター ドライバーを使用して、ターゲット デバイス スタックにIRP_MN_STOP_DEVICEを送信しようとします。

詳細については、「 再調整テストについて」を参照してください。

テスト バイナリ: Devfund_PnPDTest.dll

テスト メソッド: PNPTryStopAndRestartDevice

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP Surprise Remove Device のテスト

このテストでは、EDT フィルター ドライバーを使用して、ターゲット デバイス スタックにIRP_MN_SURPRISE_REMOVALを送信します。

詳細については、「 突然の削除テストについて」を参照してください。

テスト バイナリ: Devfund_PnPDTest.dll

テスト メソッド: PNPSurpriseRemoveAndRestartDevice

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

デバイスの削除テストについて

  • PNP デバイスの削除テスト
  • PNP キャンセル・リムーブ・デバイス テスト

デバイスの削除テストには、IRP_MN_QUERY_REMOVE_DEVICE、IRP_MN_CANCEL_REMOVE_DEVICE、およびIRP_MN_REMOVE_DEVICEが含まれます。

テストでは、ターゲット デバイス スタックに上位フィルター ドライバーをインストールしようとします。 この試行により、クエリ削除 IRP が作成されます。

このクエリ削除 IRP が失敗した場合、テストは、デバイス スタックにフィルター ドライバーを取得するコンピューターを再起動します。 削除要求が拒否されない場合、デバイス スタックは削除され、デバイス スタックのフィルター ドライバーで再起動されます。

このテストでは、セットアップ API を使用して、クエリ削除 IRP がデバイス スタックに送信されます。 フィルター ドライバーは、この削除要求が失敗するため、取り消し IRP が送信されます。 フィルター ドライバーは、キャンセル-削除が成功したことをアサートします。

次に、テスト アプリケーションは、適切なクラス インストーラーと登録されている共同インストーラーを呼び出して、デバイスを無効または有効または削除または再有効化します (これにより、DICS_DISABLE、DICS_ENABLE、DICS_PROPCHANGEを使用して、DIF_PROPERTYCHANGEのクラスと共同インストーラーの処理がテストされます)。 IRP_MN_REMOVE_DEVICEを受信すると、フィルター ドライバーは、下位のドライバーが正常に完了したことをアサートします。

これらの各手順には、事前削除要求が含まれます。 その要求が拒否された場合、デバイスは削除されません。 USB カメラでビデオをストリーミングしているときや、ターゲット デバイスがブートパスまたはページング パスにある場合など、必要に応じて削除要求を拒否することを選択できます。 すべての削除要求を失敗するだけでは、一般的には良い方法ではないことに注意してください。 すべての削除要求を失敗しても、突然の削除後も削除 IRP が発行されるため、ドライバーが削除を受け取ることは保証されません。または、デバイス スタック内のだれかがスタート IRP に失敗した場合。

突然の削除テストについて

  • PNP サプライズ デバイス取り外しテスト

突然の削除テストには、まずIRP_MN_SURPRISE_REMOVALが続き、その後にIRP_MN_REMOVE_DEVICEが含まれます。

前のテストと同様に、テスト アプリケーションはターゲット デバイス スタックに上位フィルターを追加し、スタックを再起動しようとします。 この試行が成功しなかった場合、テストによってコンピューターが再起動されます。

テスト アプリケーションによってトリガーされると、フィルター ドライバーにより、システムはデバイス スタックにIRP_MN_SURPRISE_REMOVALを送信し、その後にIRP_MN_REMOVE_DEVICEを送信します。 フィルター ドライバーは、これらの IRP の両方が下位ドライバーによって正常に完了することをアサートします。

突然の削除テストが完了すると、デバイスがアンインストールされ、再び有効になり、スタックからフィルター ドライバーも削除されます。

再調整テストについて

  • PNP ストップ(リバランス)デバイス テスト
  • PNP リバランスリクエスト 新しいリソースデバイステスト
  • PNP 再調整失敗デバイスの再起動テスト
  • PNPキャンセル停止デバイス試験

削除テストと同様に、テスト アプリケーションはターゲット デバイス スタックに上位フィルターを追加し、 setupDiCallClassInstaller と DIF_PROPERTYCHANGE を使用してデバイス スタックを再起動しようとします。 この試行が成功しなかった場合 (つまり、ターゲット デバイス スタックのユーザーがクエリ削除 IRP に失敗した場合)、テストは再調整をテストするためにコンピューターを再起動します。

選択した再調整テストに応じて、次のイベントが発生します。

  1. PNP 停止 (再調整) デバイス テスト このテストでは、デバイス ドライバーに対して IRP_MN_QUERY_STOP_DEVICE の PnP IRP を発行する再調整プロシージャを開始します。

    スタック内のドライバーがこの IRP に失敗した場合、再調整プロシージャは破棄されます。 Windows Vista では、複数レベルの再調整がサポートされていることに注意してください。 非リーフ デバイス ノードで再調整が開始された場合、ルートとしてそのデバイス ノードを持つデバイス ツリーに存在するすべてのデバイス スタックも再調整されます。 また、子デバイス スタックのいずれかがクエリの停止に失敗した場合、再調整プロシージャ全体が破棄されます。 ドライバーは、正当な理由がない限り、クエリの停止を失敗してはなりません。 このエラーが発生した場合、PnP マネージャーは、クエリ停止が送信されたすべてのデバイス スタックにキャンセル停止 (IRP_MN_CANCEL_STOP) を送信します。

    関連するすべてのデバイス スタックがクエリ停止に合格した場合、テストは再調整を続行し、IRP_MN_QUERY_RESOURCE_REQUIREMENTSとIRP_MN_FILTER_RESOURCE_REQUIREMENTS IRPS を送信して、デバイスのリソース要件を見つけます。

    この時点以降、ターゲット デバイスがリソースを消費するかどうかに応じて、次の 2 つの異なるパスが可能になります。

    • デバイスがリソースを消費しない場合、PnP マネージャー自体は、最適化としてキャンセル停止 (IRP_MN_CANCEL_STOP_DEVICE) を送信します。

      デバイスが実際にリソースを消費する場合は、IRP_MN_STOP_DEVICEとIRP_MN_START_DEVICE IRP を使用して再調整手順が完了します。

    このオプションでは、デバイスのリソースは変更されません。

  2. PNP Cancel Stop Device テスト: このテストは再調整プロシージャを開始しますが、フィルター ドライバーはクエリ停止 IRP を意図的に失敗します。 IRP の順序は、IRP_MN_QUERY_STOP_DEVICEから始まり、これはフィルタードライバーによって失敗され、再調整のキャンセルを引き起こします。そして、IRP_MN_CANCEL_STOP_DEVICEへと続きます。

    このオプションでは、デバイスのリソースは変更されません。

  3. PNP 再調整要求の新しいリソース デバイス テスト このテストでは、再調整を開始し、デバイスのリソース要件を操作して、実際に新しいリソースがデバイスに割り当てられる可能性を最大化します。 このオプションは、リソースのないデバイスが実際に完全な再調整手順を実行するのにも役立ちます。

    1. 最初に単純な再調整が開始され、次の IRP が発生します。

      • IRP_MN_QUERY_STOP_DEVICE (この IRP がすべてのドライバーによって渡されると仮定します)。テストでは、この IRP が失敗したケースが既に説明されています)。
      • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
      • IRP_MN_FILTER_RESOURCE_REQUIREMENTS。 この IRP に応答して、上に移動中に、フィルター ドライバーは、デバイスがリソースを消費するかどうかに基づいてアクションを実行します。
        • デバイスにリソース要件がない場合は、フィルターによって偽のリソースが割り当てられます。
        • デバイスにリソース要件がある場合は、現在の割り当てを変更する確率を最大化するようにリソース要件リストを再構築しようとします。 たとえば、デバイスで 00 から FF までの任意の場所で 2 バイトのメモリが必要で、現在は 3A から 3B が割り当てられている場合は、新しいリソース要件 (優先順) が 00 から 39 または 3C-FF または 3A-3B のように変更します。 同様に、デバイス リソース要件リストに代替要件がある場合は、順序が変更され、代替要件が一覧の前に表示されます。
    2. これで、デバイスは常に再調整手順を完了する必要があります。

      IRP_MN_STOP_DEVICE

      IRP_MN_START_DEVICE (割り当てられた新しいリソース。偽の要件が作成された場合は、実際のドライバーから新しいリソースをマスクします)。

  4. PNP 再調整失敗によるデバイス再起動テスト このテストは再調整を開始しますが、再調整後にフィルタードライバーが開始されると意図的に失敗させると、それに続いてサプライズ削除IRPと削除IRPが発生します。

    まず、リバランス手続きを開始し、リソースを消費しないデバイスのために偽のリソース要件を生成し、それによりドライバーが停止して再起動することを確認します。

    • IRP_MN_QUERY_STOP_DEVICE (この IRP がすべてのドライバーによって渡されると仮定します)。テストでは、この IRP が失敗したケースが既に説明されています)。
    • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
    • IRP_MN_FILTER_RESOURCE_REQUIREMENTS (実際のリソース要件が null の場合は、フィルターによって偽のリソース要件が割り当てられるため、停止と開始があります)。
    • IRP_MN_STOP_DEVICE
    • IRP_MN_START_DEVICE (フィルターはこの IRP 処理中に失敗します。この操作がサプライズ・リムーブ IRP を引き起こします。)
    • IRP_MN_SURPRISE_REMOVAL(サプライズリムーバル)
    • IRP_MN_REMOVE

    再調整テストが完了すると、デバイスがアンインストールされ、再び有効になり、スタックからフィルター ドライバーも削除されます。

デバイス エラー コード

テストで、デバイスの状態が OK ではないことを示すエラー メッセージが表示された場合は、デバイス マネージャーを使用してデバイスの状態の詳細を確認できます。 さまざまなデバイス エラー コードの概要については、「 デバイス マネージャーのエラー メッセージ」を参照してください。

セットアップ API ログを使用してインストールエラーをデバッグする

セットアップ API ログ (setupapi.app.logとsetupapi.dev.log) には、このテストによってログに記録されたドライバーのインストールエラーをデバッグするのに役立つ情報が含まれている場合があります。 セットアップ API ログは、テスト システム %windir%\inf\ ディレクトリにあります。

これらのログの詳細性と潜在的な有用性を高めるために、再インストール テストを実行する前に、次のレジストリ キーを0x2000FFFFに設定します。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup\LogLevel

Visual Studio を使用して実行時にドライバーをテストする方法

Device Fundamentals テストを選択して構成する方法

デバイス基本テスト

提供されている WDTF シンプル I/O プラグイン

コマンド プロンプト から実行時にドライバーをテストする方法