[转载]文件过滤驱动 文件系统激活通知 IoRegisterFsRegistrationChange函数实现
IoRegisterFsRegistrationChange 注册一个文件系统变动回调函数,用来被通知文件系统的激活和注销,激活是指第一次加载文件系统,当一个文件系统已经加载后,当加载一个同种文件系统的卷时,该文件系统就和激活没关系。话说该函数调用后,激活的文件系统会重新激活一遍,在2k SP4之后的系统都会这样做。
现在考虑下,这种机制是怎么实现的,猜测是在注册的时候,注册完成后,系统将各种类型的文件系统,都调用该回调函数一遍,来一次所有文件系统激活的通知。而事实上,也应该如此,reactOs的实现机制显示是这样的,奉上源码:
首先,先解释一些事情,目前系统会将各种类型的文件系统放到各自的链表队列中,如本地磁盘文件系统,ntfs和fat32文件系统,就在IopDiskFileSystemQueueHead队列中,其他类型的文件系统,如网络文件系统,是在IopNetworkFileSystemQueueHead中,cdrom文件系统,是在IopCdRomFileSystemQueueHead中,磁带文件系统,是在IopTapeFileSystemQueueHead队列中。
先看IoRegisterFsRegistrationChange的实现
下面是用的一些结构和数据

该函数的实现还是比较简单的,先查询保存FS_CHANGE_NOTIFY_ENTRY结构的这张链表IopFsNotifyChangeQueueHead,如果要注册的driveobject和回调函数地址都一样,就不再重复注册,如果未注册,分配内存,将该结构填充后插到链表尾部,然后,也就是我们猜想的部分的实现,确实是各种类型的文件系统队列,依次调用该回调函数就行文件系统激活的通知。
看下IopNotifyAlreadyRegisteredFileSystems函数的实现:
依次遍历各种类型的文件系统队列,然后依次调用该回调函数进行通知,在判断的时候,对最后一个节点,和rawfs结合起来判断了,关于rawfs的东西,目前还不是很清楚,这里不做解释。
现在,就明白这个问题了,当文件系统已经加载了,注册文件激活通知,是如何得到通知的。
在文件过滤驱动中,该函数主要应用场景是,当一个新增的卷要挂载时,我们如何实时地挂载到这个卷上,就可以调用该函数,得到各个文件系统的控制设备,然后attach上去,那么块设备在挂载卷设备时,会向文件系统控制设备发送irp_mj_file_system_control的irp,我们挂载文件系统控制设备后,就会先得到通知,然后取出里面的vpb对应的realdeivce对象保存起来,当该irp在真正的文件系统控制设备完成后,我们根据保存的vpb获取对应的deviceobject,即新挂载的卷设备,这样就可以实时attach到这个新增的卷设备上了,从而能对新增的卷设备进行及时的管控或设计。
[转载]文件过滤驱动 文件系统激活通知 IoRegisterFsRegistrationChange函数实现的更多相关文章
- 基于Minifilter框架的文件过滤驱动理解
概述 Minifilter即File System Minifilter Drivers,是Windows为了简化第三方开发人员开发文件过滤驱动而提供的一套框架,这个框架依赖于一个称之为Filter ...
- Windows 文件过滤驱动经验总结
Windows 文件过滤驱动经验总结作者:sinister 本文转载自驱动开发网 看了 ChuKuangRen 的第二版<文件过滤驱动开发教程>后,颇有感触.我想,交流都是建立在平等的基础 ...
- 文件过滤驱动实现目录重定向(一)good
文件过滤驱动拦截的IRP主要包括以下几个:IRP_MJ_CREATE,文件创建操作,文件的任何操作,都是从这里开始的.IRP_MJ_CLEANUP,文件的HANDLE句柄全部关闭会触发这个消息IRP_ ...
- 文件过滤驱动框架Minispy解析一
因工作需要,研究minispy文件过滤框架,上图为我整理出的其内核部分代码的逻辑.
- File System Minifilter Drivers(文件系统微型过滤驱动)入门
问题: 公司之前有一套文件过滤驱动,但是在实施过程中经常出现问题,现在交由我维护.于是在边看代码的过程中,一边查看官方资料,进行整理. 这套文件过滤驱动的目的只要是根据应用层下发的策略来控制对某些特定 ...
- 驱动开发:内核枚举Minifilter微过滤驱动
Minifilter 是一种文件过滤驱动,该驱动简称为微过滤驱动,相对于传统的sfilter文件过滤驱动来说,微过滤驱动编写时更简单,其不需要考虑底层RIP如何派发且无需要考虑兼容性问题,微过滤驱动使 ...
- 一个文件系统过滤驱动的demo
因为没写过FSD过滤驱动,所以拿来练练手,没有什么技术含量.参考自Win内核安全与驱动开发. 先梳理一下大概的流程,就是怎么去绑定设备栈.怎么去过滤各种请求的. 首先肯定是要绑定设备栈的,来看下怎么绑 ...
- ------- 软件调试——注销 QQ 过滤驱动设置的事件通知 CallBack (完)-------
---------------------------------------------------------------------------------- 本系列的最后一篇演示如何通过调试手 ...
- inotify--内核中文件系统的通知机制
转载:http://www.ibm.com/developerworks/cn/linux/l-inotifynew/index.html 一. 引言 众所周知,Linux 桌面系统与 MAC 或 W ...
随机推荐
- javaproject积累——树形结构的操作
近期一直被树形结构整的非常头大,又是递归.又是循环.可是,好在我们在经历了千辛万苦后.最终弄出来了.事实上就是组织机构的常规操作,有些是我们过度设计.有些是我们想错了.而对数的逻辑读取,我们就属于想错 ...
- SolidEdge如何快速绘制并完全定义槽型孔
如果你点击A之后形成的圆弧不是你想要的 你试着换个方向,如下图所示 有时候只有一个方形可以形成你要的半圆
- ubuntu 16.04 更新后搜狗输入法无法输入中文的问题
方法一:重启搜狗输入法 通过下面的两个命令重启搜狗输入法,看重启后是否可以正常使用: ~$ killall fcitx ~$ killall sogou-qinpanel 方法二:检查修复安装依 ...
- RPM安装mysql5.6
原文 http://blog.csdn.net/liumm0000/article/details/18841197 a. 检查MySQL及相关RPM包,是否安装,如果有安装,则移除(rpm –e 名 ...
- docker (2)---存储、网络(利用docker容器上线静态网站)
一.docker底层依赖的核心技术 1.命名空间 (Namespaces) 2.控制组 (Control Groups) 3.联合文件系统 (Union File System) 4.Linux 虚拟 ...
- strsep strpbrk
#include <stdio.h> #include <string.h> int main(void) { char s[] = "aa,bb,cc.11,22, ...
- ln: 正在创建指向“asm-arm”的符号链接“asm”: 不支持的操作
原因是不能在windows共享目录编译,将待编译的uboot源码copy到home目录
- CentOS笔记-其他杂记
1.忘记密码时,可以用single模式来修改密码,为了安全,可以禁用single模式,参考网址如下 Centos服务器禁止单用户模式(single)来增强系统安全 2.远程登录:ssh root@xx ...
- 【bzoj4554】[Tjoi2016&Heoi2016]游戏
现在问题有硬石头和软石头的限制 所以要对地图进行预处理 分行做,把有#隔开的*(x)形成联通块的存储下来. 分列作,把有#隔开的*(x)形成联通块的存储下来. 求出所有的行联通个数和列联通个数 作为二 ...
- 开源企业IM免费企业即时通讯ENTBOOST V2014.177版本号正式公布
版权声明:本文为博主原创文章,欢迎转载,转载请尽量保持原文章完整,谢谢! https://blog.csdn.net/yanghz/article/details/30529469 ENTBOOST, ...