4

SetupDiGetDeviceInterfaceDetail を使用して、接続されている USB デバイスに関連する SP_DEVICE_INTERFACE_DETAIL_DATA を取得すると、DevicePath という文字列が返されます。

返される文字列は、次の例のようにフォーマットされます。

\?\usb#vid_abcd&pid_1234#000000000#{xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

質問 : この文字列の書式設定/構文はどこかに文書化されていますか、または Windows XP/Vista/7/8 のすべてのバージョンで信頼できることが知られていますか?

参照されているデバイスを識別するために、この文字列から VID および PID 値を抽出するコードを試していますが、これが VID および PID 値を取得するための堅牢な方法であるかどうかを知りたいです。

4

3 に答える 3

2

その特定の文字列は文書化されていないため、より安全な選択は USB デバイスのハードウェア ID を使用することです。これらは、Microsoft のStandard USB Identifiersというタイトルのページに記載されています。

新しい USB デバイスが接続されると、システム提供の USB ハブ ドライバーは、デバイスのデバイス記述子から抽出された情報を使用して、次のデバイス ID を構成します。

USB\VID_v(4)&PID_d(4)&REV_r(4)

どこ:

  • v(4) は、USB 委員会がベンダーに割り当てる 4 桁のベンダー コードです。
  • d(4) は、ベンダーがデバイスに割り当てる 4 桁の製品コードです。
  • r(4) はリビジョン コードです。

詳細については、MSDN のDevice Identification Stringsというタイトルのページを参照してください。

于 2015-09-06T18:03:03.633 に答える
2

デバイス パスを解析してこの情報を取得するのは簡単だと思うかもしれませんが、Windows のデバイス パスは不透明であると想定されているため、技術的には違法です。

usbviewサンプルを見て、これを行う正しい方法を確認してください。

于 2013-12-18T07:45:01.110 に答える
2

TripShockとは異なり、デバイス パスを解析することができ、そうすることは完全に合法であると私は信じています。

  1. David Graysonが回答で指摘しているように、Microsoft はデバイス パスに関するドキュメントを公開しています。

  2. マイクロソフトによって公開されたコードは、まさにこの方法でそれを行います。( USB ビュー)

おそらく、これを行うための単一の「公式」方法はありません。Windows 7、8、8.1、および 10 でのこの方法の堅牢性は問題ないはずですが、永遠に賭けることはできません。

USB に関する最も貴重な情報源の 1 つは、現在 Microsoft によって公開されているusbviewの例です。Microsoft がこのコードを公開していることを考えると、これはおそらくこれまでに得られた「最も公式」なものです。

Uwe Sieberが usbview のオリジナルの作者のようです。ファイル enum.cの470 行目から、VID、PID、SUBSYS、RevID の値が次のように抽出されます。

    ULONG   ven, dev, subsys, rev;
    ven = dev = subsys = rev = 0;

    if (sscanf_s(DevProps->DeviceId,
               "PCI\\VEN_%x&DEV_%x&SUBSYS_%x&REV_%x",
               &ven, &dev, &subsys, &rev) != 4)
    {
        OOPS();
    }

    hcInfo->VendorID = ven;
    hcInfo->DeviceID = dev;
    hcInfo->SubSysID = subsys;
    hcInfo->Revision = rev;
    hcInfo->UsbDeviceProperties = DevProps;
于 2015-09-07T13:38:59.663 に答える