znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
阅读:1655回复:5

内核级文件读写流程[转]

楼主#
更多 发布于:2008-12-25 16:10

可能为(sinister 编写)
                
?在应用层读写文件等操作将通过 INT 2E
切换到内核层。这个不用说大家都很熟悉流程。那么到了内核层又是如何处理的?就先拿 ZwReadFile,ZwWriteFile 说事。首先将文件句柄转换成
FILE_OBJECT 指针。这时 I/OMGR 收到一个 FILE I/O 请求,它将首先选择用 FASTIO 接口来进行缓冲操作(注意:FASTIO 对于
FSD 来说不是必须的。且 FASTIO 并不真正读写内容)如果有 FASTIO 例程则调用
FastIoRead,FastIoWrite。在它们的函数处理例程中返回 TRUE 那么则表示操作完成,继续调用 CC MGR。如果返回 FALSE 那么
I/O MGR 则创建 IRP 。系统判断 FILE_OBJECT 结构中的PrivateCacheMap 项如果不为 NULL,表示已被 CC MGR
映射过了,调用CcCopyRead,CcCopyWrite。如果为 NULL 那么 CC MGR 会调用 CcInitializeCacheMap
来初始化,把相应的 FILE_OBJECT 映射进来。在经过 I/O MGR 处理后无论是 IRP 还是 FASTIO,怎么分支都会走到CC MGR。那么在
CC MGR 中又会碰到几个状况。如 CC MGR 的 LAZY WRITETHREAD 会定期调用 MM MGR 的 MmFlushSection 将 CC
MGR 中已被修改的PAGE 发送到 FSD 写盘。而 MM MGR 又有几种状况,先拿写来说。MM MGR 存在 DIRTY WRITE 那么在这种情况下
MM MGR 则调用 IoAsynchronousPageWrite向 FSD 发送 NOCACHE IRP 即 IRP HEADER 的 FLAGS 为
IRP_NOCACHE 来写盘。也就是说 CC MGR 调用 MM MGR 的 MmFlushSection 而 MM MGR
则调用IoAsynchronousPageWrite 发送 NOCACHE IRP 到 FSD,那么 FSD 则直接发送到 STORAGE DRIVER
进行写盘操作。这是写盘操作过程。在走到 CC MGR 后读盘又分几种状况。在调用 CcCopyRead 时如果数据不在 CC MGR 中,则产生缺页中断(这其实也是预先读机制)。产生缺页中断后会走到MM
MGR 。此时 MM MGR 调用 IoPageRead 来发送一个 PAGING I/O 的 IRP 即 IRP HEADER 中的 FLAGS为
IRP_PAGING_IO 或 IRP_SYNCHRONOUS_PAGING_IO 到 FSD。还有就是用户层调用 CreateFileMapping
其实是调用 NtCreateSection 一样产生缺页中断然后到MM MGR 调用
MmCreateSection。其余就跟我上面提到的流程一样了。待一些读/写 IRP 发送到 FSD 时。 FSD 再调用 IoCallDriver
继续传递下去。如果你对NT DRIVER 分层机制了解的话。可能就会理解为什么要有这一步。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
jununfly
驱动牛犊
驱动牛犊
  • 注册日期2008-10-17
  • 最后登录2010-06-01
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望560点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-12-25 16:20
呵呵,之前我就考虑过等.doc创建的重命名时刻保存相关信息,然后内核读该文件然后创建一个文件保存其信息,并可以添加自己的信息,然后等机会删除原来的,最终在做一次重命名。即内核模式下的静态加密
唉,这个思路我才想出来就把他否决了
eleqi
驱动小牛
驱动小牛
  • 注册日期2005-12-20
  • 最后登录2014-01-03
  • 粉丝4
  • 关注2
  • 积分172分
  • 威望1475点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-12-26 11:18
好贴!学习,自己摸索时走了很多弯路虽然搞定了一个又一个难题但过程是相当痛苦的,当然也有好处就是理解和掌握的更透彻
谢谢!
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2008-12-27 10:24
有一些不准确的地方。
1.系统判断 FILE_OBJECT 结构中的PrivateCacheMap 项如果不为 NULL,表示已被 CC MGR
映射过了,调用CcCopyRead,CcCopyWrite。但是如果PrivateCacheMap为null,则io mgr则就要生成
irp发给文件系统驱动,由文件系统驱动去调用CcInitializeCacheMap,而不是io mgr自己调用。可以看看fastfat的Read函数
2.在调用 CcCopyRead 时如果数据不在 CC MGR 中,则产生缺页中断(这其实也是预先读机制)。
这个不叫预读,预读简单说比如你顺序读,读64k, cc mgr预测你还会读下一个64k,这样cc mgr一次会读128k.

3.还有就是用户层调用 CreateFileMapping ,其实是调用 NtCreateSection 一样产生缺页中断然后到MM MGR 调用MmCreateSection.不知道想表达什么意思。
可能是想说ntcreatesection,会调用mm mgr的mmcreatesection.mapview以后,当访问映射的地址的时候,会产生缺页中断,此时 MM MGR 调用 IoPageRead 来发送一个 PAGING I/O 的 IRP ,和上面cc copy的处理流程是一样的了。而不是在ntcreatesection的时候会产生缺页中断

还是要看windows internal那本书,权威而且非常准确,有精力多看看源代码更好。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地下室#
发布于:2008-12-27 15:34
感谢zhaock的补充
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
xbpeng
驱动牛犊
驱动牛犊
  • 注册日期2008-12-12
  • 最后登录2009-02-17
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-12-31 09:49
  好帖``谢谢楼主
游客

返回顶部