fatcat1017
驱动牛犊
驱动牛犊
  • 注册日期2008-12-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望121点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2410回复:4

【困扰很久】串口过滤驱动被旁路的奇怪问题

楼主#
更多 发布于:2011-10-26 03:39
问题背景描述:
客户机(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例程中创建过滤设备?
 
有没有哪位大侠解惑一下,困扰了很久。
 
fatcat1017
驱动牛犊
驱动牛犊
  • 注册日期2008-12-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望121点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2011-10-26 12:39
在网上搜到SerialSpy.zip,发现其过滤驱动加载方式和我一样,不能解决帖子里描述的旁路问题啊。
fatcat1017
驱动牛犊
驱动牛犊
  • 注册日期2008-12-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望121点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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的话,和目前我实现的这种方式的区别在哪儿呢?
 
能解决这个旁路的问题么?
fatcat1017
驱动牛犊
驱动牛犊
  • 注册日期2008-12-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望121点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2011-10-26 14:36
期待各位大侠的答复,在此谢过了先!
jonnystill7
驱动牛犊
驱动牛犊
  • 注册日期2009-07-15
  • 最后登录2011-11-28
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2011-11-28 19:16
我做过这方面的工作,相关代码已发到你邮箱了,查收一下~
游客

返回顶部