VC++6.0 Win2k/XP
USB Descriptor(Device,Config,Interface,Endpoint,String)の情報を
取得して、表示するアプリケーションを作成したいのですが、
どうやって情報を取得すればよいのか分かりません。
本や、ホームページ等でもかまいませんので、何かヒントになりそうな
ものをご存知の方がいましたら、ぜひ教えてください。
よろしくお願いします。
Google で検索してみました
http://www.google.com/search?q=%22usb+descriptor%22+DDK&ie=UTF-8&oe=UTF-
8&hl=ja&lr=
その結果幾つか見つかりましたが
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/still/hh/still/stifnc_6p7t.asp
http://www.microsoft.com/hwdev/archive/BUSBIOS/usbpnp.asp
などは如何(いかが)でしょうか。参考になりましたか?
島さん、どうもありがとうございます。
とても参考になりました。
DeviceIoControl()のCodeに「IOCTL_GET_USB_DESCRIPTOR」を
指定することで情報が取得できそうです。
「できました!」と報告がしたくてがんばってみたのですが、
現状は、関数は失敗してERROR_NOT_SUPPORTEDというエラーと
なります。パラメータの値等、もうちょっと見直してみますね。
どうもありがとうございました。
いろいろ試してみましたが、どうしても解決できませんでした。
(ERROR_NOT_SUPPORTEDというエラーが出てしまいます。)
海外の記事なども検索してみましたが、そこでも同様の状況で
困ってる人がいました・・・
そこでは、「IOCTL_GET_USB_DESCRIPTOR」のコマンドは、全てのデバイスが
対応しているわけではなく、実際ほとんどのものが対応していないと
いうような意見を発言されている方がいらっしゃいました。
これは本当なのでしょうか?
本当なのであれば、他の方法でUSB Descriptorの情報を取得しなければ
ならないことになるのですが、何かご存知の方がいらっしゃいましたら
アドバイスいただけないでしょうか?
よろしくお願いいたします。
>ももさん
わたしも、現在USBHDDのドライブ情報を取得できないか色々と探しています。
私の場合、戻り値に
ERROR_NOT_SUPPORTED
が戻ってきません。
値の設定が間違っているのでしょうか?
------------------------------------------------------------
char bufa[2048];
USB_DEVICE_DESCRIPTOR* udd = (USB_DEVICE_DESCRIPTOR*)bufa;
USBSCAN_GET_DESCRIPTOR lpInBuffer = {USB_DEVICE_DESCRIPTOR_TYPE, 0, 0};
ZeroMemory( udd, sizeof (bufa) );
flg = DeviceIoControl(
hDevice,// USBドライブのハンドル(取得は確認済み)
IOCTL_GET_USB_DESCRIPTOR,
&lpInBuffer,
sizeof (lpInBuffer),
udd,
sizeof( bufa ),
&dwRet,
NULL);
------------------------------------------------------------
宜しくお願いします。
もう少し別な手段を取り、「IoCallDriver」を使用したUSBの詳細情報の取得を行うとしていま
す。
手順としては
1・「URB」構造体の領域確保
2・「USB_DEVICE_DESCRIPTOR」構造体の領域確保
3・「UsbBuildGetDescriptorRequest」を使用して「URB」構造体にセット
4・「IRP」構造体へポインタを指定する為「IoBuildDeviceIoControlRequest」を使用
5・「IoCallDriver」を使用して詳細を取得
以上です。
しかし、USB制御に関しては殆ど素人のため、4番目の「IRP」に代入する手順の部分で、
「IoBuildDeviceIoControlRequest」の第2引数である「DEVICE_OBJECT」構造体の
値の指定方法が分かりません。
「DEVICE_OBJECT」構造体へ値をセットするための関数はあるのでしょうか?