newkey
驱动小牛
驱动小牛
  • 注册日期2002-10-03
  • 最后登录2013-10-13
  • 粉丝1
  • 关注0
  • 积分45分
  • 威望392点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
阅读:1409回复:5

help:虚拟文件系统 处理记事本写问题

楼主#
更多 发布于:2008-01-28 16:29
写了一个虚拟文件系统,直接将IRP_MJ_XX 转成ZwXXFile对某个指定目录进行操作

查询、创建、读初步看没有问题,对写字板板写也没有问题

但对记事本写总是出现问题,问题现象如下
不过在写字板什么位置(最前面、最后面、中间)写数据,发生错位

如:原来内容为111111,在后面追加222,操作后变成 111111 111
跟踪过程,发现在写过程这个句柄上中多了一个IRP_MJ_READ操作,导致FileObject的curoffset指向了文件末尾,在写的时候就从末尾开始写全部内容,后面又紧跟一个EndofFile截断文件

不知道是那里处理不对,望指教

其中那个读操作是什么引发的,看调用栈,起到是CcMapAndCopy函数,而查看WRK代码,没发现是什么入口来的???

还有,用Filespy跟踪过程,发现有2此IRP_MJ_WRITE,但进到虚拟文件系统内部只有一次,why

www.xDrv.com
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2008-01-28 23:58
"虚拟文件系统" ? File System Filter Driver?

"直接将IRP_MJ_XX 转成ZwXXFile" - You can stuck your machine easily by doing this.

"多了一个IRP_MJ_READ" - Could be issued by FSD and you have to handle it.
newkey
驱动小牛
驱动小牛
  • 注册日期2002-10-03
  • 最后登录2013-10-13
  • 粉丝1
  • 关注0
  • 积分45分
  • 威望392点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-29 09:07
"虚拟文件系统" ? File System Filter Driver?
---File System

"直接将IRP_MJ_XX 转成ZwXXFile" - You can stuck your machine easily by doing this.
---不是为了商用,只是用于学习FS,这样操作简单

多一次 IRP_MJ_READ 从栈看,是因为在处理记事本写时,
Cache管理调用CcCopyWrite->CcMapAndCopy->MmCheckCachedPageState->MmAccessFault->MiDispatchFault->IoPageRead->IopPageReadInternal->IopfCallDriver ...


即在处理Write时有可能会由Cache管理器发起READ,不知道文件系统怎么处理这部分操作,我大致看了FastFat,没看到对这部分的特殊处理???
www.xDrv.com
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
地板#
发布于:2008-01-29 21:02
"直接将IRP_MJ_XX 转成ZwXXFile, 这样操作简单", This makes things more complicate than simpler.

"即在处理Write时有可能会由Cache管理器发起READ,不知道文件系统怎么处理这部分操作": They are normal paging READs.
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-02-01 12:26
“发现在写过程这个句柄上中多了一个IRP_MJ_READ操作,导致FileObject的curoffset指向了文件末尾,在写的时候就从末尾开始写全部内容,后面又紧跟一个EndofFile截断文件”

从你这个描述 好像是你写的时候导致了cache的重入调用read,而且看你这个offset发生了改变,说明应该是同步的fileobject,但是我想你不应该直接使用fileobject里面的offset吧,应该是从io_stack_location里面取得write的offset和length的吧??
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-02-01 12:29
还有就是如果你把文件以writethrough的方式创建或者打开的话,再write 应该不会出现这样的问题
游客

返回顶部