スキップしてメイン コンテンツへ

 none
WM_DEVICECHANGE の DBT_DEVICEARRIVAL と DBT_DEVICEREMOVECOMPLETEについて RRS feed

  • 質問

  • USBのファクションドライバとWINアプリ、デバイス側のファーム作ってます。
    WINアプリ側で表題のメッセージ捕まえて、デバイスの接続状態確認していたのですが、
    自作のドライバではWM_DEVICECHANGEは発生するのですが、
    lParam=00000000/wParam=00000007のwmしか発生しません。

    ドライバのPnPの ”IRP_MN_START_DEVICE" / "IRP_MN_SURPRISE_REMOVAL"
    辺りの記述が何か足りないのでしょうか?
    • 移動 Mike Wang (MSCS) 2012年10月2日 11:25 (移動元:Windows デバイスドライバー開発)
    2009年6月16日 6:09

すべての返信

  • 自己レスです。
    DBT_DEVICEARRIVAL(0x8000)/ DBT_DEVICEREMOVECOMPLETE(0x8004)
    はメディアデバイス固有のwParamaなのですね・・・;^_^
    http://msdn.microsoft.com/en-us/library/aa363480.aspx

    USBメモリを挿した時は発生するのに、自作デバイス挿した時は何も起こらないので
    又、何かしでかしてしまったかと思ってしまいました。
    お騒がせしました。
    2009年6月16日 13:02
  • y-nagaokaさん

    一般的には、デバイスの通知を受けたい場合、RegisterDeviceNotification()を呼ぶ必要があります。
    http://msdn.microsoft.com/en-us/library/aa363431(VS.85).aspx

    RegisterDeviceNotification()のパラメータですが、すべてのUSBデバイスの通知を受ける場合、DBT_DEVTYP_DEVICEINTERFACE で、GUID をGUID_CLASS_USB_DEVICEに指定しますと、うまくいくと思います。独自のデバイスのみの通知を受けたい場合、そのデバイスのファンクションドライバで登録したデバイスインタフェースのGUIDを使用してください。

    ボリュームデバイスとポートクラスのデバイスだけは、変則的で、RegisterDeviceNotification()を呼ばなくても、通知されます。この点について、同じMSDNのドキュメントにこんな記述があります。

    The DBT_DEVICEARRIVAL and DBT_DEVICEREMOVECOMPLETE events are automatically broadcast to all top-level windows for port devices. Therefore, it is not necessary to call RegisterDeviceNotification for ports, and the function fails if the dbch_devicetype member is DBT_DEVTYP_PORT. Volume notifications are also broadcast to top-level windows, so the function fails if dbch_devicetype is DBT_DEVTYP_VOLUME.

    2009年6月17日 14:17
  • cleng_sdさんアドバイスありがとうございます。
    実は先ほどご指摘の通り、RegisterDeviceNotification()でDBT_DEVICEARRIVAL(0x8000)/ DBT_DEVICEREMOVECOMPLETE(0x8004)
    が発生するのを確認できた所です。

    更にVID/PIDをチェックして自社USBデバイスにのみ反応する記述を追加する予定です。
    又、分からない事ありましたら、宜しくお願い致します。
    2009年6月18日 5:50
  • 自己レスです。
    vid/pidではなく、cleng_sdさんのご助言通り、RegisterDeviceNotification()でドライバのguidを指定し、
    wm_devicechangeの"lParam" からドライバのguid取得でき、これで自社USBデバイスの特定ができました。

    重ね重ね有難うございました。

    2009年6月18日 9:37