阅读:1399回复:1
键盘端口读写的一个奇怪的问题// 首先读端口获得按键扫描码打印出来。然后将这个扫 // 描码写回端口,以便别的应用程序能正确接收到按键。 // 如果不想让别的程序截获按键,可以写回一个任意的 // 数据。 void p2cUserFilter() { P2C_U8 sch; ULONG r; r=p2cWaitForKbRead(); KdPrint(("WaitForRead return %2x\n",r)); _asm in al,0x60 _asm mov sch,al KdPrint(("p2c: scan code = %2x\r\n",sch)); // 把数据写回端口,以便让别的程序可以正确读取。 r=p2cWaitForKbWrite(); KdPrint(("WaitForWrite return %2x\n",r)); _asm mov al,0xfe _asm out 0x60,al } void *g_p2c_old = NULL; __declspec(naked) p2cInterruptProc() { __asm { pushad // 保存所有的通用寄存器 pushfd // 保存标志寄存器 call p2cUserFilter // 调一个我们自己的函数。 这个函数将实现 // 一些我们自己的功能 popfd // 恢复标志寄存器 popad // 恢复通用寄存器 jmp g_p2c_old // 跳到原来的中断服务程序 } } 这是修改自《寒江独钓》上的一段源码。 本人测试书上的代码后发现里面错误太多,实际无法正常运行,就自己把它改了。 原来书上的方法的效果是除了持续按键,否则不会有输出。 我想先读端口,然后重发的效果会比较好,结果无论是通码还是断码,效果一律和通码一样。 我按一下a,出来两个a,按一下ctrl,结果永远都是按住的状态了,请问这是什么原因? |
|
沙发#
发布于:2009-08-31 13:10
自己顶一下,会不会是机器的原因呢?
我的机子装了还原卡。 |
|