2017-09-25 76 views
-1

我想用下面的代碼鉤住鍵盤ISR,但我不能,因爲DeviceIoControl API返回ERROR_INVALID_FUNCTION。這裏是我的代碼:如何掛鉤windows鍵盤ISR?

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返回ERROR_INVALID_FUNCTION?

回答

0

IOCTL_INTERNAL_I8042_KEYBOARD_START_INFORMATION這是內部設備控制代碼(IRP_MJ_INTERNAL_DEVICE_CONTROL)。這種控制不能由DeviceIoControl(僅發送IRP_MJ_DEVICE_CONTROL)發送,完全來自用戶模式。並且在用戶模式下也不能處理中斷。也被閱讀此:

I8042prt創建鍵盤中斷對象後同步發送此請求給設備 堆棧的頂部。

所以 - 不是你必須發送此請求,反之亦然 - 你必須是過濾器驅動程序,連接到鍵盤設備。並處理此請求