《寒江独钓》源代码ps2intcap关于HOOK键盘中断实现直接端口IO的问题

chenhao1988 2009-12-14 08:10:00
在学习《寒江独钓》,其中有段源码读不懂:
// 首先读端口获得按键扫描码打印出来。然后将这个扫
// 描码写回端口,以便别的应用程序能正确接收到按键。
// 如果不想让别的程序截获按键,可以写回一个任意的
// 数据。
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调试按下一个键就出现死循环,这是什么原因?
...全文
334 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenhao1988 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 do_fork 的回复:]
国内一些内核编程的书,体现的是做病毒的思路
[/Quote]
即是是病毒也得起作用吧,病毒的思路也是很好的,只要能起作用。
chenhao1988 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 vincent_1011 的回复:]
觉得不是这问题啊,我CPU也是单核的,还有,按照里面的逻辑的话,你一直按同一个键的话,后面的也会被过滤吧?
[/Quote]
恩,越想越晕,这书看的~B……S……O……D……
chenhao1988 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 vincent_1011 的回复:]
[/Quote]
我应该发现问题的原因了,我的CPU是双核的,而每个核心都有自己的IDT。源程序应该只能针对单核的CPU。
vincent_1011 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 chenhao1988 的回复:]
引用 12 楼 vincent_1011 的回复:

我应该发现问题的原因了,我的CPU是双核的,而每个核心都有自己的IDT。源程序应该只能针对单核的CPU。
[/Quote]

觉得不是这问题啊,我CPU也是单核的,还有,按照里面的逻辑的话,你一直按同一个键的话,后面的也会被过滤吧?
vincent_1011 2009-12-15
  • 打赏
  • 举报
回复
改成这样, p2cWaitForKbRead();
_asm in al,0x60
_asm mov sch,al

xx++;
// 把数据写回端口,以便让别的程序可以正确读取。
if(xx==1)
{

KdPrint(("p2c: scan code = %2x\r\n",sch));
sch_pre = sch;
_asm mov al,0xd2
_asm out 0x64,al
p2cWaitForKbWrite();

xx++; //这里XX=2

_asm mov al,sch
_asm out 0x60,al

}
xx%=3;

不过会延迟和丢失key.
chenhao1988 2009-12-15
  • 打赏
  • 举报
回复
感觉程序的流程上没有什么问题呀!同级的中断是不能抢占的,也就是说在这个键盘IO中断处理完之前中断处理程序不会再次响应,这样说来程序应该没有问题啊~~~
单个按键不会有问题,有重键时会出现问题原因出在什么地方?迷惑中

chenhao1988 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 vincent_1011 的回复:]
不过会延迟和丢失key.
[/Quote]
不知道这个程序能不能改正常了,丢失key的话就没有应用价值了,期待进一步研究。
tcbhj 2009-12-14
  • 打赏
  • 举报
回复
do_fork继续装B
chenhao1988 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 haohaokingxp 的回复:]
void *g_p2c_old = NULL;

这个g_p2c_old 赋值了吗?
[/Quote]
我没把代码贴全,这个事赋值了的。我感觉问题在于程序在读键盘端口然后写回端口的过程中。
单个按键没有问题,但是快速的按键加上重键情况下就会蓝屏。
chenhao1988 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 vincent_1011 的回复:]
同学,我也在看。。。代码我还没测试
[/Quote]
这个代码貌似有问题,没法用。装上驱动快速打字马上就BSOD!
vincent_1011 2009-12-14
  • 打赏
  • 举报
回复
一,赋值是有的。如果没,那是马上BSOD的

二。另外,如果不写回的话,你这些key上面都收不到了,好像键盘坏了一样
haohaokingXP 2009-12-14
  • 打赏
  • 举报
回复
第一 void *g_p2c_old = NULL; 有没有赋值

第二 在“// 把数据写回端口,以便让别的程序可以正确读取。”的时候,又产生中断了,导致又调用
p2cInterruptProc函数了。

可以把
sch_pre = sch;
_asm mov al,0xd2
_asm out 0x64,al
p2cWaitForKbWrite();
_asm mov al,sch
_asm out 0x60,al

代码注掉进行调试
vincent_1011 2009-12-14
  • 打赏
  • 举报
回复
果然是在不停的循环,哈,
vincent_1011 2009-12-14
  • 打赏
  • 举报
回复
这代码我也还有点不懂,如果多次输入相同的话是怎么样?static P2C_U8 sch_pre这个维持到什么时候
haohaokingXP 2009-12-14
  • 打赏
  • 举报
回复
void *g_p2c_old = NULL;

这个g_p2c_old 赋值了吗?
do_fork 2009-12-14
  • 打赏
  • 举报
回复
国内一些内核编程的书,体现的是做病毒的思路
vincent_1011 2009-12-14
  • 打赏
  • 举报
回复
才看到还原部份- -
vincent_1011 2009-12-14
  • 打赏
  • 举报
回复
同学,我也在看。。。代码我还没测试

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧