如何获取键盘设备的句柄?

How to obtain the handle to keyboard device?

我正在尝试挂接键盘 ISR,但我无法打开设备,因为 CreateFile returns 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

这是平面汇编语法,你应该传递 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 ?