ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
阅读:2028回复:15

磁盘读写缓冲问题

楼主#
更多 发布于:2007-04-27 09:00
  我修改ramdisk做了个虚拟磁盘(该设备为PCI接口的存储设备,掉电后可保存数据),但在写完文件时(此时

文件复制进度对话已消失),对系统断电,再重启后发现文件并没完全写入,出现文件丢失或损坏.之后跟踪驱

动程序发现,在文件复制进度对话已消失时还在写磁盘,要过一段时间才能完全写入(此时间据文件大小不定,

一般要过5秒以上),应该是文件系统缓冲引起的,请问各位大虾有什么解决办法让文件在文件复制进度对话

框消失就要完全写入磁盘??在虚拟盘驱动层能不能实现??[p:1]
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-27 11:32
这是文件系统控制的,虚拟盘驱动层无法处理。
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-28 11:27
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-04-28 11:43
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
alphapiao
驱动小牛
驱动小牛
  • 注册日期2002-06-21
  • 最后登录2011-05-04
  • 粉丝0
  • 关注0
  • 积分1004分
  • 威望155点
  • 贡献值0点
  • 好评度109点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-04-28 17:33
你想想windows下,向U盘写数据时,都需要点击安全移除才能保证数据完整。。。
我的博客:xpddk.bokee.com
alphapiao
驱动小牛
驱动小牛
  • 注册日期2002-06-21
  • 最后登录2011-05-04
  • 粉丝0
  • 关注0
  • 积分1004分
  • 威望155点
  • 贡献值0点
  • 好评度109点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2007-04-28 17:35
文件关闭并不代表缓冲中数据已经写入磁盘。
我的博客:xpddk.bokee.com
alphapiao
驱动小牛
驱动小牛
  • 注册日期2002-06-21
  • 最后登录2011-05-04
  • 粉丝0
  • 关注0
  • 积分1004分
  • 威望155点
  • 贡献值0点
  • 好评度109点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2007-04-28 17:35
文件关闭不代表缓冲已经写入磁盘。
我的博客:xpddk.bokee.com
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-04-29 12:01
软驱应该不缓冲吧,它怎么实现的
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-04-29 14:07
软驱应该不缓冲吧,它怎么实现的
alphapiao
驱动小牛
驱动小牛
  • 注册日期2002-06-21
  • 最后登录2011-05-04
  • 粉丝0
  • 关注0
  • 积分1004分
  • 威望155点
  • 贡献值0点
  • 好评度109点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2007-04-29 17:36
在文件系统驱动这一层,软驱是作特殊处理的,往软驱写数据,是不缓冲的。
我的博客:xpddk.bokee.com
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-04-29 20:07
有什么方法可以让文件系统把我的虚拟盘当做软驱操作,紧紧将MediaType指定为软驱应该不行吧??
zzzevazzz
驱动小牛
驱动小牛
  • 注册日期2002-12-27
  • 最后登录2020-06-29
  • 粉丝0
  • 关注0
  • 积分1008分
  • 威望242点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2007-04-30 00:02
用ZwFlushBuffersFile强制缓存写进磁盘。
[b][url]http://hi.baidu.com/zzzevazzz[/url][/b]
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-04-30 09:00
引用第4楼alphapiao2007-04-28 19:33发表的“”:
你想想windows下,向U盘写数据时,都需要点击安全移除才能保证数据完整。。。


没有必要。一般做的好的移动设备,在Windows中的Policy都是Optimize for quick removal。只有那种做的烂的设备,因为某些原因,比如一些SCSI没有处理好,才会设置为Optimize for performance,这种设备才会有cache,拔除的时候才需要“安全移除”。还有种情况是你手动更改了Policy。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-05-17 19:19
虚拟盘驱动中IoGetCurrentIrpStackLocation(Irp得到的FileObject无效,FileObject我用IoGetDeviceObjectPointer得到了,但在虚拟盘驱动中调用CcFlushCache时出现Page fault错误,不知什么原因.

我还有个方法是HOOK ZwCreateFile,当操作自己的虚拟盘时强行加上FILE_NO_INTERMEDIATE_BUFFERING,但在虚拟盘中创建文件夹和文件是提示"参数错误",无法创建,但是可以创建文本文挡,只强行加上FILE_WRITE_THROUGH没问题,但好象还是会缓冲.兄台是否知道是什么原因,有没有解决的方法??
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-05-17 20:42
引用第11楼zzzevazzz于2007-04-30 00:02发表的  :
用ZwFlushBuffersFile强制缓存写进磁盘。


在驱动中用声明:
NTSYSAPI
NTSTATUS
NTAPI
ZwFlushBuffersFile(

IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock );


编译时出错:error LNK2001: unresolved external symbol __imp__ZwFlushBuffersFile@8

该如何使用??
zzzevazzz
驱动小牛
驱动小牛
  • 注册日期2002-12-27
  • 最后登录2020-06-29
  • 粉丝0
  • 关注0
  • 积分1008分
  • 威望242点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2007-05-18 11:44
extern "C"
NTSYSAPI
NTSTATUS
NTAPI
ZwFlushBuffersFile( ...
[b][url]http://hi.baidu.com/zzzevazzz[/url][/b]
游客

返回顶部