【发布时间】:2011-08-07 05:07:29
【问题描述】:
我编写的一些代码偶尔会起作用,但我不明白它成功或失败的原因。有问题的代码相当简单,只需从 VB.NET 调用 CreateFile();
Dim Handle As Integer = Win32.CreateFile(KeyboardPath, GENERIC_READ Or GENERIC_WRITE, _
FILE_SHARE_READ Or FILE_SHARE_WRITE, Nothing, _
OPEN_EXISTING, &H80, 0)
问题是当我调用它时,我得到了 win32 错误 ERROR_ACCESS_DENIED,但如果我删除 GENERIC_READ 请求,句柄被授予就好了。这曾经发生过(在另一台机器上),我完全不知道什么样的事件序列会导致能够写入设备而不是读取设备。有问题的设备是 Logitech G510 键盘,此代码之前在 Vista 32 位系统上运行良好(我现在正在 Win7 x64 系统上对其进行测试并修复我能找到的所有兼容性问题)。
我的问题是,什么会导致 CreateFile 偶尔回退到只允许写访问,我做错了什么导致它这样做,我将如何解决这个问题?我在下面包含了完整的功能 - 请注意,仅通过 GENERIC_READ 标志,我也没有分配句柄(同样的错误)
作为参考,我一直使用的特定设备路径是\\?\hid#vid_046d&pid_c22d&mi_00#7&1a08be07&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}(这是针对罗技 G510 游戏键盘的)
此外,代码在有和没有管理员权限的情况下执行相似,如果可能的话,我希望能够在没有这些权限的情况下运行,因为我不需要它们(并且它不需要它们在我的 vista 系统上正常工作) .
Private Function OpenInterface(ByVal KeyboardPath As String) As Integer
Dim Handle As Integer = Win32.CreateFile(KeyboardPath, GENERIC_READ Or GENERIC_WRITE, _
FILE_SHARE_READ Or FILE_SHARE_WRITE, Nothing, _
OPEN_EXISTING, &H80, 0)
Dim ee As Integer = GetLastError()
Return Handle
End Function
【问题讨论】:
-
如何在键盘上写字?如果您真的不需要写入它,请尝试仅使用 GENERIC_READ 打开。此外,某些类别的设备可以在没有访问权限的情况下打开,并且它们的 IOCTL 仍然有效。
-
This 是我要写入的键盘 - 具体来说,需要写入背光、LED 和 LCD 面板。
-
另外,单独的 GENERIC_READ 也出现了同样的问题 - 我将把它添加到主要问题中。
-
键盘是否有可能显示为两个设备,一个是普通可读键盘,一个是只写对应于所有花哨的东西?或者,键盘类驱动程序可能已经以共享模式
FILE_SHARE_WRITE打开了键盘,以获得对传入击键的独占访问权。 -
@Ben 输入您对同一设备的多个条目的评论作为答案,结果就是这样。当我想要 vid_046d&pid_c22d&mi_01&col02 时,我正在寻找与 vid_046d&pid_c22d&mi_00 匹配的设备字符串 - 当然这会导致 mi_xx 和 col_xx 的含义......
标签: vb.net winapi access-denied createfile