Windows文件系统过滤驱动开发教程


4.设备栈,过滤,文件系统的感知

前边都在介绍文件系统驱动的结构,却还没讲到我们的过滤驱动如何能捕获所有发给文件系统驱动的irp,让我们自己来处理?前面已经解释过了设备对象。现在来解释一下设备栈。

任何设备对象都存在于某个设备栈中。设备栈自然是一组设备对象。这些设备对象是互相关联的,也就是说,如果得到一个DO指针,你就可以知道它所处的设备栈。

任何来自应用的请求,最终被windows io mgr翻译成irp的,总是发送给设备栈的顶端那个设备。

原始irp irp irp irp
--------------> ------> -------> ----->
DevTop Dev2 ... DevVolumne ... ???
<-------------- <------ <------- <-----
原始irp(返回) irp irp irp

上图向右的箭头表示irp请求的发送过程,向左则是返回。可见irp是从设备栈的顶端开始,逐步向下发送。DevVolumue表示我们实际要过滤的 Volume设备,DevTop表示这个设备栈的顶端。我们只要在这个设备栈的顶端再绑定一个设备,那发送给Volume的请求,自然会先发给我们的设备 来处理。

有一个系统调用可以把我们的设备绑定到某个设备的设备栈的顶端。这个调用是IoAttachDeviceToDeviceStack,这个调用2000以 及以上系统都可以用(所以说到这点,是因为还有一个IoAttachDeviceToDeviceStackSafe,是2000所没有的。这常常导致你 的filter在2000下不能用。)

我自己写了一个函数来帮我实现绑定功能:

//----------------------wdf.h中的内容----------------------------------
// 这个例程把源设备绑定到目标设备的设备栈中去,并返回源设备所直
// 接绑定的设备。注意源设备未必直接绑定在目标设备上。它应绑定在
// 目标设备的设备栈的顶端。
_inline wd_stat wd_dev_attach(in wd_dev *src,
in wd_dev *dst,
in out wd_dev **attached)
{
*attached = dst;
*attached = IoAttachDeviceToDeviceStack(src,dst);
if(*attached == NULL)
return wd_stat_no_such_dev;
return wd_stat_suc;
}

到这里,我们已经知道过滤对Volume的请求的办法。比如“C:”这个设备,我已经知道符号连接为“C:”,不难得到设备名。得到设备名后,又不难得到 设备。这时候我们IoCreateDevice()生成一个Device Object,然后调用wd_dev_attach绑定,不是一切ok吗?所有发给“C:”的irp,就必然先发送给我们的驱动,我们也可以捕获所有对文 件的操作了!

这确实是很简单的处理方法。我得到的FileMon的代码就是这样处理的,如果不想处理动态的Volume,你完全可以这样做。但是我们这里有更高的要 求。当你把一个U盘插入usb口,一个“J:”之类的Volume动态诞生的时候,我们依然要捕获这个事件,并生成一个Device来绑定它。

一个新的存储媒质被系统发现并在文件系统中生成一个Volume的过程称为Mounting.其过程开始的时候,FS的CDO将得到一个IRP,其 Major Function Code为IRP_MJ_FILE_SYSTEM_CONTROL,Minor Function Code为IRP_MN_MOUNT。换句话说,如果我们已经生成了一个设备绑定文件系统的CDO,那么我们就可以得到这样的IRP,在其中知道一个新的 Volume正在Mount.这时候我们可以执行上边所说的操作。

现在的问题是如何知道系统中有那些文件系统,还有就是我应该在什么时候绑定它们的控制设备。

IoRegisterFsRegistrationChange()是一个非常有用的系统调用。这个调用注册一个回调函数。当系统中有任何文件系统被激活或者是被注销的时候,你注册过的回调函数就会被调用。

//----------------------wdf.h中的内容----------------------------------
wd_stat wdff_reg_notify(
in wd_drv *driver,
in wdff_notify_func func
)
{
return IoRegisterFsRegistrationChange(driver,func);
}

你有必要为此写一个回调函数。

//-------------------我的回调处理函数----------------------------------
wd_void my_fs_notify(
in wd_dev *dev,
in wd_bool active)
{
wd_wchar name_buf[wd_dev_name_max_len];
wd_ustr name;
wd_ustr_init_em(&name,name_buf,wd_dev_name_max_len);

// 如果注册了,就应该得到通知
wd_printf0("notify: a file sys have been acitved!!! \r\n");

// 得到文件系统对象的名字,然后打印出来
wd_obj_get_name(dev,&name);
wd_printf0("notify : file sys name = %wZ\r\n",&name);

if(active)
{
wd_printf0("notify: try to attach.\r\n");
// ... 请在这里绑定文件系统的控制设备
}
else
{
wd_printf0("notify: unactive.\r\n");
// ...
}
}

应该如何绑定一个文件系统CDO?我们在下面的章节再详细描述。

现在我们应该再在wd_main函数中加上下边的内容:

if(wdff_reg_notify(driver,my_fs_notify) != wd_stat_suc)
{
wd_printf0("error: reg notify failed.\r\n");
wd_fio_disp_release(driver);
wd_dev_del(g_cdo);
g_cdo = wd_null;
return wd_stat_insufficient_res;
};

wd_printf0("success: reg notify ok.\n");

我们再次回顾一下,wd_main中,应该做哪些工作。

a.生成一个控制设备。当然此前你必须给控制设置指定名称。

b.设置Dispatch Functions.

c.设置Fast Io Functions.

d.编写一个my_fs_notify回调函数,在其中绑定刚激活的FS CDO.

e.使用wdff_reg_notify调用注册这个回调函数。

转载于:https://www.cnblogs.com/jasononline/archive/2008/06/28/1231768.html

Windows文件系统过滤驱动开发教程(4)相关推荐

  1. Windows 文件系统过滤驱动开发教程 (第二版)

    Windows 文件系统过滤驱动开发教程 (第二版)       楚狂人-2007-上海 (MSN:walled_river@hotmail.com)          -1.  改版序....... ...

  2. Windows文件系统过滤驱动开发教程(0,1,2)

    0. 作者,楚狂人自述 我长期网上为各位项目经理充当"技术实现者"的角色.我感觉Windows文件系统驱动的开发能找到的资料比较少.为了让技术经验不至于遗忘和引起大家交流的兴趣我以 ...

  3. Windows文件系统过滤驱动开发教程(4,5)

    4.设备栈,过滤,文件系统的感知 前边都在介绍文件系统驱动的结构,却还没讲到我们的过滤驱动如何能捕获所有发给文件系统驱动的irp,让我们自己来处理?前面已经解释过了设备对象.现在来解释一下设备栈. 任 ...

  4. 文件系统过滤驱动开发(一)—Win32底层开发小组

    声明:本文无太多新意,只是介绍下学习经验,大神级人物(如总监大人)请略过,谢谢合作>_< 吐槽一下:学驱动算起来也是从上学期9月份开始吧,之前在家买了<Windows驱动开发技术详解 ...

  5. Windows 文件过滤驱动经验总结

    by ai3000 看了 ChuKuangRen 的第二版<文件过滤驱动开发教程>后,颇有感触.我想,交流都是 建立在平等的基础上,在抱怨氛围和环境不好的同时应该先想一想自己究竟付出了多少 ...

  6. 安信Windows驱动开发教程:什么是通用 Windows 平台 (UWP) 应用程序?有什么功能?

    安信Windows驱动开发教程:什么是通用 Windows 平台 (UWP) 应用程序?有什么功能? UWP 是为 Windows 创建客户端应用程序的众多方法之一.UWP 应用使用 WinRT AP ...

  7. Windows CE设备驱动开发之电源管理

    4.7电源管理 电源管理模块管理设备电源,从而全面改进操作系统的电源使用效率:它所有设备的电源使用,同时能与不支持电源管理的应用程序及驱动程序共存. 使用电源管理可以有效的减少目标设备的电源消耗,同时 ...

  8. 文件系统过滤驱动总结

    文件系统过滤驱动 . 1 文件系统过滤驱动工作原理 Windows NT内核操作系统的驱动模型采用分层结构,如图1所示.图中左边是一个设备对象栈,设备对象 是操作系统为帮助软件管理硬件而创建的数据结构 ...

  9. 电源管理 第二部分 ---- Windows CE设备驱动开发之电源管理

    Windows CE设备驱动开发之电源管理      第二部分 4.7.2.电源状态 电源管理器期望所有被管理的设备能支持一个或多个设备电源状态.设备电源状态的数量是有限的.设备必须通知电源管理器其功 ...

最新文章

  1. Mask-RCNN论文解读
  2. 【C语言】局部变量、全局变量,局部静态变量,全局静态变量,extern,static的区别...
  3. Python编程基础:第十四节 列表Lists
  4. JAVA面试中问及Hibernate与 Mybatis的对比
  5. tableViewCell的操作
  6. 精通Android自定义View(八)绘制篇Canvas分析之绘制文本
  7. ArcGIS客户端开发学习笔记(二)——XML
  8. Android笔记 fragment通信
  9. 【sql绕过】Bypass waf notepad of def
  10. 一个Repeater排序用的控件
  11. 位图转矢量图工具,快和模糊图片说白白
  12. 基于 FFMPEG 的视频解码(libavcodec ,致敬雷霄骅)
  13. 富文本点击事件-TTTAttributedLabel和YYtext的不同用法
  14. FPS游戏通用自瞄实现
  15. python电影数据分析报告_Python进行电影数据分析及可视化
  16. 手写jQuery轮播图插件,即拿即用,更多接口,更少代码实现你想要的轮播图~~
  17. 5G+工业互联网发展探讨
  18. 软考(一)——数据流图
  19. QQ看点模块100条测试用例
  20. 演讲如何克服紧张情绪

热门文章

  1. Sphinx API文档例子
  2. git remote(远程仓库操作)
  3. matplotlib xticks yticks
  4. Pandas 文本数据方法 cat()
  5. C语言switch如何退出,C语言萌新,想问问如何让下面那个switch函数输出的结果继续...
  6. linux进程及作业管理实验,Linux 进程及作业管理(一)
  7. 中国数据中心行业深度分析
  8. Spring学习总结(11)——Spring JMS MessageConverter介绍
  9. c语言迷宫求解毕业设计,毕业设计(论文)-基于Windows平台C语言实现迷宫游戏的设计.doc...
  10. Mysql存时间不一致_node mysql 存在数据库中的时间和取到前端的时间不一致,请问怎么解决...