Windows Filesystem filter driver
参考:http://www.codeproject.com/Articles/43586/File-System-Filter-Driver-Tutorial
关键点:
To perform attaching, we create a new device object with the device extension (call
IoCreateDevice) and the propagate device object flags from the device object we are trying to attach to (DO_BUFFERED_IO,DO_DIRECT_IO,FILE_DEVICE_SECURE_OPEN). Then, we callIoAttachDeviceToDeviceStackSafein a loop with a delay in the case of failure. It is possible for this attachment request to fail because the device object has not finished initialization. This situation can occur if we try to mount the filter that was loaded as the volume only. When attaching is finished, we save the “attached to” device object to the device extension and clear theDO_DEVICE_INITIALIZINGflag. The device extension is shown below:
首先创建一个hookDevice,指定我们正在操作的driver为它服务;
然后使用IoAttachDeviceByPointer或者IoAttachDeviceToDeviceStack,将hookDevice放到targetDevice所在Dev Stack的顶部,这样,当有IRP过来时,会先经过hookDevice,即先调用我们的Driver进行处理,再传给下一层driver进行处理。
The IoAttachDeviceToDeviceStack routine attaches the caller's device object to the highest device object in the chain and returns a pointer to the previously highest device object.
下面以例子说明
kd> !drvobj atapi
Driver object (867ce610) is for:
\Driver\atapi
Driver Extension List: (id , addr)
(f744e8d8 867d2430)
Device Object list:
86758b00 8675ab00 86790b00 86786030
86787030
kd> dt _DRIVER_OBJECT 0x867ce610
ntdll!_DRIVER_OBJECT
+0x000 Type : 0n4
+0x002 Size : 0n168
+0x004 DeviceObject : 0x86758b00 _DEVICE_OBJECT
+0x008 Flags : 0x12
+0x00c DriverStart : 0xf743a000 Void
+0x010 DriverSize : 0x17480
+0x014 DriverSection : 0x867ebbc0 Void
+0x018 DriverExtension : 0x867ce6b8 _DRIVER_EXTENSION
+0x01c DriverName : _UNICODE_STRING "\Driver\atapi"
+0x024 HardwareDatabase : 0x80670260 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
+0x028 FastIoDispatch : (null)
+0x02c DriverInit : 0xf744f5f7 long atapi!GsDriverEntry+0
+0x030 DriverStartIo : 0xf74417c6 void atapi!IdePortStartIo+0
+0x034 DriverUnload : 0xf744b204 void atapi!IdePortUnload+0
+0x038 MajorFunction : [28] 0xf7444572 long atapi!IdePortAlwaysStatusSuccessIrp+0
表明,驱动名称为apapi,它一共为5个device提供服务,我们来看一下其中第一个device object
kd> dt _DEVICE_OBJECT 0x86758b00
ntdll!_DEVICE_OBJECT
+0x000 Type : 0n3
+0x002 Size : 0x234
+0x004 ReferenceCount : 0n0
+0x008 DriverObject : 0x867ce610 _DRIVER_OBJECT
+0x00c NextDevice : 0x8675ab00 _DEVICE_OBJECT
+0x010 AttachedDevice : 0x8678f030 _DEVICE_OBJECT
+0x014 CurrentIrp : (null)
+0x018 Timer : (null)
+0x01c Flags : 0x5050
+0x020 Characteristics : 0x101
+0x024 Vpb : (null)
+0x028 DeviceExtension : 0x86758bb8 Void
+0x02c DeviceType : 2
+0x030 StackSize : 1 ''
+0x034 Queue : __unnamed
+0x05c AlignmentRequirement : 1
+0x060 DeviceQueue : _KDEVICE_QUEUE
+0x074 Dpc : _KDPC
+0x094 ActiveThreadCount : 0
+0x098 SecurityDescriptor : 0xe100cf70 Void
+0x09c DeviceLock : _KEVENT
+0x0ac SectorSize : 0
+0x0ae Spare1 : 1
+0x0b0 DeviceObjectExtension : 0x86758d38 _DEVOBJ_EXTENSION
+0x0b4 Reserved : (null)
+0x008 DriverObject : 0x867ce610 _DRIVER_OBJECT 【指向为其服务的driver,即atapi】
+0x00c NextDevice : 0x8675ab00 _DEVICE_OBJECT 【指向atapi中的device list中的下一项,在!drvobj atapi的结果中得到了验证】
+0x010 AttachedDevice : 0x8678f030 _DEVICE_OBJECT 【指向该device object所在的device stack中的下一项,或者说更加靠近顶层的一项】
我们沿着device stack一直向下遍历:
kd> dt _DEVICE_OBJECT 0x8678f030
ntdll!_DEVICE_OBJECT
+0x000 Type : 0n3
+0x002 Size : 0x47c
+0x004 ReferenceCount : 0n0
+0x008 DriverObject : 0x867d0970 _DRIVER_OBJECT
+0x00c NextDevice : (null)
+0x010 AttachedDevice : (null)
+0x014 CurrentIrp : (null)
+0x018 Timer : 0x8679a548 _IO_TIMER
+0x01c Flags : 0x2050
+0x020 Characteristics : 0x101
+0x024 Vpb : 0x867bebe0 _VPB
+0x028 DeviceExtension : 0x8678f0e8 Void
+0x02c DeviceType : 2
+0x030 StackSize : 3 ''
+0x034 Queue : __unnamed
+0x05c AlignmentRequirement : 1
+0x060 DeviceQueue : _KDEVICE_QUEUE
+0x074 Dpc : _KDPC
+0x094 ActiveThreadCount : 0
+0x098 SecurityDescriptor : 0xe100cf70 Void
+0x09c DeviceLock : _KEVENT
+0x0ac SectorSize : 0
+0x0ae Spare1 : 0
+0x0b0 DeviceObjectExtension : 0x8678f4b0 _DEVOBJ_EXTENSION
+0x0b4 Reserved : (null)
kd> !devstack 0x8678f030
!DevObj !DrvObj !DevExt ObjectName
> 8678f030 \Driver\Cdrom 8678f0e8 CdRom0
86758b00 \Driver\atapi 86758bb8 IdeDeviceP1T0L0-17
!DevNode 8678f9b8 :
DeviceInst is "IDE\CdRomVBOX_CD-ROM_____________________________1.0_____\42562d3231303037333036372020202020202020"
ServiceName is "cdrom"
可见,device stack其实就是通过_DEVICE_OBJECT中的AttachedDevice指针串联起来的一个单链表,当调用IoAttachDeviceToDeviceStack时,会在该device stack的最顶端添加我们自己的device object。
然后,当一个IRP过来时,不论它是以这个device object中的哪一个device object作为参数,它都会传递到栈的最顶端的device所对应的driver中去处理。
因此,这就是为什么IoAttachDeviceToDeviceStack能够创建file system filter driver的原因。
Device Stack决定了Driver被执行的顺序,或者说driver是没有层次结构的,只有device有层次结构。
Windows Filesystem filter driver的更多相关文章
- busdog is a filter driver for MS Windows (XP and above) to sniff USB traffic.
https://code.google.com/p/busdog/ busdog is a filter driver for MS Windows (XP and above) to sniff U ...
- Windows Self Signed Driver
In particular, Microsoft® instituted a device driver certification process for its Windows® desktop ...
- 显示器驱动程序 NVIDIA Windows Kernel Mode Driver Version 已停止响应 并且己成功恢复 解决方法
原文:http://news.160.com/?p=1890 在玩游戏中 经常 出现显示器驱动程序 NVIDIA Windows Kernel Mode Driver Version 已停止响应 并且 ...
- mini filter driver sql server
https://blogs.msdn.microsoft.com/sql_pfe_blog/2013/04/23/identifying-the-cause-of-sql-server-io-bott ...
- [Windows驱动]驱动包(Driver Packages)
在windows下安装一个驱动,我们你需要把所有需要的软件打包-称为驱动包.驱动包里包括系统提供的给所有设备类使用的一般安装工具,还包括了设备商提供的设备特定的组件.下面我们就来看看驱动包里具体需要哪 ...
- Windows平台内核级文件访问
1.背景 在windows平台下,应用程序通常使用API函数来进行文件访问,创建,打开,读写文件.从kernel32的CreateFile/ReadFile/WriteFile函数,到本地系统 ...
- Windows 8 应用商店无法连接到网络的终极完美解决方案
当你看到以下几个步骤的时候,你可能会不以为然,因为你已经试过了,还是没成功,依然提示"你的电脑没有连接到Internet或者现在无法使用Windows应用商店,要使用Windows应用商店, ...
- WIFI WPA1/2 Crack for Windows
0x00 前言 目前WIFI WPA破解主要 以“aircrack-ng”为代表,运行于Linux系统( 如Kali Linux ),Windows系统比较少见,主要是Windows系统下WIFI网卡 ...
- Windows Kernel Security Training Courses
http://www.codemachine.com/courses.html#kerdbg Windows Kernel Internals for Security Researchers Thi ...
随机推荐
- mybatis输出映射总结
使用resultType作为输出映射 只有查询出来的列名和pojo中的属性名一致时,才会映射成功, 如果不一致,可以使用resultMap最为输出类型 不管是输出单个对象还是列表(list中包括poj ...
- POJ-1611.TheSuspects.(并查集)
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 55832 Accepted: 26501 De ...
- TensorFlow 安装报错的解决办法
最近关注了几个python相关的公众号,没事随便翻翻,几天前发现了一个人工智能公开课,闲着没事,点击了报名. 几天都没有音信,我本以为像我这种大龄转行的不会被审核通过,没想到昨天来了审核通过的电话,通 ...
- windos忘记密码登陆如何修复
一.简单的方法: 开机启动windows,进入欢迎界面后,会出现输入用户名密码提示框,这时候,同时按住Ctrl+Alt+Delete,会跳出一个账号窗口,输入用户名:administer,按回车即可. ...
- JavaScript中的方法和属性
书读百遍其义自见 学习<JavaScript设计模式>一书时,前两个章节中的讲解的JavaScript基础知识,让我对属性和方法有了清晰的认识.如下是我的心得体会以及部分摘录的代码. 不同 ...
- WEEX-EROS开发小笔记
本文是作者之前刚接触移动端跨平台开发,使用weex-eros开发项目平日里记下来的一些笔记,分享出来方便为新手解惑,weex-eros是weex的一套解决方法,使用vue语法糖,对于前端开发者来说可以 ...
- linux驱动启动顺序
首先,我们可以查看Linux内核编译完成后的System.map文件,在这个文件中我们可以看到macb(dm9161驱动模块)链接到了dm9000驱动之前,如下所示: c03b6d40 t __ini ...
- 关于javascript提交到java后台空格去不掉ASCII为160的解决办法
今天正则表达式匹配一个字符串,怎么都不对. 用正则表达式去掉尝试str.replaceAll("\\s*",""); 在或者用replaceAll(" ...
- runltp出现问题 [
runltp 623行: if [ "$?" == "0" ]; then 对[解析出了问题. 我灵机一动,是不是sh的问题. which sh /bin/sh ...
- 【串线篇】Mybatis之动态sql
一.if标签 <select id="getTeacherByCondition" resultMap="teacherMap"> select * ...