標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第476回]
●XPでもUSBマウスが検出できました
[第474回]で、WindowsXPではCrearFile関数でUSBマウスの検出に失敗してしまいます、ということを書きました。
そうしましたら、メールをいただきました。
こちらのページ(http://noritan-micon.blog.so-net.ne.jp/2008-04-07)に書いてありますよ、と教えていただきました。
さっそく訪問させていただきました。
そのページのずっと下の、終わりに近いところに、
c)システムデバイス
と書いてあって、そこにUSBマウスとUSBキーボードについてのコメントがあります。
そのところを一部引用させていただきます。
[以下引用](原文のまま)
Windows はマウスとキーボードをシステムデバイスとして、直接のアクセスを制限します。
(一部省略)
キーボードとマウスに対するCreateFileは、次のパラメータで開けます。
CreateFile()
- dwDesiredAccess = 0
- dwDesiredAccess = (FILE_SHARE_READ | FILE_SHARE_WRITE)
[引用ここまで]
ただし下側の行に誤記があります。
−dwDesiredAccess=(FILE_SHARE_READ | FILE_SHARE_WRITE)ではなくて、−dwShareMode=
(FILE_SHARE_READ | FILE_SHARE_WRITE)です。
そういうことなのですか。
MSDNのCreateFileの説明(http://msdn.microsoft.com/ja-jp/library/cc429198.aspx)をもう一度参照してみました。
dwDesiredAccessに0を設定すると、「デバイスにアクセスすることなく、デバイス属性の問い合わせを行えます」と書いてあります。
HIDテストプログラムのCreateFileのところを直して試してみました。
dwShareMode(第3パラメータ)は、もとからFILE_SHARE_READ|FILE_SHARE_WRITEですから、dwDesiredAccess(第2パラメータ)のみ0に変更しました。
HANDLE handle = CreateFile( dev_det->DevicePath, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );そのように変更したHIDテストプログラムをWindowsXPマシンで実行した結果です。
unsigned long size; SetupDiGetDeviceInterfaceDetail( devinf, &spid, NULL, 0, &size, 0 ); PSP_INTERFACE_DEVICE_DETAIL_DATA dev_det = PSP_INTERFACE_DEVICE_DETAIL_DATA( new char[size] ); dev_det->cbSize=sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); // SetupDiGetDeviceInterfaceDetail( devinf, &spid, dev_det, size, &size, 0 ); cout << dev_det->DevicePath << endl;直したのは3行目と4行目です。
unsigned long size; SetupDiGetDeviceInterfaceDetail( devinf, &spid,NULL, 0, &size, 0 ); PSP_INTERFACE_DEVICE_DETAIL_DATA dev_det =new SP_INTERFACE_DEVICE_DETAIL_DATA[size]; dev_det->cbSize=sizeof(*dev_det); // SetupDiGetDeviceInterfaceDetail( devinf, &spid, dev_det, size, &size,0 ); cout << dev_det->DevicePath << endl;少しは見やすくなったと思います。