驅動中實現模擬鍵盤按鍵

2021-04-12 22:50:32 字數 1374 閱讀 8332

標 題:

驅動中實現模擬鍵盤按鍵

作 者:

luocong

在ring3中實現模擬鍵盤按鍵有n^n種方式,比如sendinput()、keybd_event()……但在驅動中要怎麼模擬呢?

1、寫埠**

#define defi8042_data_port ((puchar)0x60)

#define defi8042_ctrl_port ((puchar)0x64)

#define defobuffer_full 0x01

boolean

waitforkeyboardwrite(void)

return i ? true : false;

}

void presskeybyscancode(

in const byte scancode

)

搞定,簡單易行!缺點是只對ps/2鍵盤有效,usb的就一邊涼快去吧。

2、構造irp**

這個比較麻煩,而且由於某些原因,略……

3、呼叫keyboardclassservicecallback()**

kbdclass驅動是在i8042prt和kbdhid這兩個驅動之上的,所以直接呼叫它的keyboardclassservicecallback()是能對ps/2和usb同時生效的,由於某些原因偶也不想給出具體的**來。大致指點一下方向:

keyboaredclassservicecallback函式的原型如下:

typedef void (* pfn_keyboardclassservicecallback)(

in pdevice_object deviceobject,

in pkeyboard_input_data inputdatastart,

in pkeyboard_input_data inputdataend,

in out pulong inputdataconsumed

);

第乙個引數deviceobject是kbdclass的deviceobject,怎麼得到它呢?思路:先找到kbdclass的driverobject,然後從driverobject得到deviceobject。

第二和第三個引數是keyboard_input_data,自己填充,想模擬什麼按鍵就寫什麼makecode和flags吧。注意第三個引數應該為第二個引數的指標位址值+1。

第四個引數,隨便弄個ulong型的變數給它就行了,反正是可以丟棄的。(i8042prt裡面用到了它,但我們自己的模擬按鍵不用也行)

缺點:每個系統的kbdclass.sys中的keyboardclassservicecallback的rva都不相同,要自己hardcode一下,不過寫驅動本來就是那麼麻煩,習慣了就好。

驅動中實現模擬鍵盤按鍵

標 題 驅動中實現模擬鍵盤按鍵 作 者 luocong 在ring3中實現模擬鍵盤按鍵有n n種方式,比如sendinput keybd event 但在驅動中要怎麼模擬呢?1 寫埠 define defi8042 data port puchar 0x60 define defi8042 ctrl...

模擬鍵盤按鍵

模擬全域性按鍵可以用keybd event,sendinput來完成,下面是模擬一次caps lock 按鍵時兩個api函式的實現方法 keybd event keybd event vk capital,0,keyeventf extendedkey 0,0 key down keybd even...

模擬鍵盤按鍵

textbox1.focus sendkeys.send v 模擬鍵盤按鍵ctrl v 貼上 鍵 backspace 或或break caps lock del或delete 或向下鍵 endenter 或 esc help home ins或insert 或向左鍵 num lock page do...