質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

接続されたUSB機器がUSB3.0で接続されているのかを確認する方法について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,139

いつも活用させていただいております。

早速ですが、今接続されているUSB機器が、USB3.0として認識しているのかを
調べる方法を探しています。

現状、WinDDK(7600.16385.1)で、VID/PIDやデバイスパス情報の取得するアプリケーションに
追加したいと考えているのですが、うまく取得する方法を見つけることが出来ませんでした。

そこで確認ですが、WinDDK(7600.16385.1)で、USB1.1/2.0/3.0を見分ける方法はあるのでしょうか?

※WinDDK8.1だとできそうな記載もあったのですが、開発環境がVisual Studio 2010は非対象のような記載もありました。
Microsoft Windows Driver Kit (WDK)

※WinDDKを8.1に変更することで、既存アプリで副作用がないのか調査が必要なので、
可能であれば、現行のWinDDKで対応出来たらと思っています。
(まずはVisual Studio 2013以降で対応出来るのかの検証も必要ですが、、、)

Visual Studio 2010 + WinDDK 7600.16385.1 で可能なのかを教えて頂ければと思います。
(また、その方法も含め、、、、)

申し訳ありませんが、協力よろしくお願いします。


開発環境:Visual Studio 2010 (C++)
OS :Windows7 (32bit/64bit)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

usbviewというのがDebugging Tools for Windowsというのをインストールすると入手できます。
それで確認すると

Protocols Supported:
 USB 1.1:                         yes
 USB 2.0:                         yes
 USB 3.0:                         no

こんな感じで表示されるのでusbviewのソースを参考にしてみてはいかがでしょうか。
ソースコードはWDKのサンプルか、Githubにあります。
usbviewをビルドしたことはないのですが、VIDとかPIDとかの情報を取得するだけであればSetup系APIとDeviceIOControlで取得できるのでWindows SDKの範囲内で取得できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/22 11:07

    申し訳ないのですが、もう一点教えて頂きたいことがあります。
    今回、USB3.0で認識しているのかを、
      connectionInfoEx->Speed
    で判定したいと思っているのですが、PC環境によっては、3.0(SuperSpeed)で認識している(UsbTreeViewというツールでは3.0と判定している)が、上記方法では、FullSpeedと判定されるものがありました。(UsbTreeViewはソースが公開されていない。。)
    この方法では、USB3.0判断するには不足しているのでしょうか??
    もし、なにか知っているようでしたら、御教授お願い出来ればと思います。。。
    何度もすみませんが、協力をお願いします。

    キャンセル

  • 2017/05/22 12:30

    @OlivePopeye.net すみません。Protocols SupportedはUSBポート自体がサポートしているプロトコルでした。connectionInfoEx->DeviceDescriptor.bcdUSBの値を確認してはどうでしょうか?USB3.0デバイスがUSB3.0のポートに刺さっているときは0x0300、USB2.0のポートに刺さっているときは0x0210となっているようです。(http://wiki.onakasuita.org/pukiwiki/?bcdUSB)

    キャンセル

  • 2017/05/22 19:07

    情報ありがとうございます。bcdUSBの値参照で、正しくUSB3.0を判別することが出来ました!
    素早い/的確なアドバイス、非常に助かりました!

    ありがとございます!!

    キャンセル

+1

最終的なコードを記載しておきます。(見づらいコードですが、、、、)
hmmmさん、協力感謝します!

※USB判別をbcdUSB参照に修正しました

// TargetList[num].nodeInfo.ParDevInst にUSBデバイスが接続されているHUBのDevInstが格納
// TargetList[num].nodeInfo.PortNum にUSBデバイスが接続されているHUBのPortNoが格納
int GetUsbDeviceSpeed( int num, WORD *speed )
{
    int    result = -1;
    HANDLE    h;

    // 初期値代入
    *speed = -1;

    if ( isTargetEnable( num, &h ) ) {
        DEVINST parentDevInst = TargetList[num].nodeInfo.ParDevInst;    // 対象デバイスの親(USB_HUB)DeviceInstance

        TCHAR usbHubDeviceID[MAX_DEVICE_ID_LEN];                        // 対象デバイスの親(USB_HUB)デバイスID
        memset(usbHubDeviceID, 0x00, sizeof(usbHubDeviceID));

        ULONG usbHubDevInstListSize = 0;                                // 対象デバイスの親(USB_HUB)デバイスインターフェースパス文字列サイズ
        TCHAR *usbHubDevicePath = NULL;                                    // 対象デバイスの親(USB_HUB)デバイスインターフェースパス

        HANDLE usbHubDeviceHandle   = 0;                                // CreateFileのハンドル

        PUSB_NODE_CONNECTION_INFORMATION_EX connectionInfoEx = NULL;    // HUBに接続されているデバイス情報


        while(1)    // エラー処理対応
        {
            // 接続されているUSB HUBのDeviceIDを取得
            result = CM_Get_Device_ID(parentDevInst, usbHubDeviceID, sizeof(usbHubDeviceID), 0);
            if( result != CR_SUCCESS ) {
                break;
            }

            // 接続されているUSB HUBのDeviceInterfaceの文字列サイズを取得
            result = CM_Get_Device_Interface_List_Size(&usbHubDevInstListSize, (LPGUID)&GUID_DEVINTERFACE_USB_HUB, usbHubDeviceID, 0);
            if( result != CR_SUCCESS ) {
                break;
            }

            // デバイスインターフェースパスを取得
            usbHubDevicePath = (TCHAR*)new char[usbHubDevInstListSize + 1];
            memset(usbHubDevicePath, 0x00, sizeof(usbHubDevInstListSize + 1));
            result = CM_Get_Device_Interface_List((LPGUID)&GUID_DEVINTERFACE_USB_HUB, usbHubDeviceID, usbHubDevicePath, usbHubDevInstListSize, 0);
            if( result != CR_SUCCESS ) {
                break;
            }

            // デバイスインターフェースパスを開く
            usbHubDeviceHandle = CreateFile(usbHubDevicePath,
                                            GENERIC_WRITE,
                                            FILE_SHARE_WRITE,
                                            NULL,
                                            OPEN_EXISTING,
                                            0,
                                            NULL);
            if( usbHubDeviceHandle == INVALID_HANDLE_VALUE )
            {
                result = -2;
                break;
            }

            // 構造体メモリー確保&初期化
            ULONG nBytesEx = sizeof(USB_NODE_CONNECTION_INFORMATION_EX) + sizeof(USB_PIPE_INFO) * 30;
            connectionInfoEx = (PUSB_NODE_CONNECTION_INFORMATION_EX)(new char[nBytesEx]);
            memset(connectionInfoEx, 0x00, nBytesEx);

            // 対象USB HUBポート番号を指定
            connectionInfoEx->ConnectionIndex = TargetList[num].nodeInfo.PortNum;

            // デバイス情報を取得
            BOOL success = DeviceIoControl(usbHubDeviceHandle,
                                IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX,
                                connectionInfoEx,
                                nBytesEx,
                                connectionInfoEx,
                                nBytesEx,
                                &nBytesEx,
                                0);
            if( success ) {
                // USB Speed情報を取得
                result = CR_SUCCESS;
                // *speed = connectionInfoEx->Speed; // ★正しく判別出来ないケースがあるので、bcdUSB値参照に変更
                *speed = connectionInfoEx->DeviceDescriptor.bcdUSB;
            }else{
                result = -3;
            }

            // 抜ける
            break;
        }

        if( usbHubDeviceHandle != INVALID_HANDLE_VALUE )
        {
            CloseHandle(usbHubDeviceHandle);
        }

        if(usbHubDevicePath) { delete[] usbHubDevicePath; }
        if(connectionInfoEx) { delete connectionInfoEx; }
    }

    return result;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る