虚拟输入设备在驱动层的实现方法及其系统的制作方法

文档序号:9375509阅读:930来源:国知局
虚拟输入设备在驱动层的实现方法及其系统的制作方法
【技术领域】
[0001]本发明涉及计算机领域,尤其涉及一种虚拟输入设备在驱动层的实现方法及其系统。
【背景技术】
[0002]在Windows 2000系统下,几乎所有的I/O都是包驱动的,每个工作命令描述一个单独的I/o操作,这个命令告诉驱动程序需要做什么,并且通过I/O子系统跟踪请求的进展,这些命令被封装成为输入请求包(Iuput Request Package,简称IRP)的形式,当发出一个I/O系统服务时(比如创建文件或读文件的请求),I/O管理器就会通过构造一个描述此请求的IRP,并将该IRP的一个指针传给设备驱动开始对该请求进行处理。如果OS向I/O管理器和设备驱动完整地描述一个I/O请求,那么IRP中保存的信息就可以达到这个目的。
[0003]过滤层驱动就是一个拦截到一些已有软件模块的请求的中间层驱动,依靠在请求到达目标前截获请求,过滤驱动就有机会扩展或修改请求的原始接收者所提供的功能或服务。
[0004]Windows 公开了一些应用程序编程接口(Applicat1n Programming Interface,简称API)函数,通过调用这些API或者发送消息的机制来达到对鼠标和键盘的控制。
[0005]在一些应用场景中,比如在系统修复自动化项目、软件安装卸载自动化项目、痕迹清理自动化项目等场景下,某些软件为了防止被利用或者非法破解、或者网络游戏出于对控制输入速度的和反外挂的目的,它们会对普通的鼠标和键盘API进行过滤,从而导致从应用层无法操作它们的界面,普通的控制鼠标和键盘的API函数都是无效的。
[0006]对于上述问题,现有技术中的一种解决方案是通过Win1软件包直接控制鼠标和键盘硬件端口。Win1是一个现在比较流行的第三方库,通过加载一个内核模式的设备驱动程序,利用几种底层编程技巧,使得Windows应用程序可以直接对1/0端口和物理内存进行存取,从而绕过了 Windows系统的保护机制。Win1包含了 3个文件:Win1.dll、Win1.sys和WIN10.VXD,其中WIN10.VXD驱动程序用在Win95/98系统上,Winl0.sys驱动程序用在WinNT/2000/XP系统上,ffinl0.dll提供了功能函数的调用。在Winl0.dll中有两个函数最重要=InitializeWin1用来初始化Win1的驱动程序,必须在调用所有其它功能函数之前调用该函数;ShutdownWin1用来卸载Win1的驱动程序,在中止应用函数之前或者不再需要使用Win1时调用。
[0007]但是,在使用Win1向鼠标或者键盘发送数据的时候,必须有硬件的支持(电脑上必须插入PS2鼠标);向串口直接读写数据存在效率的问题,而且存在串口数据同步问题。假如I秒内连续发送了 100个数据,可能串口实际响应的只有10个数据,这样就存在同步的问题。WIN1是对物理鼠标直接发送数据,然而在程序发送数据的时候,人为的也可以对物理鼠标或键盘进行操作,这样就有可能导致数据混乱,出现鼠标满屏幕飞的效果或者键入字符错误的效果。
[0008]综上所述,对于屏蔽控制鼠标或键盘的API函数的情况下导致无法控制或键盘的问题,现有技术中尚未提出有效地解决方案。

【发明内容】

[0009]有鉴于屏蔽控制鼠标或键盘的API函数的情况下导致无法控制或键盘的问题而做出本发明,为此本发明的主要目的在于提供一种虚拟输入设备在驱动层的实现方法及其系统,其中:
[0010]为解决上述问题,本发明提供一种虚拟输入设备在驱动层的实现方法,包括:
[0011]调用系统应用程序编程接口 API创建虚拟输入设备,在驱动层上挂载所述虚拟输入设备;
[0012]将系统输入设备的函数地址记录到所述虚拟输入设备的设备扩展结构体中,以使驱动层自动获得系统输入设备的函数地址;
[0013]获取应用层发送给所述虚拟输入设备的输入数据结构体;
[0014]所述驱动层根据虚拟输入设备中记录的设备扩展结构体,使用所获取的输入数据结构体控制虚拟输入设备的行为。
[0015]其中,所述设备扩展结构体,可以包括:系统输入设备的属性、连接系统输入设备的驱动地址、系统输入设备的端口地址、本驱动所处设备栈的位置信息,和/或所挂载设备的地址。
[0016]其中,所述输入数据结构体,可以包括:键盘的键码、键盘按键行为、鼠标的坐标、鼠标的按键类型、鼠标的点击行为、鼠标滚轮的滚动单位数值、和/或鼠标移动轨迹。
[0017]其中,所述虚拟输入设备的设备扩展结构体可以在创建所述虚拟输入设备的过程中生成。
[0018]其中,所述获取应用层发送给所述虚拟输入设备的输入数据结构体的步骤,可以包括:
[0019]获取应用层发送至驱动层的控制所述虚拟输入设备的输入请求包IRP ;
[0020]解析所述IRP得到所述虚拟输入设备的输入数据结构体。
[0021]其中,所述获取应用层发送至驱动层的控制所述虚拟输入设备的IRP的步骤,可以包括:
[0022]创建控制设备对象⑶O ;
[0023]利用所述⑶O获取应用层发送至驱动层的控制所述虚拟输入设备的IRP。
[0024]所述控制虚拟输入设备的行为的步骤,可以包括:通过设备扩展结构体对输入数据结构体进行回调实现控制。
[0025]本发明进而还一种虚拟输入设备在驱动层的实现系统,包括:
[0026]虚拟输入设备创建模块,用于调用系统应用程序编程接口 API创建虚拟输入设备,在驱动层上挂载所述虚拟输入设备;
[0027]记录模块,用于将系统输入设备的函数地址记录到所述虚拟输入设备的设备扩展结构体中,以使驱动层自动获得系统输入设备的函数地址;
[0028]获取模块,用于获取应用层发送给所述虚拟输入设备的输入数据结构体;
[0029]控制模块,用于所述驱动层根据虚拟输入设备中记录的设备扩展结构体,使用所获取的输入数据结构体控制虚拟输入设备的行为。
[0030]其中,所述设备扩展结构体,可以包括:系统输入设备的属性、连接系统输入设备的驱动地址、系统输入设备的端口地址、本驱动所处设备栈的位置信息,和/或所挂载设备的地址。
[0031]其中,所述输入数据结构体,可以包括:键盘的键码、键盘按键行为、鼠标的坐标、鼠标的按键类型、鼠标的点击行为、鼠标滚轮的滚动单位数值、和/或鼠标移动轨迹。
[0032]其中,所述虚拟输入设备的设备扩展结构体可以在创建所述虚拟输入设备的过程中生成。
[0033]其中,所述获取模块,可以包括:
[0034]IRP获取单元,用于获取应用层发送至驱动层的控制所述虚拟输入设备的输入请求包IRP ;
[0035]解析单元,用于解析所述IRP得到所述虚拟输入设备的输入数据结构体。
[0036]其中,所述IRP获取单元,创建控制设备对象⑶0,利用所述⑶O获取应用层发送至驱动层的控制所述虚拟输入设备的IRP。
[0037]其中,所述控制模块,通过设备扩展结构体对输入数据结构体进行回调实现控制。
[0038]综上所示,根据本发明上述技术方案,在软件屏蔽虚拟输入设备消息的情况下也能够控制虚拟输入设备,有效地防止软件的限制,并且具有操作精度高,速度快的特点。
【附图说明】
[0039]此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
[0040]图1是根据本发明实施例的虚拟输入设备在驱动层的实现方法的流程图;
[0041]图2是根据本发明实施例的虚拟输入设备在驱动层的实现系统的结构框图;
[0042]图3是根据本发明实施例的虚拟输入设备在驱动层的实现系统的优选结构的框图。
【具体实施方式】
[0043]本发明利用应用层发送的程序中自定义IRP,然后驱动该截获此IRP,经过分析该IRP,并利用分析后的结果控制虚拟输入设备,使得对虚拟输入设备的控制可以不受windows API的限制。需要说明,本发明中提到的虚拟输入设备包括但不限于以下设备:虚拟鼠标、虚拟键盘、虚拟光驱、虚拟硬盘。
[0044]为使本发明的目的、技术方案和优点更加清楚,以下结合附图及具体实施例,对本发明作进一步地详细说明。
[0045]根据本发明的实施例,提供了一种虚拟输入设备在驱动层的实现方法。
[0046]图1是根据本发明实施例的虚拟输入设备在驱动层的实现方法的流程图,如图1所示,该方法包括(步骤S12-S18):
[0047]步骤S12,调用系统应用程序编程接口(API)创建虚拟输入设备,在驱动层上挂载虚拟输入设备。
[0048]步骤S14,将系统输入设备的函数地址记录到虚拟输入设备的设备扩展结构体中,以使驱动层自动获得系统输入设备的函数地址。其中,该虚拟输入设备的设备扩展结构体包括但不限于:系统输入设备的属性、连接系统输入设备的驱动地址、系统输入设备的端口地址、本驱动所处设备栈的位置信息,和/或所挂载设备的地址。
[0049]首先,在AddDevice例程中调用系统API创建虚拟输入设备,将创建的虚拟输入设备挂载到系统输入设备上,并且记录系统输入设备的信息到创建的虚拟输入设备的设备扩展结构体中,根据这些信息获取底层系统输入设备驱动的一些特性供驱动层所使用。然后,响应虚拟输入设备的IRP_MJ_INTERNAL_DEVICE_CONTROL,并且把系统输入设备中的一些数据结构的指针(即底层系统输入设备的函数指针)记录到创建的虚拟输入设备的设备扩展结构体中,其中,数据结构的指针是供驱动层所调用的在系统设备已经实现的函数接口地址。
[0050]在驱动中,设备是分层的结构。实际的输入设备(例如:鼠标)属于最下层(即底层设备),它是由操作系统所创建的;而驱动层创建的虚拟输入设备是在底层设备的上层,所以创建虚拟输入设备时就可以把创建出的虚拟输入设备挂载到系统创建的输入设备之上,这样就形成一个设备栈。
[0051]需要说明,在创建虚拟输入设备时,不依赖于实际的硬件输入设备是否存在以及硬件输入设备的类型。例如:在创建虚拟鼠标和虚拟键盘时,无论电脑是否安装有鼠标和键盘,也无论鼠标和键盘的类型是USB还是PS2,都不影响虚拟鼠标和虚拟键盘的创建。
[0052]步骤S16,获取
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1