|
阅读:1515回复: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
自己顶一下,会不会是机器的原因呢?
我的机子装了还原卡。 |
|
