Vb.net 拒绝对USB设备的通用\u读取访问,授予使用CreateFile()的通用\u写入权限

Vb.net 拒绝对USB设备的通用\u读取访问,授予使用CreateFile()的通用\u写入权限,vb.net,winapi,access-denied,createfile,Vb.net,Winapi,Access Denied,Createfile,我有一些我编写的代码,它们偶尔工作,我不理解它成功或失败的原因。所讨论的代码相当简单,只需从VB.NET调用CreateFile() Dim Handle As Integer = Win32.CreateFile(KeyboardPath, GENERIC_READ Or GENERIC_WRITE, _ FILE_SHARE_READ Or FILE_SHARE_WRITE, Nothing, _

我有一些我编写的代码,它们偶尔工作,我不理解它成功或失败的原因。所讨论的代码相当简单,只需从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错误\u ACCESS\u DENIED,但是如果我删除了泛型\u READ请求,句柄就被授予了。这种情况以前发生过(在另一台机器上),我完全搞不懂什么样的事件序列会导致写入设备而不是读取设备。所讨论的设备是Logitech G510键盘,这段代码以前在Vista 32位系统上运行良好(我现在正在Win7 x64系统上测试它,并修复我能找到的所有兼容性问题)

我的问题是,是什么导致CreateFile偶尔退回到只允许写访问,我做错了什么导致它这么做,我将如何着手解决这个问题?我在下面包含了完整的函数-注意,只有传递了GENERIC_READ标志,我也没有被分配句柄(相同的错误)

作为参考,我使用的特定设备路径是
\?\hid\vid\u 046d&pid\u c2d&mi\u 00 7&1a08be07&0&0000{4d1e55b2-f16f-11cf-88cb-001111000030}
(这是用于Logitech G510游戏键盘) 此外,代码在有管理员权限和没有管理员权限的情况下都有类似的表现,如果可能的话,我希望能够在没有这些权限的情况下运行,因为我不需要它们(在我的vista系统上也不需要它们才能正常工作)


如果键盘的功能不适合普通键盘类,那么它很可能会公开多个设备实例,一个包含正常键盘行为,另一个用于新奇的东西


其中一个实例很可能是只写。

如何向键盘写入?如果你真的不需要写的话,试着用泛型的“读”来打开它。此外,某些类别的设备可以在没有访问权限的情况下打开,并且它们的IOCTL仍然有效。我想写的是键盘吗?具体来说,背光、LED和LCD面板都需要写。另外,普通的只读也有同样的问题。我将把这一点添加到主要问题中。键盘有没有可能显示为两个设备,一个是普通的可读键盘,另一个是只写,对应于所有新奇的东西?或者可能是键盘类驱动程序已经用共享模式
文件\u共享\u写入
打开键盘,以独占方式访问传入的击键。@Ben将您关于同一设备的多个条目的评论作为答案输入,结果就是这样。当我想要vid_046d&pid_c2d&mi_01&col02时,我正在寻找与vid_046d&pid_c2d&mi_01&col02匹配的设备字符串-当然这就引出了mi_xx和col_xx的含义。。。
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