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

磁盘读写缓冲问题

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

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

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

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

框消失就要完全写入磁盘??在虚拟盘驱动层能不能实现??

最新喜欢:

looksaillooksa...
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2007-04-27 10:07
flush一下就可以了
走走看看开源好 Solaris vs Linux
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-27 10:29
多谢兄台回复,但怎么知道文件复制完成?什么时候flush?好象只能在应用层flush,因为只是写了驱动,在驱动层怎么实现??好像实现不了啊,虚拟盘驱动在文件系统与CACHE管理层下
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-04-27 11:34
写个文件系统过滤驱动,在打开虚拟设备上的文件的时候强行加上WRITE_THROUGH标志。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-27 11:59
Try:

IRP_MJ_PNP/IRP_MN_QUERY_CAPABILITIES/DEVICE_CAPABILITIES::EjectSupported/Removable/SurpriseRemovalOK

IOCTL_STORAGE_GET_HOTPLUG_INFO
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-04-27 15:54
引用第4楼rayyang20002007-04-27 11:59发表的“”:
Try:

IRP_MJ_PNP/IRP_MN_QUERY_CAPABILITIES/DEVICE_CAPABILITIES::EjectSupported/Removable/SurpriseRemovalOK

IOCTL_STORAGE_GET_HOTPLUG_INFO



貌似2k不支持
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-04-27 16:07
问一句,在ntfs格式下,$mft文件中的常驻内存部分在不是卸载磁盘的时候有办法刷新么?
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-04-27 16:58
试过了IRP_MN_GET_CAPABILITES和IOCTL_STORAGE_GET_HOTPLUG_INFO,也还是没什么变化
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-04-28 11:19
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-04-28 11:40
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-04-28 13:42
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-04-29 12:04
软驱应该不缓冲吧,要不拿出软盘文件就丢了,它怎么实现?
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-04-29 13:09
引用第6楼xx_qiang2007-04-27 16:07发表的“”:
问一句,在ntfs格式下,$mft文件中的常驻内存部分在不是卸载磁盘的时候有办法刷新么?



flush 根目录
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-04-29 14:08
软驱应该不缓冲吧,要不拿出软盘文件就丢了,它怎么实现?
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2007-04-29 15:24
引用第12楼tooflat2007-04-29 13:09发表的“”:



flush 根目录


能不能在详细一点?
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-04-29 20:17
如果软驱不缓冲的话,有什么方法让文件系统把我的虚拟盘当软区一样不缓冲写入,仅仅将MediaType指定为软驱应该不行吧??
yaolixing
驱动小牛
驱动小牛
  • 注册日期2006-06-27
  • 最后登录2010-07-15
  • 粉丝1
  • 关注0
  • 积分991分
  • 威望135点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-05-05 23:36
lz...你一定不懂得怎样彻底刷新缓存,在FSFD的IRP_MJ_CLEANUP例程中
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-05-17 19:18
虚拟盘驱动中IoGetCurrentIrpStackLocation(Irp得到的FileObject无效,FileObject我用IoGetDeviceObjectPointer得到了,但在虚拟盘驱动中调用CcFlushCache时出现Page fault错误,不知什么原因.

我还有个方法是HOOK ZwCreateFile,当操作自己的虚拟盘时强行加上FILE_NO_INTERMEDIATE_BUFFERING,但在虚拟盘中创建文件夹和文件是提示"参数错误",无法创建,但是可以创建文本文挡,只强行加上FILE_WRITE_THROUGH没问题,但好象还是会缓冲.兄台是否知道是什么原因,有没有解决的方法??
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-05-18 08:31
建议测试一下Explorer在写完文件时(此时文件复制进度对话已消失),对系统断电,再重启后看文件是否正常

如果Explorer也是这样,我个人认为没必要管这个问题

另:FILE_NO_INTERMEDIATE_BUFFERING是要求512对齐的
提问归提问,还是只能靠自己
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-05-18 09:39
引用第18楼looksail于2007-05-18 08:31发表的  :
建议测试一下Explorer在写完文件时(此时文件复制进度对话已消失),对系统断电,再重启后看文件是否正常

如果Explorer也是这样,我个人认为没必要管这个问题

另:FILE_NO_INTERMEDIATE_BUFFERING是要求512对齐的


但是我的目的就是要断电保护(文件复制进度对话消失后断电),好象还有个函数ZwFlushBuffersFile
,但自己声明
NTSYSAPI
NTSTATUS
NTAPI
ZwFlushBuffersFile(

IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock );


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

怎么才能用这个函数??

实在不行的话就只有在应用层做个定时刷新(FlushFileBuffers)程序了!但盘符是动态分配的,不是很好处理,多个设备时,生成的每个磁盘都得刷新,占资源
上一页
游客

返回顶部