PUCHAR buf = NULL;
buf = Irp->AssociatedIrp.SystemBuffer;
以上對象返回一個 char* 指針,這個緩沖區(qū)可能會包含不確定數(shù)量的 KEYBOARD_INPUT_DATA 結(jié)構(gòu)
typedef struct _KEYBOARD_INPUT_DATA {
USHORT UnitId; ? ? ? ? //第幾個鍵盤端口
USHORT MakeCode; ? ? ? //掃描碼
USHORT Flags; ? ? ? ? ?//按鍵標(biāo)志
USHORT Reserved; ? ? ? //保留
ULONG ExtraInformation;//驅(qū)動擴展信息
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;
按鍵標(biāo)志:
#define KEY_MAKE ?0 ? ? ? ? ? ? ? //按下
#define KEY_BREAK 1
#define KEY_E0 ? ?2
#define KEY_E1 ? ?4
#define KEY_TERMSRV_SET_LED 8
#define KEY_TERMSRV_SHADOW ?0x10
#define KEY_TERMSRV_VKPACKET 0x20
結(jié)構(gòu)的個數(shù) = 緩沖區(qū)長度/結(jié)構(gòu)大小
該結(jié)構(gòu)體在 ntddkbd.h 頭文件定義
PKEYBOARD_INPUT_DATA keydata = Irp->AssociatedIrp.SystemBuffer;
ULONG numkeys = (ULONG)Irp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA);
for (i = 0; i < numkeys; i++){
DbgPrint("misaka: read numkeys %d code %x flags %s\r\n", numkeys, keydata->MakeCode, keydata->Flags ? "up" : "down");
//小實驗,按下 caps lock 和 按下 shift 效果一樣
if (keydata->MakeCode == 0x3a){
keydata->MakeCode = 0x2a;
}
}