2

私はドライバー開発の初心者です。ユーザーからいくつかの USB デバイス タイプを隠すために、Windows7 用の USB フィルター ドライバーの開発を開始しました。ドライバーを USB ハブに接続すると、IRP_MN_QUERY_DEVICE_RELATIONS をインターセプトできます。いくつかの質問を聞きたいんです:

1 - オンIRP_MN_QUERY_DEVICE_RELATIONS( QueryDeviceRelations.TypeBusRelations です) へのポインターを受け取ります。DEVICE_RELATIONS struct私が理解しているように、構造体の Objects 配列は PDO へのポインターを保持する必要があります。しかし、DO_BUS_ENUMERATED_DEVICEフラグをテストすると (msdn から:オペレーティング システムは、各物理デバイス オブジェクト (PDO) でこのフラグを設定します。ドライバーはこのフラグを変更してはなりません。 ) 時々、このフラグがオンになっているのを確認したり、フラグがオフになったりします。 . これは、PDO が表示されることもあれば、FDO が表示されることもあるということですか? または、この問題の別の説明はありますか? を取得した場合PDEVICE_OBJECT、それが PDO か FDO かをどのように確認できますか?

2 - ユーザーが何らかの USB デバイスを接続し、フィルター ドライバーが を処理する必要があるIRP_MN_QUERY_DEVICE_RELATIONS場合、オブジェクト配列のどのデバイスがデバイスに接続されているか、どのデバイスが以前に接続されていたか、どのデバイスが非アクティブとしてマークされているかを判断するにはどうすればよいですか?

前もって感謝します。フェリックス。

4

2 に答える 2

1

DeviceNodeこれは WDM.h および NTDDK.h の一部ではなく、IO または PnP マネージャーに対して非公開でDEVOBJ_EXTENSIONあるため、文書化されていないメンバーがあります。いずれにせよ、非 PDO の場合は NULL であるため、「サポートされていない方法」は

if (DeviceObject->DeviceObjectExtension->DeviceNode) {
        // PDO!
    } else {
        // non-PDO!
    }

使わないほうがいいです。IoGetDeviceObjectPointer代わりに、から始まる devobj リストを介して、またはウォークスルーすることで、実際のデバイス オブジェクトを見つけることができますPDRIVER_OBJECT。devobj が PDO であるかどうかを判断するために、QDR/TargetDeviceRelation を送信します (完了PDEVICE_OBJECTしたらリスト内の参照を解除します)。成功した場合、QDR の結果の devobj がデバイスの PDO になります。これについての良い説明があります別のオプションは、を使用することDO_BUS_ENUMERATED_DEVICEです。また、このフラグは初期化された PDOを意味するものではないことも考慮してください。初期化前および構造体の割り当て時に設定されます。

于 2012-07-25T07:26:51.147 に答える
0

BusRelations の更新で FDO が到着するのを見たことがありませんが、別のフィルター ドライバーを使用している可能性がありますか? とにかく、タミールはその質問にうまく答えました:)

2 番目の質問について、私が知っている唯一の方法は、以前に受け取った Objects 配列のコピーを保持して比較することです。デバイスの順序はバージョン間で変わる可能性があるため、特定の順序に依存しないでください。

于 2012-12-09T11:46:06.680 に答える