串行端口过滤器的研究与实现(2)
驱动程序接收到IRP后可以有三种选择:
2.2.1 允许IRP通过
驱动程序不做任何事情或仅仅获取IRP的一些信息,将IRP传递给下一层的驱动程序。这种情况下,驱动程序需要为下一层的驱动程序设置堆栈单元,多数情况下,它会调用内核API函数IoSkipCurrentIrpStackLocation把当前堆栈单元复制给下一个堆栈单元。如果需要更改下一个堆栈单元,则调用内核API函数IoGetNextIrpStackLocation得到指向下一个堆栈单元的指针。驱动程序通过调用内核API函数IoCallDriver调用下一层驱动程序,I/O管理器会改变当前IRP堆栈单元指针;继续上述过程,直到最底层的驱动程序完成对此IRP的处理。
2.2.2 禁止IRP通过
驱动程序不向下一层驱动程序传递IRP,因此,下层驱动程序不会接收到这个IRP,可能导致系统会出现权限错误或读取文件失败等信息提示。
2.2.3 完成IRP的处理
驱动程序对IRP的信息进行处理后不继续向下一层驱动程序传递,调用内核API函数IoCompleteRequest表示已经完成该IRP的处理。串行端口的I/O请求包括打开、关闭、设置波特率、读和写等。因为串行端口过滤器的功能是用来过滤通过串行端口的数据,所以只需要关心读请求和写请求,在IRP中对应的主功能代码分别为IRP_MJ_READ和IRP_MJ_WRITE[5]。绑定后的串行端口过滤器设备对象位于设备对象堆栈的最顶端,IRP会首先被发送到过滤器设备对象。在过滤器的分发函数中调用内核API函数IoGetCurrentIrpStackLocation返回指向IRP当前I/O堆栈单元的指针,通过该指针获取IRP的主功能代码来判定当前的I/O请求类型。为了简单说明过滤器的实现方法,如果是读请求或写请求,则捕获数据并允许IRP通过。
IRP中共有三个域描述缓冲区:MDLAddress、UserBuffer和AssociatedIrp.SystemBuffer。I/O请求的类别不同,IRP存储数据使用的缓冲区不同。MDLAddress域指向内核空间的缓冲区的虚拟地址;UserBuffer域指向应用层缓冲区的地址,但该地址需在内核空间中访问;AssociatedIrp.SystemBuffer域指向应用层缓冲区的地址,但需要将此缓冲区的数据拷贝到内核空间访问。要捕获串行端口的数据,需要依次测试这三个域是否为空,如果某个域不为空,就可以从该域指向的缓冲区中读取数据。
2.3 入口例程DriverEntry
驱动程序被加载到系统中时,I/O管理器创建一个驱动程序对象,然后调用该驱动程序的入口例程DriverEntry[6]。DriverEntry例程是每个设备驱动程序的入口,完成大部分设备初始化工作,包括设置响应各种用户请求的分发例程与I/O控制例程的入口。驱动程序中只有DriverEntry例程的名字是固定的,其它所有例程都要由该例程向系统注册。
串行端口过滤器的DriverEntry例程的代码如下:
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING path)
{
driver->DriverUnload = UnloadComFilter;
driver->MajorFunction[0] = ComFilterDispatch;
FilterAttachCom(driver);
return STATUS_SUSCCESS;
}
系统开始加载设备驱动程序时传入DriverEntry例程的参数,参数driver指向一个驱动程序对象,path是设备服务键的键名。
DriverEntry例程负责初始化驱动程序对象driver,参数DriverUnload是指向驱动程序动态卸载函数UnloadComFilter的指针;MajorFunction是对应多种类型IRP处理的分发函数的指针数组,缺省情况下I/O管理器把数组的每个指针都初始化为哑分发函数,由于过滤器要处理串行端口的I/O请求,所以要设置MajorFunction[0]指向分发函数ComFilterDispatch。
完成串行端口驱动程序对象初始化后,即可调用函数FilterAttachCom(driver)获取串行端口设备对象,生成过滤器虚拟设备对象并绑定到串行端口设备对象上。当I/O管理器接收到串行端口的I/O请求时,创建一个IRP结构并将其作为传送给分发函数ComFilterDispatch进行分析处理,实现对串行端口传输数据的过滤功能。
3 结束语
在开发与安全软件相关的驱动程序时,过滤器是一种非常重要的技术。过滤器是在系统内核的驱动程序分层中增加的一层驱动程序。过滤器并不影响其它驱动程序接口,因此过滤器通常用于扩展系统硬件设备的功能。为了过滤串行端口的传输数据,可以在应用程序和串行端口功能驱动程序之间增加一个过滤器,表示I/O请求的IRP会先被发送到过滤器,分析IRP就可以获取到串行端口的传输数据进行处理,从而实现数据过滤功能。从串行端口过滤器的开发方法可以看出,运用过滤器开发技术能够以很小的代价来扩展使用通用驱动程序的硬件设备的功能。
参考文献:
[1]姜元建,王斌,徐伟.虚拟串口管理软件的设计与应用[J].微型电脑应用,2010(04):55-56.
[2]张小川,陈最,涂飞.基于过滤驱动的透明加密文件系统研究与实现[J].计算机应用与软件,2013(04):44-47.
[3]尤晋元,史美林,陈向群等.Windows操作系统原理[M].北京:机械工业出版社,2001.
[4]龚建伟,熊光明.Visual C++/Turbo C串口通信编程实践[M].北京:电子工业出版社,2004.
[5]谭文,杨潇,邵坚磊.寒江独钓:Windows内核安全编程[M].北京:电子工业出版社,2009.
[6]竹武林,范惠林,庞帅.串行通信接口卡驱动及测试软件设计和实现[J].长春理工大学学报(自然科学版),2011(03):156-159.
期刊库(http://www.zgqkk.com),是一个专门从事期刊推广、投稿辅导的网站。
本站提供如何投稿辅导,寻求投稿辅导合作,快速投稿辅导,投稿辅导格式指导等解决方案:省级投稿辅导/国家级投稿辅导/核心期刊投稿辅导//职称投稿辅导。
【免责声明】本文仅代表作者本人观点,与投稿辅导_期刊发表_中国期刊库专业期刊网站无关。投稿辅导_期刊发表_中国期刊库专业期刊网站站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。
投稿辅导服务咨询与期刊合作加盟
陆老师联系QQ: 913775405(普刊)
蒋老师联系QQ: 867306987(核心)
刘老师联系QQ: 271374912(核心)
联系电话:18015016272
17327192284
投稿辅导投稿邮箱:zgqkk365@126.com
期刊推荐
- 《课程教育研究》 旬刊 国家级
- 《网络空间安全》(信息安全与技术)月刊 国
- 《价值工程》旬刊 国家级 科技统计源期刊
- 《高教论坛》 月刊 省级
- 《法制与社会》旬刊 省级
- 《中国教育学刊》月刊 14版北大核心
- 《语文建设》 旬刊 14版北大核心
- 《中国绿色画报》 月刊 国家级
- 《社科纵横》季刊 社科类优秀期刊
- 《求索》月刊 14版北大核心期刊
- 《财会月刊》旬刊 14版北大核心
- 《艺术品鉴》 月刊 省级
- 《中华建设》月刊 国家级 建设类优秀期刊
- 《教学与管理》旬刊 北大核心
- 《当代经济》 旬刊 省级
- 《新课程研究》旬刊 省级 教育类优秀学术期
- 《文教资料》 旬刊 省级
- 《学术界》 月刊 双核心
- 《吉林教育》旬刊 省级 教育类学术期刊
- 《中国农业资源与区划》 月刊 14版北大核心
- 《继续教育研究》月刊 北大核心期刊
- 《财经界(学术版)》半月刊 国家级
- 《电影评介》半月刊 14版北大核心
- 《公路交通科技》 月刊 北大核心
- 《新闻传播》月刊 省级 新闻类优秀期刊