阅读:4358回复:21
磁盘读写缓冲问题
我修改ramdisk做了个虚拟磁盘(该设备为PCI接口的存储设备,掉电后可保存数据),但在写完文件时(此时
文件复制进度对话已消失),对系统断电,再重启后发现文件并没完全写入,出现文件丢失或损坏.之后跟踪驱 动程序发现,在文件复制进度对话已消失时还在写磁盘,要过一段时间才能完全写入(此时间据文件大小不定, 一般要过5秒以上),应该是文件系统缓冲引起的,请问各位大虾有什么解决办法让文件在文件复制进度对话 框消失就要完全写入磁盘??在虚拟盘驱动层能不能实现?? |
|
最新喜欢:looksa... |
沙发#
发布于:2007-06-07 14:36
VOID
RamDiskCleanUp( IN PDEVICE_OBJECT DeviceObject ) /*++ Routine Description: This routine does the required cleaning like deleting the symbolic link releasjing the memory etc. Arguments: DeviceObject - Supplies a pointer to the device object that represents the device whose capacity is to be read. Return Value: None. --*/ { PDEVICE_EXTENSION devExt = DeviceObject->DeviceExtension; PAGED_CODE(); DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_VERBOSE, ("RamDiskCleanUp\n" ) ); if ( devExt->Flags & FLAG_LINK_CREATED ) { IoDeleteSymbolicLink( &devExt->SymbolicLink ); } if ( devExt->SymbolicLink.Buffer ) { ExFreePool( devExt->SymbolicLink.Buffer ); } if ( devExt->DiskRegInfo.DriveLetter.Buffer ) { ExFreePool( devExt->DiskRegInfo.DriveLetter.Buffer ); } if ( devExt->DiskImage ) { ExFreePool( devExt->DiskImage ); } if ( devExt->LowerDeviceObject ) { IoDetachDevice( devExt->LowerDeviceObject ); } IoDeleteDevice( DeviceObject ); return; } 楼主,这个行不行, 问一下,RamDisk能否改变成大缓存驱动,减少磁盘读写次数,提高pc性能? 就是当应用层读大文件时,我先从我的RamDisk中调数据,如果没有对应的文件或数据存在,则 从硬盘中读2Mb到我的内存虚拟磁盘中并缓存起来.否则我直接从内存中取数据,请问是否可行? |
|
板凳#
发布于:2007-06-04 21:26
flush 在一个文件已经被映射到进程的地址空间(而且还是以image方式映射的),这个时候是不能调用的! 再说你的驱动也没有办法调用flush,那是在文件系统上面调用的.
|
|
地板#
发布于:2007-05-18 09:39
引用第18楼looksail于2007-05-18 08:31发表的 : 但是我的目的就是要断电保护(文件复制进度对话消失后断电),好象还有个函数ZwFlushBuffersFile ,但自己声明 NTSYSAPI NTSTATUS NTAPI ZwFlushBuffersFile( IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock ); 编译时出错:error LNK2001: unresolved external symbol __imp__ZwFlushBuffersFile@8 怎么才能用这个函数?? 实在不行的话就只有在应用层做个定时刷新(FlushFileBuffers)程序了!但盘符是动态分配的,不是很好处理,多个设备时,生成的每个磁盘都得刷新,占资源 |
|
地下室#
发布于:2007-05-18 08:31
建议测试一下Explorer在写完文件时(此时文件复制进度对话已消失),对系统断电,再重启后看文件是否正常
如果Explorer也是这样,我个人认为没必要管这个问题 另:FILE_NO_INTERMEDIATE_BUFFERING是要求512对齐的 |
|
|
5楼#
发布于:2007-05-17 19:18
虚拟盘驱动中IoGetCurrentIrpStackLocation(Irp得到的FileObject无效,FileObject我用IoGetDeviceObjectPointer得到了,但在虚拟盘驱动中调用CcFlushCache时出现Page fault错误,不知什么原因.
我还有个方法是HOOK ZwCreateFile,当操作自己的虚拟盘时强行加上FILE_NO_INTERMEDIATE_BUFFERING,但在虚拟盘中创建文件夹和文件是提示"参数错误",无法创建,但是可以创建文本文挡,只强行加上FILE_WRITE_THROUGH没问题,但好象还是会缓冲.兄台是否知道是什么原因,有没有解决的方法?? |
|
6楼#
发布于:2007-05-05 23:36
lz...你一定不懂得怎样彻底刷新缓存,在FSFD的IRP_MJ_CLEANUP例程中
|
|
7楼#
发布于:2007-04-29 20:17
如果软驱不缓冲的话,有什么方法让文件系统把我的虚拟盘当软区一样不缓冲写入,仅仅将MediaType指定为软驱应该不行吧??
|
|
8楼#
发布于:2007-04-29 15:24
引用第12楼tooflat于2007-04-29 13:09发表的“”: 能不能在详细一点? |
|
9楼#
发布于:2007-04-29 14:08
软驱应该不缓冲吧,要不拿出软盘文件就丢了,它怎么实现?
|
|
10楼#
发布于:2007-04-29 13:09
引用第6楼xx_qiang于2007-04-27 16:07发表的“”: flush 根目录 |
|
11楼#
发布于:2007-04-29 12:04
软驱应该不缓冲吧,要不拿出软盘文件就丢了,它怎么实现?
|
|
12楼#
发布于:2007-04-28 13:42
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
|
|
13楼#
发布于:2007-04-28 11:40
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
|
|
14楼#
发布于:2007-04-28 11:19
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
|
|
15楼#
发布于:2007-04-27 16:58
试过了IRP_MN_GET_CAPABILITES和IOCTL_STORAGE_GET_HOTPLUG_INFO,也还是没什么变化
|
|
16楼#
发布于:2007-04-27 16:07
问一句,在ntfs格式下,$mft文件中的常驻内存部分在不是卸载磁盘的时候有办法刷新么?
|
|
17楼#
发布于:2007-04-27 15:54
引用第4楼rayyang2000于2007-04-27 11:59发表的“”: 貌似2k不支持 |
|
18楼#
发布于:2007-04-27 11:59
Try:
IRP_MJ_PNP/IRP_MN_QUERY_CAPABILITIES/DEVICE_CAPABILITIES::EjectSupported/Removable/SurpriseRemovalOK IOCTL_STORAGE_GET_HOTPLUG_INFO |
|
|
19楼#
发布于:2007-04-27 11:34
写个文件系统过滤驱动,在打开虚拟设备上的文件的时候强行加上WRITE_THROUGH标志。
|
|
上一页
下一页