阅读:2084回复:7
在pre-write中扩展FileSize时系统挂起
各位大牛,小弟现在在minifilter框架下做文件透明加密,我的方案是:在文件头写标记。
具体流程如下: 1. 在create中拦截文件新建/打开操作,判断文件是否已加密,并记录文件上下文; 2. 在pre-write中,当第一次NOCACHE|PAING_IO|SYNCHRONOUS_PAGING_IO写时,我先将我的标记写进去,然后调用FltSetInformation扩展文件长度(增加了头部标记的长度); 3. 在pre-read时对文件偏移进行设置,偏移仅针对NOCACHE|PAING_IO|SYNCHRONOUS_PAGING_IO读; 4.在查询/设置中也移动偏移, 5.分别在post-read和pre-write中解密和加密,仅针对有NOCACHE|PAING_IO|SYNCHRONOUS_PAGING_IO标记的IRP。 在FAT32下,对常用的txt,office文档都是可以的。但是在NTFS下,当第一次写磁盘请求来的时候,我去调用FltSetInformation扩展长度,却导致系统挂起,难道是因为paging io时不能扩展文件长度? 可是我是在请求到达文件系统之前扩展的长度啊,这个时候已经有相关资源或者锁被占用了么? 请大牛们指点,感激不尽。。。 |
|
|
沙发#
发布于:2009-09-07 11:24
Before issuing paging IO, cache manager locks the file. So there's no way you can change file size in paging IO path, even on FAT32.
|
|
板凳#
发布于:2009-09-07 11:31
谢谢老大深夜还回答我的问题!
但我的代码在FAT32下面确实是可以扩展文件长度的,这个通过跟踪已经证实了,已经实验过了很多次。而在NTFS下每次都会出现这个问题。 难道在pre-write中写标识是不可行的吗?还请老大指点一下。 |
|
|
地板#
发布于:2009-09-09 09:38
通过跟踪发现,是Fcb中的Resource资源被独占了,我试着在调用FltSetInformationFile前将该资源Release调,调用后再acquire,第一次在设置~$1.doc文件时居然调用通过啦。
但是当第二次对~WRD0001.tmp进行设置时却又不行了,仍然挂在那里。 |
|
|
地下室#
发布于:2009-09-11 14:15
在post-write中试了一下,也是不行,说明此时资源仍被占据,但是我自己从FCB中获取并释放了MainResource和PagingIoResource,设置长度时仍然会停在那里不动。
难道没有人遇到过这个问题? |
|
|
5楼#
发布于:2009-09-11 18:01
把代码放出来给大伙研究看看
|
|
6楼#
发布于:2009-09-11 20:36
"我自己从FCB中获取并释放了MainResource和PagingIoResource"
You cannot and should not do it. File system locks these resources for synchronization. Without these locks, there's no guarantee of data integrity. File size cannot and should not be changed in Paging IO path. |
|
7楼#
发布于:2009-09-12 02:06
回 6楼(michaelgz) 的帖子
Thanks, I'll try some other ways.I do will open the source code the filter driver is done. |
|
|