Отказано в доступе GENERIC_READ к USB-устройству, предоставлено GENERIC_WRITE с CreateFile () - PullRequest
0 голосов
/ 17 апреля 2011

У меня есть некоторый код, который я написал, который работал время от времени, и я не понимаю причин, почему он успешно или неудачно. Код, о котором идет речь, довольно прост: один вызов CreateFile () из VB.NET;

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, и этот код хорошо работал раньше на 32-битной системе Vista (сейчас я тестирую его на системе 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 Ответ

2 голосов
/ 18 апреля 2011

Если клавиатура имеет функции, которые не вписываются в обычный класс клавиатуры, она может очень хорошо отображать несколько экземпляров устройства, один, который включает в себя нормальное поведение клавиатуры, и один для причудливых вещей.

И один из экземпляров вполне может быть только для записи.

...