2017-04-07 104 views
-1

我想挂钩键盘ISR,但我无法打开设备,因为 CreateFile返回0000007Bh 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'尝试'\\\\。\\键盘'? –

+0

它不工作。我的汇编程序不用这种方式解释反斜杠。 –

+1

没有可以打开的设备,可以让您挂接键盘ISR。这根本不可能不是来自用户模式的过程,而是驾驶员需要的。然而,即使是来自驱动程序,ISR挂钩也可以通过现代版本的Windows上的内核补丁保护来防止。在驱动程序中,您可以使用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。你可能会觉得它很有趣。

将其转换成组装,你要像做

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 ? 
基于字符串'devicename`你的汇编的格式解释反斜线转义字符
+0

感谢您回答我,第一个问题解决了,但现在我CreateFile获得:ERROR_ACCES_DENIED当我尝试打开键盘设备。为什么发生? –

+0

可能是因为Windows安全策略。也许你需要以管理员或其他方式运行 –

+0

我已经以管理员身份运行。我认为\ Device \ KeyboardClass0不是键盘设备的正确句柄。什么是正确的手柄设备,以我钩键盘ISR? –