阅读:2777回复:4
【困扰很久】串口过滤驱动被旁路的奇怪问题
问题背景描述:
客户机(WinXP)的串口(COM1)上连接了一个外置Modem(Hayes),客户采用Windows拨号连接通过该Modem拨号访问远程服务器。需要写一个串口过滤驱动,监控客户拨出的电话号码是否非法。 我的处理方法: 编写串口过滤驱动,创建过滤设备并绑定到相应的串口设备\Device\Serial0之上,通过过滤IRP_MJ_WRITE来截获其中的电话号码。 我的过滤驱动中没有AddDevice例程,直接在DriverEntry中通过IoGetDeviceObjectPointer获取\Device\Serial0的设备指针,再IoCreateDevice创建过滤设备MyFiltSer0,最后通过IoAttachDeviceByPointer将MyFiltSer0挂载在Serial0之上。 通过DeviceTree查看到本机上相关的驱动及其设备如下示: |---serial.sys | | | |-------\Device\Serial0 (此即COM1,其上连着外置Modem) | |---serenum.sys | | | |--------\Device\00000082 | |--------\Device\unamedDevice0 | |---modem.sys | | | |---------\Device\00000083 | |---MyFiltSer.sys | | | |----------\Device\MyCtrlDev | |----------\Device\MyFiltSer0 以上设备间的Attach关系如下: |---\Device\Serial0 |---\Device\00000082 | | |---\Device\unamedDevice0 |---\Device\00000083 | |---\Device\MyFiltSer0 遇到的问题: 从上图可以看到,我自己生成的过滤设备MyFiltSer0已经是serial和serenum的upper filter了,问题的关键就是外置Modem驱动创建的\Device\0000083挂载在了serenum的\Device\00000082之上,我通过IRPTrace跟踪发现,当用户通过Windows拨号连接进行拨号操作时,其IRP_MJ_CREATE、IRP_MJ_WRITE的操作通过00000083--->00000082--->unamedDevice0--->Serial0,似乎直接把我的MyFiltSer0给旁路了。而我的MyFiltSer0只能收到IRP_MJ_POWER不知道这是为什么呢? 我还试过,如果用户不通过Windows拨号连接进行拨号操作,而是直接通过往串口COM1中写AT指令进行拨号的话,我的过滤驱动却是可以过滤IRP_MJ_CREATE、IRP_MJ_WRITE这些IRP的。 我目前的想法是,我的过滤驱动是否需要写成WDM驱动的形式,在AddDevice例程中创建过滤设备? 有没有哪位大侠解惑一下,困扰了很久。 |
|
沙发#
发布于:2011-10-26 12:39
在网上搜到SerialSpy.zip,发现其过滤驱动加载方式和我一样,不能解决帖子里描述的旁路问题啊。
|
|
板凳#
发布于:2011-10-26 14:18
我也看了Walter Oney的这两篇文章:
http://www.wd-3.com/archive/SerialFilter.htm http://www.wd-3.com/archive/SerialAttachedDevices.htm 讲到Serial port filter driver的问题,难道我需要写一个class filter driver么? 可是class filter driver的话,和目前我实现的这种方式的区别在哪儿呢? 能解决这个旁路的问题么? |
|
地板#
发布于:2011-10-26 14:36
期待各位大侠的答复,在此谢过了先!
|
|
地下室#
发布于:2011-11-28 19:16
我做过这方面的工作,相关代码已发到你邮箱了,查收一下~
|
|