(原创)串口监视过滤驱动程序开发详解(1)

串口监视过滤驱动程序开发详解(1)
 
1 系统综述及架构分析

1.1 系统综述

 串口监视主要由串口过滤驱动程序及串行数据监视显示应用程序两部分组成。
首先请允许我解释一下滤驱动程序:
WDM模型假定硬件设备可以有多个驱动程序,每个驱动程序都有自己管理设备的方法。WDM根据设备对象堆栈来完成驱动程序的分层。一个过滤器驱动程序,该驱动程序可位于功能驱动程序的上面或下面,它通过过滤流经它的IRP来修改设备的行为。
处于功能驱动程序之上的过滤器驱动程序称为上层过滤器;处于功能驱动程序之下的过滤器驱动程序(仍处于总线驱动程序之上)称为下层过滤器。虽然这两种驱动程序本身用于不同的目的,但创建这两种驱动程序的机制完全相同。实际上,创建过滤器驱动程序就象创建任何其它WDM驱动程序一样,都有DriverEntry例程、AddDevice例程、一组派遣函数,等等。
上层过滤器驱动程序的用途是帮助支持这样的设备,这种设备的大多数方面都象其所属类的普通设备,但有一些附加功能。你可以依靠一个通用的功能驱动程序来支持设备的普通行为。为了处理设备的附加功能,你可以写一个上层过滤器驱动程序来干预IRP流。举一个有趣的例子,假设存在一个烤面包机设备的标准类,并且已经有人为其写了一个标准驱动程序。再假设你的特殊烤面包机有一个高级的面包片弹出特征,它可以把烤好的面包片弹到两英尺高的空中。而控制这个AWE(Advanced Waffle Eject)特征的工作就是上层过滤器驱动程序的任务。
1.2 架构分析
串口过滤驱动程序:处于WINDOWS串口驱动程序之上,其分析截取流经它的IRP所携带的串行口收发数据,并通过与应用程序交互将所截数据显示给用户查看,同时将数据向下层驱动发送以运行正常的串行操作。从而达到分析相关数据而不影响串口正常工作方式的串口监视的目的。
具体到本系统中串口过滤驱动程序就建立了一个串口过滤设备对象,其处于串口功能设备对象之上分析流经串口的所有数据,并将其保存起来。
与此同时驱动程序还建立了一个数据交互设备对象,其主要用于完成与应用控制程序之间传递参数,读取数据等工作。
两个设备对象密切配合共同将流经串口的所有数据分析、传递给应用控制程序,以达到串口监视的功能。
串行数据监视显示应用程序:主要用于动态加载串口过滤驱动程序,发送串口号及交互事件,共享内存地址等必要参数,并开启监视线程接收串口过滤驱动程序的监视数据显示在用户终端上。程序使用VC6.0开发,运行独立稳定,交互性强。
在下面的章节中,我们将分别具体分析系统两部分的原理,实现及应用运行应用方法。

2 串口过滤驱动程序具体实现

2.1 开发方法及步骤

一旦最初的分析和设计完成,就要开始编写代码了。按照以下的步骤进行可以减少调试的时间
2.1.1. 确定驱动程序需要哪些内核模式对象。
2.1.2. 确定驱动程序需要哪些上下文环境或者状态信息和这些信息的存储位置。
2.1.3. 首先编写DriverEntry和Unload例程,最初不要增加即插即用支持,这样允许通过控制面板手动的测试驱动程序的装载和卸载。
2.1.4. 添加处理IRP_MJ_CREATE和IRP_MJ_CLOSE的操作和一些不需要进行设备的访问例程。然后可以使用一个简单的WIN32程序调用CreateFile和CloseHandle来测试。
2.1.5. 添加寻找和分配驱动程序的硬件的代码,还有在驱动程序被卸载后的重新分配硬件的代码。如果硬件支持即插即用,这一步测试硬件和驱动程序的自动加载能力。
2.1.6. 添加处理IRP_MJ_XXX函数的派遣例程,最初的例程应该没有使用物理设备,后来新的代码应该使用简单的WIN32程序进行测试,例如ReadFile和WriteFile调用,或者其它支持的函数。
2.1.7. 最后完成Start I/O例程,ISR和DPC例程。现在可以使用真实的数据和硬件进行测试。
遵循以上的开发步骤我们进行具体的开发。

2.2 ComSpy
.h头文件编写及函数、变量、结构、常量的定义
2.2.1. 头文件中首先定义了I/O控制代码,其主要用于DeviceIoControl API函数互驱动程序交互时的功能定义。

DeviceIoControl的Code参数是一个32位数值常量。


这些域的解释如下:
Device type(16位,CTL_CODE宏的第一个参数) 指出能实现这个控制操作的设备类型。
访问代码(“A”占2位,CTL_CODE的第四个参数) 指出使用设备句柄发出这个控制操作时,应用程序必须具有的访问权限。
Function code(12位,CTL_CODE的第二个参数) 指出该代码描述的是哪一个控制操作。Microsoft保留了该域的前半部分,从0到2047的值。因此我们只能使用从2048到4095之间的值。
缓冲方式(“M”占两位,CTL_CODE的第三个参数) 指出I/O管理器如何处理应用程序提供的输入输出缓冲区。
 例如:在头文件中的
#define IO_OPEN_COM    /
    CTL_CODE(FILE_DEVICE_COMSPY, 0x080A, METHOD_BUFFERED, /
FILE_ANY_ACCESS)其主要用于向驱动程序传递将要监视的串口号。
#define IO_REFERENCE_EVENT    /
    CTL_CODE(FILE_DEVICE_COMSPY, 0x0803, METHOD_NEITHER, /
FILE_ANY_ACCESS)其主要用于向驱动程序传递交互事件对象,及时触发数据交互。
还有许多这样的功能代码共同完成了从应用程序到驱动程序的交互控制。详细内容见附录代码。
2.2.2 接下来在头文件中定义了一些结构,其它主要用于IRP传递时携带相关数据。 
 例如:在头文件中的
typedef struct _DEVICE_EXTENSION
{
 PDEVICE_OBJECT  pFilterDeviceObject; // 过滤设备对象(自身)
 PDEVICE_OBJECT TargetDeviceObject;  // 绑定的设备对象
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;其主要用于设备对象的DeviceExtension(PVOID),该结构可用于保存每个设备实例的信息。I/O管理器为该结构分配空间,但该结构的名字和内容完全由用户决定。程序中具体使用它来保存及获取过滤设备对象(自身)、绑定的设备对象(这里指的是串口驱动)。
typedef struct tagIO_REQ
{
 ULONG SizeTotal;
 ULONG SizeCopied;
 CHAR type;
 LIST_ENTRY entry;
 PVOID pData;

}IO_REQ, *PIO_REQ;其主要用于将截取的数据保存至此结构队列链表中,以方便应用程序来读取。
其它结构内容不一一说明,详见附录代码。
2.2.3 最后在头文件中声明了一些驱动例程,其用于完成驱动程序的全部工作。
 例如:在头文件中的
NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING RegistryPath
); DriverEntry是内核模式驱动程序主入口点, 一个驱动程序可以被多个类似的硬件使用,但驱动程序的某些全局初始化操作只能在第一次被装入时执行一次。而DriverEntry例程就是用于这个目的。后面的章节我还将重点分析实现此例程。
其它例程内容不一一说明,详见附录代码。
更多分享请关注:软信网-编程-http://www.iis365.net.cn

特点: 1).监控串口:具有端口监控功能,可以监控、拦截、保存所收发的数据(NT/2K/XP/Vista/Win7)。 2).串口调试:支持常用的串口操作功能,支持大数据量的收发、保存,支持自动发送。 3).动态变参:在不改变当前所打开端口的情况下,能动态改变端口参数(如:波特率、校验位、流控制等)。 4).双模编辑:数据发送区内嵌十六进制编辑器(类似UltraEdit),支持十六进制文本双模式切换编辑,支持unicode。 5).国际版本:国际版,支持多国语言。 6).无需安装:界面友好,方便易用。 简要描述: 1).用于串口调试,支持常用的110-256000波特率,支持自定义波特率。 2).能以字符或十六进制接收或发送任何数据,能发送、接收任意大小的文件。 3).在不改变当前所打开端口的情况下,能动态改变端口参数(如:波特率、校验位、流控制等)。 4).数据发送区可实时编辑、发送文本数据。 5).能将所接收的原始数据以及显示数据分别保存。 6).数据发送区允许设置发送周期,自动发送数据。 7).可调试的端口范围是COM1-COM255,支持扩展端口(USBRS232)。 8).可设置字体、文字颜色、背景颜色。 9).允许将发送区的数据在接收区回显,模拟终端操作。 10).允许发送区数据以回车键作为发送操作信号。 11).Terminal模式支持自动应答功能,支持Hex、Text、浮点数等类型。 12).Terminal模式支持预定义数据发送,支持Hex、Text、浮点数等类型。 13).Monitor模式支持彩色文本显示,便于更好的区分、观察数据. 14).允许Monitor模式下拦截到的数据以十六进制或字符方式显示。 15).允许接收区在接收到的数据后添加回车字符(CRLF),便于观察数据。 16).可将Terminal模式下接收到的数据按照十六进制文本方式导到文件或剪贴板。 17).允许保存程序环境变量。 18).定义热键,方便操作。 19).国际版,支持多国语言。 20).数据发送区内嵌十六进制编辑器,支持unicode。 21).支持串口监控功能,可以监控串口设置以及收发的数据。 22).在线自动更新提示功能,当有可用新版本时提示用户下载。 23).本程序线程安全,可以同时启动多个副本调试多个串口。 A.程序拥有端口监控功能,可以监控内核事件并拦截所有通过指定端口收发的数据,该功能 目前只在2000/XP/2003平台上有效。 1.在使用监控功能前必须保证所要监控的端口处于关闭状态。 2.运行本程序,选择所要监控的端口并启动监控功能,然后启动要被监控的端口; B.程序第一次启动时自动设置语言,也可以手动在View->Language菜单项选择相应的语言, 目前支持英文、简体中文、繁体中文。 2.运行环境 --------------------- Windows 9x/2000/XP/2003/Vista/Win7 3.安装与卸载 --------------------- 运行解压软件,将压缩包解压到指定目录完成安装。卸载时只需将程序目录删除。 4.软件使用 --------------------- SUDT AccessPort 安装完成后即可使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值