如何连接windows键盘ISR?

如何连接windows键盘ISR?,windows,assembly,keyboard,fasm,Windows,Assembly,Keyboard,Fasm,我试图用下面的代码钩住键盘ISR,但我不能,因为DeviceIoControl API返回错误\无效\函数。这是我的密码: invoke DefineDosDevice,[raw],filename1,devicename lea rcx,[filename2] invoke CreateFileA,rcx,GENERIC_WRITE,0,0,OPEN_EXISTING,0,0 MOV [HI8042KBDHOOKISR],RAX MOV RAX,0

我试图用下面的代码钩住键盘ISR,但我不能,因为DeviceIoControl API返回错误\无效\函数。这是我的密码:

invoke DefineDosDevice,[raw],filename1,devicename
    lea     rcx,[filename2]
    invoke  CreateFileA,rcx,GENERIC_WRITE,0,0,OPEN_EXISTING,0,0
    MOV [HI8042KBDHOOKISR],RAX
    MOV RAX,0
    MOV RCX,sizeof._INTERNAL_I8042_START_INFORMATION
    LEA RDI,[INTERNAL_I8042_START_INFORMATION]
    REP STOSB
    MOV RCX,sizeof._INTERNAL_I8042_START_INFORMATION
    MOV [INTERNAL_I8042_START_INFORMATION.Size1],RCX
    invoke DeviceIoControl,[HI8042KBDHOOKISR],[Intel8042],INTERNAL_I8042_START_INFORMATION,sizeof._INTERNAL_I8042_START_INFORMATION,INTERNAL_I8042_START_INFORMATION,sizeof._INTERNAL_I8042_START_INFORMATION,NIL,0
    LEA RBX,[MYKBDISR]
    MOV [INTERNAL_I8042_START_INFORMATION.InterruptObject],RBX
    RET
MYKBDISR:
CALL GET_SCANCODE
...

section '.data' data writeable readable

devicename       db '\Device\KeyboardClass0',0
filename1        db 'keyboard',0
filename2        db '\\.\keyboard',0
filename3        db '\\.\Keybd',0
raw              dq 1
HI8042KBDHOOKISR dq 0
NIL              dq 0
Intel8042        dq 0B3FCFh
看到代码并回答我:我在上面的代码中哪里错了?为什么DeviceIoControl返回错误\u无效\u函数?

这是内部设备io控制代码(
IRP\u MJ\u内部\u设备\u控制
)。这种控制不能通过
设备控制
(它只发送
IRP\u MJ\u设备控制
)发送,也不能从用户模式发送。在用户模式下也不能处理中断。你也在读这篇文章:

I8042prt将此请求同步发送到设备顶部 创建键盘中断对象后的堆栈

所以-不是你们必须发送这个请求,而是维萨-你们必须是过滤器驱动程序,连接到键盘设备。并处理这个请求