none
Windows 7 における USB SuperSpeedデバイスの認識について RRS feed

  • 質問

  • WDK8.1 を用いてUSB3.0デバイスドライバを作成している者ですが,以下の状況でOSがSuperSpeedデバイスをHighSpeedデバイスとして認識してしまいます。

    (デバイスコンテキストのIsDeviceSuperSpeedがFALSEで,IsDeviceHighSpeedがTRUEとなります。)

    ドライバの動作環境

     OS:Windows 7 64bit Professional

     PC機種:Dell Optiplex 9020,Dell Precision T1700

    ドライバのビルド環境(Visual Studio 2013 Pro 使用)

     ソリューション構成:Win7 Debug

     ソリューションプラットフォーム:x64

    同じドライバをWindows 8.1 64bit環境で動作させるとデバイスをSuperSpeedデバイスとして認識します。

    (IsDeviceSuperSpeedとIsDeviceHighSpeedが共にTRUEになります。)

    この現象はWindowsの仕様によるものなのでしょうか。

    また,このようなWindows 7環境でSuperSpeedの速度による通信を行うことはできるのでしょうか。

    教えていただけますと幸いです。



    2014年5月28日 6:23

回答

  • > ソースコードの詳しい確認は行っていませんが

    サンプル ドライバのソース コードを確認されないのは、どのような理由からでしょうか?

    USBSamp ドライバのソース コード device.c を確認すればすぐに気づくことだと思いますが、このドライバの SelectInterfaces() には以下の処理があります。

    <device.c>

    NTSTATUS
    SelectInterfaces(
        _In_ WDFDEVICE Device
        )
    {
    ....
    ....
    #if (NTDDI_VERSION >= NTDDI_WIN8)
                if (pDeviceContext->IsDeviceSuperSpeed) {
                    status = InitializePipeContextForSuperSpeedDevice(pDeviceContext,
                                                                      pipe);
                }
                else if (pDeviceContext->IsDeviceHighSpeed) {
                    status = InitializePipeContextForHighSpeedDevice(pipe);
                } 
                else {
                    status = InitializePipeContextForFullSpeedDevice(pipe);
                }
    #else
                if (pDeviceContext->IsDeviceHighSpeed) {
                    status = InitializePipeContextForHighSpeedDevice(pipe);
                } 
                else {
                    status = InitializePipeContextForFullSpeedDevice(pipe);
                }
    #endif
    ....
    ....
    }

    上記マクロの意味が理解できないのであれば、ドライバ開発は難しいと思います。


    > インストール終了直後(ドライバロード直後?)にOSがクラッシュし,ブルースクリーンになる。

    ドライバを開発しようとしているのに、なぜデバッグしないのでしょうか?
    ドライバ開発には、BSOD はつきものです。
    BSOD を一度も経験せずにドライバを開発することは、間違いなく不可能です。

    まずは、Win8 / Win8.1 ソリューション構成で BSOD になる原因をちゃんと調査することをお勧めいたします。

    • 回答としてマーク 星 睦美 2014年6月26日 4:16
    2014年6月19日 3:12

すべての返信

  • フォーラム オペレーターの星 睦美です。

    前回投稿いただいたスレッドの最後のMisoSoupProcessor さんからの質問「WDK8.1で作ったUSB3.0のFunctionドライバが動作するようなWindows 7 PC(64bit/32bitそれぞれ)の既製品はあるのでしょうか?」に関して、残念ながらフォーラム ユーザーからの情報はありませんでしたが、この内容は今回の質問と関連していますでしょうか?

    ・Windows 7上でWDK 8.1を用いてUSB3.0ドライバを作れるのでしょうか?:
    http://social.msdn.microsoft.com/Forums/ja-JP/125b5918-0efa-4941-9eac-be60f4e03463/windows-7wdk-81usb30?forum=windowsgeneraldevelopmentissuesja

    私のほうで今回の質問を「Windows7 はUSB3.0 をサポートしているかどうかを確認したい」と読みましたので確認させていただきました。


    フォーラム オペレーター 星 睦美 - MSDN Community Support


    • 編集済み 星 睦美 2014年5月29日 7:50 改行
    2014年5月29日 7:49
  • お返事が遅くなりまして申し訳ございません。

    はい,前回の質問に関連しています。

    Windows 7で動作するかは不明でしたがMicrosoftさんが作成したサンプルドライバ(USBSamp)を動作させたところ,上記のような現象が確認されたため質問させていただきました。

    2014年6月18日 8:16
  • > ソリューション構成:Win7 Debug

    ↑ これが問題なのでは?
    USBSamp のソース コードはちゃんと確認されましたか?

    2014年6月18日 9:40
  • ソースコードの詳しい確認は行っていませんが,ソリューション構成をWin7 Debugにした理由は以下の通りです。

    ・USBSampソリューションに用意されているソリューション構成は以下の6通り。

      Win7 Debug/Release

      Win8 Debug/Release

      Win8.1 Debug/Release

    ・Win8 Debug/ReleaseまたはWin8.1 Debug/Releaseにしてビルドしたドライバを上記環境にインストールすると

     インストール終了直後(ドライバロード直後?)にOSがクラッシュし,ブルースクリーンになる。

    ・Win7 Debug/Releaseの場合はOSはクラッシュしない。

    2014年6月19日 2:28
  • > ソースコードの詳しい確認は行っていませんが

    サンプル ドライバのソース コードを確認されないのは、どのような理由からでしょうか?

    USBSamp ドライバのソース コード device.c を確認すればすぐに気づくことだと思いますが、このドライバの SelectInterfaces() には以下の処理があります。

    <device.c>

    NTSTATUS
    SelectInterfaces(
        _In_ WDFDEVICE Device
        )
    {
    ....
    ....
    #if (NTDDI_VERSION >= NTDDI_WIN8)
                if (pDeviceContext->IsDeviceSuperSpeed) {
                    status = InitializePipeContextForSuperSpeedDevice(pDeviceContext,
                                                                      pipe);
                }
                else if (pDeviceContext->IsDeviceHighSpeed) {
                    status = InitializePipeContextForHighSpeedDevice(pipe);
                } 
                else {
                    status = InitializePipeContextForFullSpeedDevice(pipe);
                }
    #else
                if (pDeviceContext->IsDeviceHighSpeed) {
                    status = InitializePipeContextForHighSpeedDevice(pipe);
                } 
                else {
                    status = InitializePipeContextForFullSpeedDevice(pipe);
                }
    #endif
    ....
    ....
    }

    上記マクロの意味が理解できないのであれば、ドライバ開発は難しいと思います。


    > インストール終了直後(ドライバロード直後?)にOSがクラッシュし,ブルースクリーンになる。

    ドライバを開発しようとしているのに、なぜデバッグしないのでしょうか?
    ドライバ開発には、BSOD はつきものです。
    BSOD を一度も経験せずにドライバを開発することは、間違いなく不可能です。

    まずは、Win8 / Win8.1 ソリューション構成で BSOD になる原因をちゃんと調査することをお勧めいたします。

    • 回答としてマーク 星 睦美 2014年6月26日 4:16
    2014年6月19日 3:12
  • > USBSamp ドライバのソース コード device.c を確認すればすぐに気づくことだと思いますが、このドライバの SelectInterfaces() には以下の処理があります。

    すみませんがこの処理を抜粋された意図が理解できません。

    >(デバイスコンテキストのIsDeviceSuperSpeedがFALSEで,IsDeviceHighSpeedがTRUEとなります。)

    と質問文で述べましたように,pDeviceContext->IsDeviceSuperSpeed 

    が既にFALSEになっているので,問題はマクロを用いた分岐の前にあります。

    > ドライバを開発しようとしているのに、なぜデバッグしないのでしょうか?
    > ドライバ開発には、BSOD はつきものです。
    > BSOD を一度も経験せずにドライバを開発することは、間違いなく不可能です。

    > まずは、Win8 / Win8.1 ソリューション構成で BSOD になる原因をちゃんと調査することをお勧めいたします。

    アドバイスを下さりありがとうございます。

    詳細にコードを追っていなかったことはドライバ開発を行う者として恥ずかしい限りです。

    デバッグ環境を整えBSODの原因を調べていきます。

    2014年6月19日 7:12
  • > すみませんがこの処理を抜粋された意図が理解できません。

    #if (NTDDI_VERSION >= NTDDI_WIN8)
    // ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    // このコード ブロックは、ソリューション構成が
    // Win8 Debug/Release 以上の場合にコンパイルされる。
    
                if (pDeviceContext->IsDeviceSuperSpeed) {
                    status = InitializePipeContextForSuperSpeedDevice(pDeviceContext,
                                                                      pipe);
                }
                else if (pDeviceContext->IsDeviceHighSpeed) {
                    status = InitializePipeContextForHighSpeedDevice(pipe);
                } 
                else {
                    status = InitializePipeContextForFullSpeedDevice(pipe);
                }
    #else
    // ソリューション構成が Win7 Debug/Release の場合、
    // こっちのコード ブロックがコンパイルされる。
                if (pDeviceContext->IsDeviceHighSpeed) {
                    status = InitializePipeContextForHighSpeedDevice(pipe);
                } 
                else {
                    status = InitializePipeContextForFullSpeedDevice(pipe);
                }
    #endif

    MisoSoupProcessor さんがビルドされた USBSamp ドライバのバイナリには、下記関数がちゃんと含まれていますか?

    #if (NTDDI_VERSION >= NTDDI_WIN8)
    #pragma alloc_text(PAGE, UsbSamp_EvtPipeContextCleanup)
    #pragma alloc_text(PAGE, InitializePipeContextForSuperSpeedDevice)
    #pragma alloc_text(PAGE, GetEndpointDescriptorForEndpointAddress)
    #pragma alloc_text(PAGE, InitializePipeContextForSuperSpeedIsochPipe)
    #endif

    > デバッグ環境を整えBSODの原因を調べていきます。

    ドライバ開発は、BSOD との戦いです。
    デバッグ環境なくして、ドライバ開発はあり得ません。

    P.S.
    以前に投稿された質問で、お礼の返信をされていないスレッドが複数あるようですが、回答してくださった方は、皆「あなたのため」に情報を提供してくださったのですよ。
    質問のしっぱなし。。。という姿勢には、正直共感できません。
    (なので、ホントは返信するつもりはなかったのですが。。。)

    かなり辛辣な表現になってしまいましたが、頑張ってください。

     

     
    • 編集済み お馬鹿 2014年6月19日 8:02 誤記訂正
    2014年6月19日 7:52