拒绝GENERIC_READ访问USB设备,授予GENERIC_WRITE和CreateFile()

时间:2011-04-17 06:42:09

标签: 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, _
                                         OPEN_EXISTING, &H80, 0)

问题在于,当我调用它时,我得到了win32错误ERROR_ACCESS_DENIED,但是如果我删除了GENERIC_READ请求,则句柄被授予就好了。这发生在之前(在不同的机器上),并且我完全难以理解将导致能够写入设备而不是从设备读取的事件序列。有问题的设备是罗技G510键盘,这个代码在Vista 32位系统之前运行良好(我现在正在Win7 x64系统上测试它并修复我能找到的所有兼容性问题)。

我的问题是,什么可能导致CreateFile偶尔退回到只允许写访问,我做错了什么导致它这样做,以及我将如何解决问题?我已经包含了下面的完整功能 - 请注意,只有传递了GENERIC_READ标志,我也没有分配句柄(同样的错误)

作为参考,我一直使用的特定设备路径是\\?\hid#vid_046d&pid_c22d&mi_00#7&1a08be07&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}(这适用于Logitech 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

1 个答案:

答案 0 :(得分:2)

如果键盘的功能不适合普通的键盘类,它可能会很好地暴露多个设备实例,一个包含正常的键盘行为,一个用于花哨的东西。

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