airex
驱动牛犊
驱动牛犊
  • 注册日期2009-08-05
  • 最后登录2009-09-05
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1399回复:1

键盘端口读写的一个奇怪的问题

楼主#
更多 发布于:2009-08-05 21:53
// 首先读端口获得按键扫描码打印出来。然后将这个扫
// 描码写回端口,以便别的应用程序能正确接收到按键。
// 如果不想让别的程序截获按键,可以写回一个任意的
// 数据。
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,结果永远都是按住的状态了,请问这是什么原因?
airex
驱动牛犊
驱动牛犊
  • 注册日期2009-08-05
  • 最后登录2009-09-05
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-08-31 13:10
自己顶一下,会不会是机器的原因呢?
我的机子装了还原卡。
游客

返回顶部