上篇讲到书中实现串口过滤的方式,不过想想这里面有些不是很灵活的地方,例如这个针对已经有串口的电脑才能使用,如果是USB转串口类型需要先接入USB之后,启动该过滤驱动才能实现过滤的作用,而且对串口的编号枚举是从1~32之间进行处理,那假设真的会有32以后的呢(当然从未见过这样变态的串口号),不过串口的高级设定里面是可以显示到32以后的,那这样就带来了一些问题,这些设备该如何去使用该驱动呢。
Windows系统内置了很多设备驱动,我们插入一个鼠标、键盘、U盘都可以在系统中识别出来,但是系统不能对每一个设备都开发一个对应的驱动,如果真的这样估计系统大小又要增加很多,所以对于这些设备都是按照设备类进行加载的,如果硬件信息显示的是U盘,那系统会将对应Storage的驱动加载到这个设备上来,系统规定的设备类信息可以通过该链接获取http://msdn.microsoft.com/en-us/library/windows/hardware/ff553426(v=vs.85).aspx。从中我们可以看见有一种类型Ports (COM & LPT ports),这个就是我们需要的串口对应的类型。我们的过滤驱动只需要对这一类设备进行过滤就可以实现对串口设备过滤的功能,这边不得不说WDK中的Sample真的是牛,已经给我们提供了一个filter的例子,在Sample目录下\general\toaster\wdm\filter可以找到。这个例子编译出来的结果本身就是可以使用的,只是没有对数据进行分析,我们可以先安装上去看一看效果,使用chk的方式进行编译,这样可以从debugview中看见一些打印的信息,该项目可以按照不同的过滤类型进行编译,其实功能都是一样的,只是生成的文件名称不一样,这边就直接用clsupper的方式编译出来,在结合一个inf文件安装该驱动,inf文件的在目录src\setup\infs\clasfilt下的ClasFilt.inf,只是我们需要改动其中的一些内容。
最简单的改动方法如下:
1)将ClassFilter_AddReg下的GUID改成Port类型的GUID
[ClassFilter_AddReg]
HKLM,System\CurrentControlSet\Control\Class\{4d36e978-e325-11ce-bfc1-08002be10318},UpperFilters, 0x00010008, clasfilt
2)将编译出来的文件名改成clasfilt.sys就可以了,是不是感觉有点简单。
改动完成之后我们要开始安装此驱动了,安装的方式也很简单,将inf和sys文件放在同一个目录下,右击inf安装即可。
插入一个USB转串口设备就可以再DebugView中看见如下信息:
irpsp = IoGetCurrentIrpStackLocation(Irp);
if(irpsp->MajorFunction == IRP_MJ_WRITE)
{
DebugPrint(("FilterPass Write \n"));
len = irpsp->Parameters.Write.Length;
if(Irp->MdlAddress != NULL)
buf =
(PUCHAR)
MmGetSystemAddressForMdlSafe(Irp->MdlAddress,NormalPagePriority);
else
buf = (PUCHAR)Irp->UserBuffer;
if(buf == NULL)
buf = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;
for(i=0; i<len; ++i)
{
DebugPrint(("send buf 0x%02X ",buf[i]));
}
}
最后可以从DebugView中看见运行的结果。
至此我们就通过Sample修改出一个与书中功能类似的过滤驱动。