テクニカル ドキュメント #86



Doc ID: 86
製品: WinDriver
Version:  --

挿入もしくは取り外された USB デバイスをどのように検出しますか?

WinDriver v5.20 を使用してる場合、WinDriver の API を使用して、特定の Plug-and-Play および/または、デバイスの挿入/取り外しの通知、またそのような状況を処理するアプリケーション内で関連する call-back の実装を含む、OS からの電源管理の通知など、をリスンするように登録できます。v6.0 およびそれ以降を使用する際には、WDU_Init() 関数を使用して、通知をリスンするように登録します。v5.20 - v5.22 の場合、event_register() を使用します。詳細は WinDriver のユーザー マニュアルを参照してください。

WinDriver の以前のバージョン - v5.05b またはそれ以前の場合、WinDriver は、Plud-and-Play および電源管理イベントの特定の API のサポートを提供していませんでした。これらのバージョンでは、WD_UsbScanDevice() 関数で、関数の呼び出し時にコンピュータに接続されているデバイスを検出します。他のデバイスを後でコンピュータに接続したり、切断したりした場合、これらの変更を自動的に検出しません。この変更を検出するには、WD_UsbScanDevice() 関数を再び呼ぶ必要があります。ただし、WinDriver USB ドライバはユーザー モード WIN32 アプリケーションなので、挿入/取り外しの通知を取得することはできます。Windows はすべてのアプリケーションに WM_DEVICECHANGE メッセージを送信します。アプリケーションがこのメッセージを受信すると、デバイスの挿入/取り外しの際に、WD_UsbScanDevice() 関数を呼ぶ必要があります (これは Windows にのみあてはまります)。このため、Win32 API を使用するのと同様に、WinDriver の以前のバージョンで、PnP デバイスの挿入/取り外しのサポートを実装することができます。デバイスが接続されているかどうか確認するためにデバイスに GET_DESCRIPTOR 要求を送信することもできます (WD_UsbTransfer() 関数を使用)。デバイスが取り外された後にデバイスを処理するには、まず WD_UsbDeviceUnregister() 関数を呼んで、デバイスへの以前のハンドルを解放する必要があり、そして、デバイスを検出するために USB バスを再スキャンし (WD_UsbDeviceScan() 関数を使用)、デバイスの設定情報を取得し (WD_UsbGetConfiguration() 関数を呼んで)、WD_UsbDeviceRegister() 関数を呼んで、デバイスを再レジスタする必要があります。