如何钩上Windows键盘ISR



我试图将键盘ISR与下面的代码联系起来,但我不能,因为deviceiocontrol api返回error_invalid_function。这是我的代码:

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 'DeviceKeyboardClass0',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返回error_invalid_function?

IOCTL_INTERNAL_I8042_KEYBOARD_START_INFORMATION这是内部设备IO控制代码(IRP_MJ_INTERNAL_DEVICE_CONTROL)。这种控件无法通过DeviceIoControl(仅发送IRP_MJ_DEVICE_CONTROL)以及用户模式发送。而且中断也无法在用户模式下处理。您还读过:

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

so-不是您必须发送此请求,而是Visa Vera -visa -visa -nur -te filter驱动程序连接到键盘设备上。并处理此请求

最新更新