2017-04-07 100 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? –