if(NT_SUCCESS(Irp->IoStatus.Status))
{
buf=Irp->AssociatedIrp.SystemBuffer;
MyKeyPrint((UCHAR)buf[2]); //字符打印函数
}
if(Irp->PendingReturned)
{
IoMarkIrpPending(Irp);
}
return Irp->IoStatus.Status;
}
这里要说明的是,由于编辑要我把扫描码转化成字符输出来,这还废了我一些劲,因为
在内核态下没有直接可用的函数接口转换扫描码成为ASCII 码。于是只能自己动手写这还是
挺伤脑经的。这里用了直接定址法将字符放在一个数组中,为了不越界,定义一个大一点的
数组。
UCHAR
asciiTbl[256]={'0','0','1','2','3','4','5','6','7','8','9','0','0','0','0',
'0','q','w','e','r','t',
'y','u','i','o','p','0','0','0','0','a','s','d','f','g','h','j','k','l','0'
,'0',
'0','0','0','z','x','c','v','b','n','m','0','0','0','0','0','0','0','0','0'
,'0',
'0','0','0','0','0','0','0','0','0','0','7','8','9','0','4','5','6','0','1'
,'2',
'3','0'
};
这里为了简便,我只写出了部分键盘扫描码和ASCII的转换,共有键盘字符键,数字键,
小键盘键。并且也没有考虑shift,caps 键对字符的影响,其他的的按键转换同理,当检测
到有上述两个键输入时,将字符大写就可以。为了节省篇幅,就不多说了。字符转换函数如
下:
void _stdcall MyKeyPrint(UCHAR sch) //字符打印函数
{
if(gC2pKeyCount%2==1)
{
UCHAR ch=0;
int a=0;
a=(int)sch;
ch=asciiTbl[a];
DbgPrint("%C \n",ch);
}
}
效果如下图:

至于驱动文件的安装,这里就不多说了,到此也就结束了。这里存在一个稳定性的小问
题,在新分发函数替换过程中,一部分分发函数已经被替换,此时刚好有连续的几个 IRP
需要处理中间具有相关性,这种情况下可能破坏他们的关联,但是这种问题的几率也是相当
小,是小概率事件,不予考虑。经本人测试可用,环境为Windows XP SP2。
|