阅读:4836回复:12
彻底刷新内存映射文件的cache
KeEnterCriticalRegion();
if(ExAcquireResourceExclusiveLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource, FALSE)) { if(ExAcquireResourceExclusiveLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->PagingIoResource, FALSE)) { if(FileObject->SectionObjectPointer) { IoSetTopLevelIrp( (PIRP)FSRTL_FSP_TOP_LEVEL_IRP ); CcFlushCache( FileObject->SectionObjectPointer, NULL, 0, NULL ); if(FileObject->SectionObjectPointer->ImageSectionObject) { MmFlushImageSection( FileObject->SectionObjectPointer, MmFlushForWrite//MmFlushForDelete// ) ; } if(FileObject->SectionObjectPointer->DataSectionObject) { CcPurgeCacheSection( FileObject->SectionObjectPointer, NULL, 0, FALSE ); //为TRUE,会强迫所有的FileObject重新初始化Cache } if(FileObject->PrivateCacheMap) { CcUninitializeCacheMap(FileObject, NULL, NULL);; } if(FileObject->SectionObjectPointer->DataSectionObject) { //Interval.QuadPart = DELAY_ONE_MILLISECOND * 500;//500ms //KeDelayExecutionThread(KernelMode, FALSE, &Interval); MmForceSectionClosed( FileObject->SectionObjectPointer, TRUE//改为TRUE,彻底刷新缓存!!! ); } IoSetTopLevelIrp(NULL); } ExReleaseResourceLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->PagingIoResource ); } ExReleaseResourceLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource ); } KeLeaveCriticalRegion(); 但是这样又容易毁坏数据。抛砖引玉,还请高手出手 |
|
沙发#
发布于:2007-07-03 12:31
yaolixing老大,试过吗???
|
|
板凳#
发布于:2007-07-03 17:04
这个我试过,确实有用,不过我的应用中只有读,没有写,所以不存在破坏数据问题
所以这个方法对我来说正合适 |
|
地板#
发布于:2007-07-04 01:05
楼上的,你是将代码加在close中吗??
我在close中加了,debug出现蓝屏 |
|
地下室#
发布于:2007-07-04 01:07
内存映射文件的清除,是否能解决copy文件出现明文的问题
|
|
5楼#
发布于:2007-07-04 12:14
顶上去
|
|
6楼#
发布于:2007-07-05 00:06
还有谁做过这方面的测试啊???
顶 |
|
7楼#
发布于:2007-10-03 20:12
不会造成数据损坏。这段代码要放在cleanup()中.在close()中FileObject已经死去,你再调用它的指针指来指去,不蓝屏才怪
|
|
8楼#
发布于:2007-10-04 21:39
因为每个文件的cache只有一份,所以,明文是必然的!
即使你清掉下次读的时候又会被cache |
|
|
9楼#
发布于:2007-10-09 10:11
做了几个月,越到后来越觉得是在做一件出力不讨好的事!郁闷!
|
|
10楼#
发布于:2008-08-07 11:16
清缓存还是在create里清比较安全。只有被控制进程去清就可以
|
|
|
11楼#
发布于:2008-08-13 11:43
下面的访问序列应该是可以处理的
CreateFile CreateFileMapping MapViewOfFile memcpy UnmapViewOfFile CloseHandle(Map) CloseHandle(File) 这时候在关闭文件的时候,清内存映射有可能是成功的。 但也需要考虑多个进程引用同一个内存映射的问题。 但是如果出现这样的访问序列,该怎么处理? CreateFile CreateFileMapping MapViewOfFile CloseHandle(File) memcpy UnmapViewOfFile CloseHandle(Map) 这时候在关闭文件的时候,清内存映射是绝对清不掉的。 是否需要在关闭进程的时候再清一次? 或者采用HOOK? |
|
|
12楼#
发布于:2009-06-05 16:14
http://bbs.driverdevelop.com/htm_data/39/0703/100266.html
请问这短清缓存的代码在swapBuffers中那个函数中使用呀? |
|