首页
社区
课程
招聘
[原创]windows内核编程之[串口过滤]
发表于: 2016-9-11 13:00 11971

[原创]windows内核编程之[串口过滤]

2016-9-11 13:00
11971

嗯,昨天发过一篇有关【应用-内核通信】的内核基础贴:http://bbs.pediy.com/showthread.php?t=212683 请大家多多提意见。
  今天的内容是串口过滤,都是很基础的,但我会认真写的。

  过滤概念:
  过滤,顾名思义,水流从A点流向B点,当我们想要去掉水中的泥沙,却又想不影响水的流向时,就可以在A,B两点间插入一个过滤网C。串口过滤其实也和这差不多,我们可以在串口设备的外面加一层过滤网,这样就保证了总是我们的程序率先收到应用发向串口的信息。如果是写串口操作,还可以截获写往串口的数据。当我们的“过滤网”对截获的信息操作完毕之后,为了不影响内核正常工作,还需要将截获的信息发出去(至于怎么发就是你们自己的事了)

  技术原理:
  上一篇帖子介绍了如何生成驱动程序自己的设备对象,那么现在我们可以用自己生成的“虚拟设备对象”来绑定到“串口设备对象”上。这样绑定过后,原本发给串口的信息,都会先发到我们自己的设备对象上。
  用于绑定的内核API很多,这里我使用的是IoAttachDeviceToDeviceStack,与这个相似的API还有一个:IoAttachDeviceToDeviceStackSafe,只不过有兼容性问题。贴出IoAttachDeviceToDeviceStack原型:

PDEVICE_OBJECT IoAttachDeviceToDeviceStack(
  _In_ PDEVICE_OBJECT SourceDevice,
  _In_ PDEVICE_OBJECT TargetDevice
);
NTSTATUS IoGetDeviceObjectPointer(
  _In_  PUNICODE_STRING ObjectName,
  _In_  ACCESS_MASK     DesiredAccess,
  _Out_ PFILE_OBJECT    *FileObject,
  _Out_ PDEVICE_OBJECT  *DeviceObject
);
VOID IoDetachDevice(
  _Inout_ PDEVICE_OBJECT TargetDevice
);
VOID IoDeleteDevice(
  _In_ PDEVICE_OBJECT DeviceObject
);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (10)
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
最关键的是IoAttachDeviceToDeviceStack,过滤驱动都会调用这个
还有IRP Hook也可以
2016-9-11 16:01
0
雪    币: 2044
活跃值: (237)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
mark....
2016-9-11 21:01
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
楼主的分享精神值得赞扬。
PS:一个问题
ObDereferenceObject(KS_FileObj);
万一这时候,串口正好被拔下来了,然后你def一下,就爆炸了。
PS2:
另一个问题是兼容性
https://msdn.microsoft.com/zh-tw/library/windows/hardware/ff548236
中说了IoAttachDeviceToDeviceStackSafe 的支持是这样子的
This routine is available on Update Rollup for Windows 2000 Service Pack 4 (SP4) and on Windows XP and later.
2016-9-11 21:56
0
雪    币: 31
活跃值: (87)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
谢谢!我会不断改进的
2016-9-11 22:21
0
雪    币: 6235
活跃值: (1057)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
楼主是根据《Windows内核安全与驱动开发》这本书来写的么?
2016-9-12 08:54
0
雪    币: 31
活跃值: (87)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
是的,我也是刚刚进入驱动大门,这里发帖的话主要还是为了写写自己看书的笔记,把自己的一些体会写出来,发表的话也是为了帮助更多的像我这样对内核不熟的小白,如果需要注明引用的话我下次会注意的,毕竟刚入看雪,虽然注册几个月了,也是这几天才发文
2016-9-12 22:59
0
雪    币: 6235
活跃值: (1057)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
是说顺序看着有些像,不过能写上是读书笔记加上自己的感悟,也算是对原作者的一种尊重吧。
2016-9-13 11:10
0
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
9
感谢分享~~
2016-9-14 08:54
0
雪    币: 484
活跃值: (1132)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
支持! 很久没看到新帖了
2016-9-15 07:25
0
雪    币: 3700
活跃值: (2659)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
11
次元有名 谢谢!我会不断改进的
lz如果在驱动里 IoGetDeviceObjectPointer 获取一个已打开的串口,会失败,这个问题怎么解决?
最后于 2020-2-15 22:57 被yegu编辑 ,原因:
2020-2-15 22:55
0
游客
登录 | 注册 方可回帖
返回
//