《寒江独钓》源代码ps2intcap关于HOOK键盘中断实现直接端口IO的问题
在学习《寒江独钓》,其中有段源码读不懂:
// 首先读端口获得按键扫描码打印出来。然后将这个扫
// 描码写回端口,以便别的应用程序能正确接收到按键。
// 如果不想让别的程序截获按键,可以写回一个任意的
// 数据。
void p2cUserFilter()
{
//没有明白执行流程?
static P2C_U8 sch_pre = 0;
P2C_U8 sch;
p2cWaitForKbRead();
_asm in al,0x60
_asm mov sch,al
KdPrint(("p2c: scan code = %2x\r\n",sch));
// 把数据写回端口,以便让别的程序可以正确读取。
if(sch_pre != sch)
{
sch_pre = sch;
_asm mov al,0xd2
_asm out 0x64,al
p2cWaitForKbWrite();
_asm mov al,sch
_asm out 0x60,al
}
}
void *g_p2c_old = NULL;
__declspec(naked) p2cInterruptProc()
{
__asm
{
pushad // 保存所有的通用寄存器
pushfd // 保存标志寄存器
call p2cUserFilter // 调一个我们自己的函数。 这个函数将实现
// 一些我们自己的功能
popfd // 恢复标志寄存器
popad // 恢复通用寄存器
jmp g_p2c_old // 跳到原来的中断服务程序
}
}
代码的目的是替换掉原来的中断处理函数,用自己的函数读端口后,再写回端口,再调用原来的函数进行处理。我在安装完驱动测试时发现老蓝屏,用Windbg调试按下一个键就出现死循环,这是什么原因?