none
「デバイスクラス」と「デバイスGUID」について RRS feed

  • 質問

  •  

    ・デバイスクラス(デバイスGUID)について

    USB双方向通信ドライバのセットアップ情報ファイルですが、
    プリンタクラス・プリンタ以外のGUIDで指定してしまい、
    他社のプリンタのセットアッププログラムが異常終了してしまいました。

    本来のUSBクラスに変更したら、「他社プリンタのセットアッププログラム」は解決しました。

    ・セットアップ情報ファイルの内容

     [Version]
     Signature="$WINDOWS NT$"
     Class=Printer
     ClassGuid={ff646f80-8def-11d2-9449-00105a075f6b}
     Provider=%Provider%
     DriverVer=MM/DD/YYYY,1.0.0.0
     CatalogFile=CatalogFile.cat
     
     [ClassInstall32]
     Addreg=SampleClassReg
     
     [SampleClassReg]
     HKR,,,0,%ClassName%
     HKR,,Icon,,-5
     
     [Strings]
     Provider = "Provider"
     ClassName       = "Printer"

    ・下記、デバイスクラスとデバイスクラスGUIDは、デバイスクラスとデバイスクラスGUIDを
     ひも付けするだけで、「{ff646f80-8def-11d2-9449-00105a075f6b}」自体には、問題がない?
     (当然、{ff646f80-8def-11d2-9449-00105a075f6b}はユニーク・特定できなければならない前提で)

     Class=Printer
     ClassGuid={ff646f80-8def-11d2-9449-00105a075f6b}


    ・デバイスクラス(GUIDを含む)で指定した「Printerクラス(GUID)」は
     どこまで影響するものなのでしょか?

     Class=Printer
     ClassGuid={ff646f80-8def-11d2-9449-00105a075f6b}

     サイトで{ff646f80-8def-11d2-9449-00105a075f6b}を検索すると
     「NewDeviceClass」と表示されています。

    ・[ClassInstall32]で指定したクラス名「Printer(HKR,,,0,%ClassName%)」は、
     そのままでも今後、影響はありませんでしょうか?

    現在、動作確認できるデバイスが手元にありません。

    よろしくお願いいたします。

    漠然とした疑問内容ですが、
    宜しくお願い致します。

     

    • 移動 Mike Wang (MSCS) 2012年10月2日 13:03 (移動元:Windows デバイスドライバー開発)
    2012年6月14日 4:39

回答

  • きっと、プリンタ テクノロジーに精通されたエキスパートの方もご覧になっていると思うのですが、誰も返信しないようなので一応。。。
    (既に解決済みでしたらご容赦ください。)

    > USB双方向通信ドライバのセットアップ情報ファイルですが、

    「USB 双方向通信ドライバ」がどーいったものなのかよく理解出来ていなくて恐縮ですが。。。
    これって、もしかしてプリント モニタ(ポート モニタ or ランゲージ モニタ)のことを仰っているのでしょうか?
    プリンタ テクノロジーで、双方向通信に関連するモジュールとなると、プリント モニタ以外に思い浮かばないのですが、"USB" と明記されていることから、aida さんの開発されているのは、「ランゲージ モニタでは?」と推測しています。
    USB 接続のプリンタの場合、ポート モニタは通常 Windows OS に標準インストールされている usbmon.dll (および usbprint.sys) を使うはずだと思ったので、「だったらランゲージ モニタことかな?」と思ったのですが、もし独自の USB 専用のポート モニタを開発されているということであれば、以下の私の返信は全く意味を成さないので無視してください。

    で、aida さんの開発されているのがランゲージ モニタであると仮定して。。。

    既に参照されているとは思いますが、WDK で提供されているランゲージ モニタのサンプル (pjlmon) を確認すると、pjlmon.inf には "Version" セクションや "Class", "ClassGUID" エントリの定義は存在しません。
    なので、aida さんの inf ファイルでもこれらのセクションやエントリを記述する必要はないのでは?
    ポート モニタの場合は、確かにこれらのセクションやエントリを記述する必要があると思いますが、その場合でも、USB クラスを指定したらおかしくなっちゃうような気がするのです。
    「本来のUSBクラスに変更したら、問題は解決した」との記述がありますが、プリンタ ポート モニタ用 inf ファイルの Class / ClassGUID に USB クラスを指定するのもおかしい気がしますし、プリンタ ランゲージ モニタ用 inf ファイルであるならば、接続バスに依存する部分は下位のポート モニタ (usbmon.dll) で吸収されるはずなので、あえて "Version" セクションや "Class", "ClassGUID" エントリを記述する必要はないと思います。


    > 下記、デバイスクラスとデバイスクラスGUIDは、デバイスクラスとデバイスクラスGUIDを
    > ひも付けするだけで、「{ff646f80-8def-11d2-9449-00105a075f6b}」自体には、問題がない?

    ご質問の趣旨を的確に把握できている分かりませんが。。。
    「提示した inf ファイルでの、"Class", "ClassGUID" エントリの記述には問題がないか?」
    ということであれば、「問題がある」と思います。
    デバイス セットアップ クラスを表す "Class" および "ClassGUID" は、常に1対1の関係である必要があると思います。
    独自のデバイス セットアップ クラスを定義することも可能ですが、その場合、システムによりあらかじめ定義されているセットアップ クラスのクラス名および GUID とダブらない必要があると思います。
    ご提示されている inf では、既存のセットアップクラス名と重複しますが、異なる GUID が定義されることになると思います。
    既存のデバイス セットアップ クラスは下記レジストリに定義されていますが、"Printer" クラスに対応する ClassGUID は "{4D36E979-E325-11CE-BFC1-08002BE10318}" です。

    -------------------------------
    <デバイス セットアップ クラス情報が保持されているレジストリ キー>
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class
    -------------------------------

    ご提示されている inf の場合、1つのセットアップ クラス名に対して複数の GUID が存在することになり、"Class" と "ClassGUID" が1対1の関係でなくなります。
    (ちなみに USB クラスの GUID は "{36FC9E60-C465-11CF-8056-444553540000}" になります。)

    デバイス セットアップ クラスの情報が参照されるのは、デバイス ドライバのインストール時だけとは限らないはずです。
    たとえば、デバイス マネージャはセットアップ クラス別のデバイス ツリーを表示させるために、おそらくこのレジストリ情報を参照していると思いますし、Setup API を利用するアプリも、この情報にアクセスするはずです。
    たとえば、Setup API では SetupDiClassGuidsFromNameEx() という関数が用意されており、クラス名からそれに対応する GUID を取得することが可能となっていますが、1つのクラス名に対して複数の GUID が定義されている場合、この関数が期待通りに機能しない可能性があると思います。
    おそらく、「他社のプリンタのセットアッププログラムが異常終了」という問題も、そのセットアッププログラムが直接あるいは間接的に Setup API ためだと思います。

    ですので、aida さんが開発されているドライバ(モジュール?)が WDK で提供されているサンプルのどれに該当あるいは類似するのかを確認し、そのサンプルで提供されている inf ファイルの記述を参考に、ご自身の inf の修正を行うことをお勧め致します。

    以上、参考になりましたら幸いに存じます。

    2012年6月26日 8:04

すべての返信

  • きっと、プリンタ テクノロジーに精通されたエキスパートの方もご覧になっていると思うのですが、誰も返信しないようなので一応。。。
    (既に解決済みでしたらご容赦ください。)

    > USB双方向通信ドライバのセットアップ情報ファイルですが、

    「USB 双方向通信ドライバ」がどーいったものなのかよく理解出来ていなくて恐縮ですが。。。
    これって、もしかしてプリント モニタ(ポート モニタ or ランゲージ モニタ)のことを仰っているのでしょうか?
    プリンタ テクノロジーで、双方向通信に関連するモジュールとなると、プリント モニタ以外に思い浮かばないのですが、"USB" と明記されていることから、aida さんの開発されているのは、「ランゲージ モニタでは?」と推測しています。
    USB 接続のプリンタの場合、ポート モニタは通常 Windows OS に標準インストールされている usbmon.dll (および usbprint.sys) を使うはずだと思ったので、「だったらランゲージ モニタことかな?」と思ったのですが、もし独自の USB 専用のポート モニタを開発されているということであれば、以下の私の返信は全く意味を成さないので無視してください。

    で、aida さんの開発されているのがランゲージ モニタであると仮定して。。。

    既に参照されているとは思いますが、WDK で提供されているランゲージ モニタのサンプル (pjlmon) を確認すると、pjlmon.inf には "Version" セクションや "Class", "ClassGUID" エントリの定義は存在しません。
    なので、aida さんの inf ファイルでもこれらのセクションやエントリを記述する必要はないのでは?
    ポート モニタの場合は、確かにこれらのセクションやエントリを記述する必要があると思いますが、その場合でも、USB クラスを指定したらおかしくなっちゃうような気がするのです。
    「本来のUSBクラスに変更したら、問題は解決した」との記述がありますが、プリンタ ポート モニタ用 inf ファイルの Class / ClassGUID に USB クラスを指定するのもおかしい気がしますし、プリンタ ランゲージ モニタ用 inf ファイルであるならば、接続バスに依存する部分は下位のポート モニタ (usbmon.dll) で吸収されるはずなので、あえて "Version" セクションや "Class", "ClassGUID" エントリを記述する必要はないと思います。


    > 下記、デバイスクラスとデバイスクラスGUIDは、デバイスクラスとデバイスクラスGUIDを
    > ひも付けするだけで、「{ff646f80-8def-11d2-9449-00105a075f6b}」自体には、問題がない?

    ご質問の趣旨を的確に把握できている分かりませんが。。。
    「提示した inf ファイルでの、"Class", "ClassGUID" エントリの記述には問題がないか?」
    ということであれば、「問題がある」と思います。
    デバイス セットアップ クラスを表す "Class" および "ClassGUID" は、常に1対1の関係である必要があると思います。
    独自のデバイス セットアップ クラスを定義することも可能ですが、その場合、システムによりあらかじめ定義されているセットアップ クラスのクラス名および GUID とダブらない必要があると思います。
    ご提示されている inf では、既存のセットアップクラス名と重複しますが、異なる GUID が定義されることになると思います。
    既存のデバイス セットアップ クラスは下記レジストリに定義されていますが、"Printer" クラスに対応する ClassGUID は "{4D36E979-E325-11CE-BFC1-08002BE10318}" です。

    -------------------------------
    <デバイス セットアップ クラス情報が保持されているレジストリ キー>
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class
    -------------------------------

    ご提示されている inf の場合、1つのセットアップ クラス名に対して複数の GUID が存在することになり、"Class" と "ClassGUID" が1対1の関係でなくなります。
    (ちなみに USB クラスの GUID は "{36FC9E60-C465-11CF-8056-444553540000}" になります。)

    デバイス セットアップ クラスの情報が参照されるのは、デバイス ドライバのインストール時だけとは限らないはずです。
    たとえば、デバイス マネージャはセットアップ クラス別のデバイス ツリーを表示させるために、おそらくこのレジストリ情報を参照していると思いますし、Setup API を利用するアプリも、この情報にアクセスするはずです。
    たとえば、Setup API では SetupDiClassGuidsFromNameEx() という関数が用意されており、クラス名からそれに対応する GUID を取得することが可能となっていますが、1つのクラス名に対して複数の GUID が定義されている場合、この関数が期待通りに機能しない可能性があると思います。
    おそらく、「他社のプリンタのセットアッププログラムが異常終了」という問題も、そのセットアッププログラムが直接あるいは間接的に Setup API ためだと思います。

    ですので、aida さんが開発されているドライバ(モジュール?)が WDK で提供されているサンプルのどれに該当あるいは類似するのかを確認し、そのサンプルで提供されている inf ファイルの記述を参考に、ご自身の inf の修正を行うことをお勧め致します。

    以上、参考になりましたら幸いに存じます。

    2012年6月26日 8:04
  • aida 様、その後いかがでしょうか。

    お馬鹿から有効と思われる情報の提示がありましたので、、一旦回答としてマークさせて頂きます。

    もしもさらに別の質問がある場合には、新たにスレッドを作られることをお勧めします。

    2012年8月22日 17:22
    モデレータ
  • ありがとうございます。

    あきらめてアクセスしておりませんでした。

    失礼しました。

    2016年3月3日 10:16