散発的に機能するコードをいくつか作成しましたが、成功または失敗する理由がわかりません。問題のコードはかなり単純で、VB.NETからCreateFile()を1回呼び出すだけです。
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要求を削除すると、ハンドルは正常に付与されます。これは以前に(別のマシンで)発生したことがあり、どの一連のイベントがデバイスへの書き込みとデバイスからの読み取りを行わないようになるかについて、私は完全に困惑しています。問題のデバイスはLogitechG510キーボードであり、このコードは以前は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ゲーミングキーボード用です)また、コードは管理者権限の有無にかかわらず同様に実行されました。私はそれらを必要としないので特権(そしてそれは私のビスタシステムでそれらを正常に動作させるためにそれらを必要としません)。
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