2017-04-07 3 views
-1

キーボードのISRをフックしようとしていますが、 CreateFile0000007Bh ERROR_INVALID_NAMEを返すため、デバイスを開くことができません。何を私は間違ってやったのですか?キーボードデバイスのハンドルを取得する方法は?

invoke DefineDosDevice,[raw],filename1,devicename 
lea  rcx,[filename2] 
invoke CreateFileA,rcx,GENERIC_ALL,FILE_SHARE_WRITE or 
FILE_SHARE_READ,0,3,0,0 
ret 

section '.data' data writeable readable 

devicename  db '\\Device\\KeyboardClass0',0 
filename1  db 'keyboard',0 
filename2  db '\\.\keyboard',0 
raw    dq  1 
+0

ような何かをしたいと思います。 'filename2'に' \\\\。\\ keyboard'を試しましたか? –

+0

それは動作しません。私のアセンブラはそのようにバックスラッシュを解釈しません。 –

+1

キーボードISRをフックできるようにするためのデバイスはありません。それは単純にユーザーモードのプロセスからではありません。ドライバから必要なものです。しかし、ドライバーからでも、Windowsの現代版ではKernel Patch ProtectionによってISRフックが防止されています。ドライバからは、代わりにI8042prtフィルタを使用できますが、USBキーボード(専用のキーボードIRQを持たない)は動作しません。 https://msdn.microsoft.com/en-us/windows/hardware/drivers/hid/3rd-party-filter-drivers –

答えて

0

これは、フラットアセンブラ構文では、バックスラッシュをエスケープせずdevicenameを渡す必要があります。

devicename  db '\Device\KeyboardClass0',0 

Windowsでキーボードデバイスにアクセスする方法について良いtutorial with source code in Cもあります。興味深いかもしれません。アセンブリにそれを翻訳

、あなたのアセンブラは、エスケープ文字としてバックスラッシュを解釈しているdevicename`文字列 `の形式に基づいて

include 'include\win64ax.inc' 

.code 

start: 
    invoke DefineDosDevice, 1, kbdFileName, kbdDeviceName 
    mov rcx, kbdPath 
    invoke CreateFile, rcx, GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 
    mov [hKbd], rax 
    ;. . . 
    invoke ExitProcess, 0 

.end start 

.data 
kbdDeviceName db '\Device\KeyboardClass0',0 
kbdFileName db 'kbd',0 
kbdPath  db '\\.\kbd',0 
hKbd   dq ? 
+0

私に答えてくれてありがとう、最初の問題は解決しましたが、今私はCreateFileを取得します:キーボードデバイスを開くときにERROR_ACCES_DENIED。なぜそれが起こるか??? –

+0

おそらく、それはWindowsセキュリティポリシーのためです。おそらく管理者などで実行する必要があります –

+0

私は既に管理者として実行しています。私は\ Device \ KeyboardClass0がキーボードデバイスの正しいハンドルではないと思う。私はキーボードISRをフックするデバイスに正しいハンドルは何ですか? –

関連する問題