2008年2月9日 星期六

little hack of keyboard

過年有點無聊。嘗試玩了一下windows device driver
參考 : http://www.catch22.net/tuts/kernel1.asp
首先要下載WINDDK, driver development kit 裡面是建構driver的環境
包含 compiler, linker, 及一些lib, header
使用C語言,好像沒有用到clib ...

嘗試修改鍵盤的驅動程式
windows鍵盤滑鼠訊號傳遞大概是長這樣( 也許有錯 )

硬體 -> kbdfilter.sys -> kdbclass.sys -> Application

kdbfilter 這一個可能是某種裝置的驅動程式( 例如usb 或 ps/2 )
kdbclass 這一個接著處理鍵盤的輸入pass給Application

修改
[kdbclass.c]
VOID
KeyboardClassServiceCallback(
IN PDEVICE_OBJECT DeviceObject,
IN PKEYBOARD_INPUT_DATA InputDataStart,
IN PKEYBOARD_INPUT_DATA InputDataEnd,
IN OUT PULONG InputDataConsumed
)
{

... 省略

ULONG i;
ULONG num;
ULONG keycode;
PKEYBOARD_INPUT_DATA data;
data = InputDataStart;
num = InputDataEnd-InputDataStart;
for(i=0;iMakeCode;
DbgPrint("Keyboard Filter Driver Sample - keycode=%u\n",keycode );
data++;
}

... 省略
}

重點是以下兩個東東

InputDataStart 鍵盤輸入的資料,Pointer到buffer起始位置
InputDataEnd 鍵盤輸入的資料,Pointer到buffer起始位置

Scan Code
scan make 1 就是MakeCode

[ntddkbd.h]
typedef struct _KEYBOARD_INPUT_DATA {

USHORT UnitId;

USHORT MakeCode;

USHORT Flags;

USHORT Reserved;

ULONG ExtraInformation;

} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;


利用Debugview就可以看到鍵盤的輸入了...
從kernel mode直接取得,而沒有透過一些API



沒有留言: