直接访问键盘控制芯片获取键盘记录.doc

直接访问键盘控制芯片获取键盘记录.doc

ID:50894415

大小:336.00 KB

页数:7页

时间:2020-03-15

直接访问键盘控制芯片获取键盘记录.doc_第1页
直接访问键盘控制芯片获取键盘记录.doc_第2页
直接访问键盘控制芯片获取键盘记录.doc_第3页
直接访问键盘控制芯片获取键盘记录.doc_第4页
直接访问键盘控制芯片获取键盘记录.doc_第5页
资源描述:

《直接访问键盘控制芯片获取键盘记录.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、直接访问键盘控制芯片获取键盘记录键盘是用户和机器之间主要的硬件接口,看看键盘上的那些键就可知道它有多么的复杂了。键盘是我们隐私的源泉,我们各种信息的传递都要通过它。作为用户表现信息的媒介,很多怀有恶意目的的人都想截取我们的键盘输入。目前有很多方法可以做到,比如全局钩子、GetKeyboardStatus()、驱动过滤钩子等,但是如果要截取像QQ这种Hook键盘中断处理程序的保护技术,这些方法都显得无能为力。为此,我将为大家介绍一种直接访问键盘控制芯片的方法,来实现对键盘输入数据的最底层的读取。如果我们知道了硬件的输入输出地址

2、,就可以直接对它们进行访问了。键盘上有一个称为键盘编码器的处理器(Intel8048或兼容芯片)专门用来扫描收集所有按键按下和松开的状态数据(即扫描码)。当一个键被按下时,键盘发送的扫描码称为接通扫描码(Makecode),或简称为接通码;当一个被按下的键放开时发送的扫描码被称为断开扫描码(Breakcode),或简称为断开码。主机键盘控制器专门用来对接收到的键盘扫描码进行解码。因为每个按键的接通和断开码都是不同的,所以键盘控制器根据扫描码就可以确定用户在操作哪个键了。整个键盘上所有按键的接通和断开码就组成了键盘的一个扫描码

3、集(ScanCodeSet)。根据电脑的发展,目前已有三套扫描码集可供使用,它们分别是第一套扫描码集,原始XT键盘扫描码集,目前的键盘已经很少发送这类扫描码;第二套扫描码集,现代键盘预设使用的扫描码集,通常称为AT键盘扫描码集;第三套扫描码集,PS/2键盘扫描码集,原IBM推出PS/2微处理机时使用的扫描码集,已很少使用。AT键盘预设发送的是第二套扫描码集。虽然如此,主机键盘控制器为了与PC/XT机的软体兼容起见,仍然会把所有接收到的第二套键盘扫描码转换成第一套扫描码,因此,我们从键盘控制器获取的通常为第一套扫描码集。当一个

4、键被按下时,我们可以从键盘控制器接收到一个XT键盘接通码。这个扫描码仅表示键盘上某个位置处的键被按下,但还没有对应到某个字符代码上,接通码通常都是一个位组宽度。例如,按下键“A”的接通码是30(0x1E)。当一个按下的键被松开时,从键盘控制器端口收到的就是一个断开码。对于XT键盘(即键盘控制器程序设计端口收到的扫描码),断开码是其接通码加上0x80。例如,上述“A”键的断开码就是“0x80+0x1E=0x9E”。表1列出了ScanCodeSet1中的所有扫描码,我们写程序时需要用到!表1剩下的问题就是我们如何获取键盘的扫描码

5、,并且将它们翻译出来了。比如我们如何获取扫描码1E,并且能将它翻译为A键被按下。键盘控制芯片给我们使用的PC机提供了两个可访问的I/O端口,一个是0x60,一个是0x64,我们能够读取键盘缓冲区中的数据,也能发送控制命令。打开设备管理器,如图1所示,我们可以清晰地看到它们。0x60为数据端口,0x64为命令端口。图1通常情况下,我们从0x60读取的数据就是键盘的扫描码,而从0x64读取的数据为键盘的状态字。状态字的各位含义如下:Bit7:从键盘获得的数据奇偶校验错误;Bit6:接收超时,置1;Bit5:发送超时,置1;Bit

6、4:为1,键盘没有被禁止。为0,键盘被禁止;Bit3:为1,输入缓冲器中的内容为命令,为0,输入缓冲器中的内容为数据;Bit2:系统标志,加电启动置0,自检通过后置1;Bit1:输入缓冲器满置1,i8042取走后置0;Bit0:输出缓冲器满置1,CPU读取后置0。接下来我们再说一下端口的操作方法。WindowsNT系统是不允许直接操作端口的,只有通过驱动程序才能实现,可供选择的驱动程序有免费开源的winio、windriver等。由于我的毕业设计涉及到视频采集卡驱动程序的设计,所以就以windirver为例来说明端口操作方法

7、了。安装好windriver之后,在“samplesbasic_io”目录下有一个basic_io.c,我们可以直接使用它提供的端口操作函数读写端口。注意修改IO_init()函数添加如下语句:(责任编辑:admin)WD_LICENSElic;strcpy(lic.cLicense,你的licenseString);WD_License(hWD,&lic);这样,我们使用的windrier驱动就去掉了30天试用期限的限制了。它可以提供的函数如下,有了这些函数,我们就可以直接读写端口了。BYTEIO_inp(DWORD

8、dwIOAddr)//从dwIOAddr读取一个字节WORDIO_inpw(DWORDdwIOAddr)//从dwIOAddr读取两个字节DWORDIO_inpd(DWORDdwIOAddr)//从dwIOAddr读取四个字节voidIO_outp(DWORDdwIOAddr,BYTEbD

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。