У меня есть некоторый код, который я написал, который работал время от времени, и я не понимаю причин, почему он успешно или неудачно. Код, о котором идет речь, довольно прост: один вызов 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