C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: HIDデバイスのオープン


(過去ログ 61 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■35352 / inTopicNo.1)  HIDデバイスのオープン
  
□投稿者/ SHAL (1回)-(2009/04/27(Mon) 02:00:25)

分類:[.NET 全般] 

環境:C#
SetupDiGetDeviceInterfaceDetailにて取得したドライバパスを利用して
CreateFileでHIDデバイスのオープンを試みておりますが、失敗が返ってきてしまいます。

自分が取得したHIDデバイスのパスを調べると
"\\\\?\\hid#vid_0461&pid_4d15#6&22309ee6&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
このような値で格納されています。
上記はGuidをHidD_GetHidGuidで取得してそこからひっぱてきたパスになります。

上記のものをCreateFileの第一引数に渡しているのですが開くことができません。(-1)
CreateFile(PATH,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
IntPtr.Zero);

パスの扱い方が違うのか、CreateFileの使い方が間違っているのか、そもそも自作でないHIDデバイスへのアタッチができないのか、要領が得ず前身することができません。
サンプルの数も少なく、非力ながら一通り試したのですが解決に至らずこちらで質問させていただきます。

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

引用返信 編集キー/
■35353 / inTopicNo.2)  Re[1]: HIDデバイスのオープン
□投稿者/ オショウ (166回)-(2009/04/27(Mon) 08:00:46)
No35352 (SHAL さん) に返信
> 自分が取得したHIDデバイスのパスを調べると
> "\\\\?\\hid#vid_0461&pid_4d15#6&22309ee6&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"

  コード自体は間違っていないような・・・
  ですが、HIDデバイスパスの文字列に間違いがあります。

  通常は、『\\.\』(C言語系では\\\\.\\)となりますが、『.』が『?』になってます。

  ご確認下さい。

※ 因みに、何のデバイスパスを取得して開こうとしているんですか?
  時にはそのデバイスのステータス確認をしないと無い場合開けません。

以上。
引用返信 編集キー/
■35355 / inTopicNo.3)  Re[2]: HIDデバイスのオープン
□投稿者/ 774RR (349回)-(2009/04/27(Mon) 09:15:43)
\\?\hid#vid_... という「デバイスパス」は正しい代物で、決して \\.\ では無い。
prefix of turn-off path parsing という奴ね。
C++ で、だけど、このパスでウチで作った HID をウチで作った制御ソフトで開けることを確認済み。

自作でない HID の場合、特にマウスやキーボードは、Windows 自体が制御をつかんでいるので
フツーにやったのでは開けない(これも実験済み)。

何がしたいの?単なる実験?

# Human Interface Device デバイスと書くと馬から落馬、頭痛が痛い・・・
引用返信 編集キー/
■35358 / inTopicNo.4)  Re[3]: HIDデバイスのオープン
□投稿者/ SHAL (2回)-(2009/04/27(Mon) 10:05:41)
ご回答ありがとうございます
目的はあえて言うと「ユーザーモードの限界を知る実験」です。
目指す挙動は既存のWindows自体が制御をつかんでいるデバイスをCreateFile→最終的にHidP_GetButtonEXに行き着きたいと考えていました。

774RRさんの意見をいただきこちらでもC++でも作成し、パスを確認してみたところ
DevicePath = 0x003e3254 "\\?\hid#vid_0461&pid_4d15#6&22309ee6&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
となっていました。
これにCreateFileを試みるとやはり0xffffffffが返ってきました。

PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]);
の部分をC#に移植した部分がどうも怪しくパスに疑問を持っていたのですが、安心しました。

>>自作でない HID の場合、特にマウスやキーボードは、Windows 自体が制御をつかんでいるので
>>フツーにやったのでは開けない(これも実験済み)。
貴重な情報をありがとうございます。昔(98時代)会社の上司がHIDキーボードの共有について話していたのを少し覚えていたのですがどうやら過去の遺産のようですね。残念。

>>フツーにやったのでは開けない 
の部分が個人的にはすごく気になります。(笑)

結論としては「開けない」のが仕様みたいなので今回は諦めたいと思います。
今後、上記の事例を満たすプロジェクトの作成はHIDミニドライバ等でカバーするものだと認識することにします。

ありがとうございました。


引用返信 編集キー/
■35359 / inTopicNo.5)  Re[3]: HIDデバイスのオープン
□投稿者/ オショウ (167回)-(2009/04/27(Mon) 11:04:32)
No35355 (774RR さん) に返信
> \\?\hid#vid_... という「デバイスパス」は正しい代物で、決して \\.\ では無い。
> prefix of turn-off path parsing という奴ね。
> C++ で、だけど、このパスでウチで作った HID をウチで作った制御ソフトで開けることを確認済み。

  永らく離れていたので、忘れてましたネ!
  ご指摘ありがとうございます。

> 自作でない HID の場合、特にマウスやキーボードは、Windows 自体が制御をつかんでいるので
> フツーにやったのでは開けない(これも実験済み)。

  仮想化できるので、HDEVINFO?かどうか忘れましたが、どこからかハンドル取って
  DuplicateHandleで複製して利用できるはずですが。

  VNCのソースコード出回っているので、解析してみれば・・・

※ Windowsの場合、よほどのことがないとハンドルとれるはずです。
  どこまで掘り下げるかですが・・・

※ OSによっては、権限も必要になりますので、ご注意下さい。
  そうしないと、-1が返ってきます。
  VISTAなんかでは、当たり前にそうなります。

以上。参考まで。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -