0

我有一些我编写的代码偶尔会起作用,我不明白它成功或失败的原因。有问题的代码相当简单,只需从 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}(这是用于 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
4

1 回答 1

2

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

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

于 2011-04-18T01:43:45.230 回答