3

多くの Windows XP ワークステーションでハードウェア監査を実行するプログラムを C# で作成しています。

PCI バス (マザーボードに組み込まれている) を使用するオンボード デバイスではなく、マザーボード スロットを介して接続された実際のカードである PCI デバイスを特定する必要があります。

さまざまな WMI クラスを使用して、すべての PCI バスを使用するすべてのデバイスを正常に一覧表示できますが、オンボードのものとスロット経由で接続されているものを示すものはありません。

情報の取得方法や情報源 (Pinvoke、WMI、レジストリなど) が信頼できるものである限り、私はこだわりません。

ありがとうございました!

4

1 に答える 1

3

何時間もかけて、「合理的に」信頼できるアプローチを思いつきました。

このロジックは基本的に、スロット付き PCI デバイス バス ID が一意であり、他のすべての (オンボード) PCI バス ID とは別のものであると想定しています。これまでのところ、私のテストではこれが当てはまることが示されています。とにかく、これはまだ仮定です。

私のコードはかなり長く、改善できると確信しているので、代わりに疑似コードでプロセスを説明します。

  1. 使用中のスロット数を確認します (少なくとも 1 つのスロットが実際に使用されている場合にのみ続行します)。

    "Select SlotDesignation FROM Win32_SystemSlot WHERE CurrentUsage = 4"

  2. PCI バスに属するすべてのデバイス ID を保存します。

    「 BusType = 5 のWin32_BusからDeviceIDを選択」

  3. すべてのシステムと論理デバイスの関連付けをキャプチャします。

    "SELECT * FROM Win32_DeviceBus "

  4. すべてのシステムと論理デバイスの関連付け (先行プロパティ) を検索し、各 deviceID が発生するたびにカウントします。

  5. システム スロットで見つかったデバイスの数と同じ回数発生する DeviceID を見つけることで、スロット付き PCI デバイスが存在する DeviceID を特定できるようになりました。

  6. DeviceID (先行プロパティ内) を含む Win32_DeviceBus の結果ごとに、依存プロパティは Win32_PnPEntity クラスに使用される別の DeviceID を参照します。

  7. 新しくキャプチャされた DeviceID を使用して Win32_PnPEntity をクエリすると、すべてのデバイス情報 (または、Win32_PnPEntity が提供するすべての情報) が得られます。

    "SELECT * FROM Win32_PnPEntity WHERE DeviceID = '" + deviceID + "'"

残念ながら、「使用中」クエリによって返される結果の数以外に、Win32_SystemSlot クラスによって返される非常に制限された情報を利用する方法を見つけることができませんでした (それはあまりにも簡単でした!)。

使用中のスロットの数と同じ数のデバイスを持つ複数の PCI バスに遭遇する可能性があることに注意してください。このシナリオが発生した場合 (私はまだ遭遇していません)、続行して正しい PCI バスを照会していると想定するのではなく、例外を発生させることをお勧めします。

于 2013-06-01T12:27:35.693 に答える