dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
阅读:3796回复:9

[死锁无奈]谁能共享一下清缓存代码?

楼主#
更多 发布于:2007-04-26 22:25
  rt,开源万岁!
stevphen
驱动牛犊
驱动牛犊
  • 注册日期2003-02-09
  • 最后登录2010-12-03
  • 粉丝0
  • 关注0
  • 积分573分
  • 威望87点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-28 09:31
先把你的源开出来
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-04-28 10:28
我碰到的问题是想让ntfs磁盘$mft文件中常驻内存部分刷新或者丢弃,然后重读磁盘 的问题,大家是什么问题?至于磁盘刷新清缓存,csdn上有个应用层的解决方法,我也不知道好不好用,大家侧着看
    CString strTemp;
    HANDLE hFile = CreateFile("\\\\.\\E:",
        GENERIC_READ| GENERIC_WRITE,
        FILE_SHARE_READ,
        0, OPEN_EXISTING, 0, 0);
    if (hFile == INVALID_HANDLE_VALUE || hFile == NULL)
    {
        strTemp.Format("无法打开磁盘: %lu", GetLastError());
        MessageBox(strTemp);
        return;
    }
    if (!FlushFileBuffers(hFile))
    {
        strTemp.Format("刷新磁盘缓冲失败:%lu", GetLastError());
        MessageBox(strTemp);
        CloseHandle(hFile);
        return;
    }
    CloseHandle(hFile);
至于驱动层,需要调用cc函数,也贴一小段代码,
case IRP_MJ_CLOSE:

if (FileObject && FileObject->SectionObjectPointer)
{
CcFlushCache(FileObject->SectionObjectPointer, NULL,0, &IoStatus);

if (IoStatus.Status == STATUS_SUCCESS)
retval = CcPurgeCacheSection(
FileObject->SectionObjectPointer,
NULL,
0,
TRUE
);
}
break;
这个只是在文件关闭的时候,将该文件的内存中相关内容刷新。我一直怀疑系统调用的是cccopywrite函数,也就是说虽然刷新到了磁盘,但内存中仍然有数据,导致下次访问该文件仍然不从硬盘上读,不知道这么想对不对,请大牛们指教
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
地板#
发布于:2007-04-28 13:06
那当然了,CcFlushCache只是把CACHE数据回写到磁盘上,并不清除CACHE数据。
人总在矛盾中徘徊。。。
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2007-04-28 13:53
有办法清除cache 中的内容么?比如像chkdsk那样,添加/f参数后就可以将磁盘卸载,检查$mft文件的一致性和正确性,编程实现的话不卸载磁盘有别的办法么??
dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-04-28 14:07
我的源会蓝屏:
    void ManageFileCache(PFILE_OBJECT pFileObject)
    {
    
       PFSRTL_COMMON_FCB_HEADER pFcb;
       LARGE_INTEGER liInterval;
       //BOOLEAN bNeedReleaseResource = FALSE;
       //BOOLEAN bNeedReleasePagingIoResource = FALSE;
       KIRQL irql;
       BOOLEAN bLockedResource=FALSE;
       BOOLEAN bLockedPagingIoResource=FALSE;

      
      
       pFcb = (PFSRTL_COMMON_FCB_HEADER)pFileObject->FsContext;
       if(pFcb == NULL)
       {
           return;
       }
    
       irql = KeGetCurrentIrql();
       if (irql >= DISPATCH_LEVEL)
       {
           return;
       }
       liInterval.QuadPart = -1 * (LONGLONG)50;

       KeEnterCriticalRegion();
       bLockedPagingIoResource = ExIsResourceAcquiredExclusiveLite(pFcb->PagingIoResource);
       bLockedResource=ExIsResourceAcquiredExclusiveLite(pFcb->Resource);
       while(!bLockedPagingIoResource || !bLockedResource)
       {
           if(!bLockedPagingIoResource)
           {
               if(ExAcquireResourceExclusiveLite(pFcb->PagingIoResource, FALSE)==TRUE)
                bLockedPagingIoResource=TRUE;
            else
                goto clear;
                
           }
        if(!bLockedResource)
           {
               if(ExAcquireResourceExclusiveLite(pFcb->Resource, FALSE)==TRUE)
                bLockedResource=TRUE;
            else
                goto clear;
                
           }
        if(bLockedPagingIoResource && bLockedResource)
            break;
        clear:
            if (bLockedPagingIoResource)
            {
                ExReleaseResourceLite(pFcb->PagingIoResource);
                bLockedPagingIoResource = FALSE;    
            }
            if (bLockedResource)
            {
                ExReleaseResourceLite(pFcb->Resource);
                bLockedResource=FALSE;
            }
            
            if (irql == PASSIVE_LEVEL)
            {
                KeDelayExecutionThread(KernelMode, FALSE, &liInterval);
            }
            else
            {
               KEVENT waitEvent;
               KeInitializeEvent(&waitEvent, NotificationEvent, FALSE);
               KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, &liInterval);
               }
            
        }

       //加锁完毕
       if (pFileObject->SectionObjectPointer)
           {
              IO_STATUS_BLOCK ioStatus;
           CcFlushCache(pFileObject->SectionObjectPointer, NULL, 0, &ioStatus);
           if (pFileObject->SectionObjectPointer->ImageSectionObject)
               {
                   MmFlushImageSection(pFileObject->SectionObjectPointer, MmFlushForWrite);//MmFlushForDelete
               }
           CcPurgeCacheSection(pFileObject->SectionObjectPointer, NULL, 0, FALSE);
        }
      
    
       if (bLockedPagingIoResource)
           {
            ExReleaseResourceLite(pFcb->PagingIoResource);
            bLockedPagingIoResource = FALSE;    
        }
       if (bLockedResource)
        {
            ExReleaseResourceLite(pFcb->Resource);
            bLockedResource=FALSE;
        }

       KeLeaveCriticalRegion();
      
    }
lly-pp
驱动牛犊
驱动牛犊
  • 注册日期2008-09-10
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2009-02-05 11:15
引用第2楼xx_qiang于2007-04-28 10:28发表的  :
我碰到的问题是想让ntfs磁盘$mft文件中常驻内存部分刷新或者丢弃,然后重读磁盘 的问题,大家是什么问题?至于磁盘刷新清缓存,csdn上有个应用层的解决方法,我也不知道好不好用,大家侧着看
    CString strTemp;
    HANDLE hFile = CreateFile("\\\\.\\E:",
        GENERIC_READ| GENERIC_WRITE,
        FILE_SHARE_READ,
.......


我也有同样的问题,你解决了么
wanglq_2007
驱动牛犊
驱动牛犊
  • 注册日期2007-04-25
  • 最后登录2010-01-11
  • 粉丝1
  • 关注0
  • 积分16分
  • 威望122点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2009-02-11 14:21
void NewEmptyCache(PCFLT_RELATED_OBJECTS FltObjects)
{
    PFSRTL_COMMON_FCB_HEADER FcbHeader;
  
//  DbgPrint (( "  IRP_MJ_CLEANUP  -->  ENCFILE \n"));
  FcbHeader = (PFSRTL_COMMON_FCB_HEADER)FltObjects->FileObject->FsContext;
                          
  if ( FcbHeader != NULL && FcbHeader->PagingIoResource != NULL)
  {
     ExAcquireResourceExclusive (FcbHeader->PagingIoResource, TRUE);
//     DbgPrint (( "ExAcquireResourceExclusive \n"));
  }

  if (FltObjects->FileObject->SectionObjectPointer != NULL)
  {
     CcFlushCache(FltObjects->FileObject->SectionObjectPointer,0,0, NULL);
     CcPurgeCacheSection(FltObjects->FileObject->SectionObjectPointer,0,0, FALSE);
 //    DbgPrint (( "CcFlushCache & CcPurgeCacheSection \n"));
  }  
  if(FltObjects->FileObject->PrivateCacheMap)
  {
     CcUninitializeCacheMap(FltObjects->FileObject, NULL, NULL);;  
  }  
  
  if ( FcbHeader != NULL && FcbHeader->PagingIoResource != NULL)
  {
     ExReleaseResource (FcbHeader->PagingIoResource);
//     DbgPrint (( "ExReleaseResource \n"));
  }    
 
}
evc11
驱动牛犊
驱动牛犊
  • 注册日期2008-11-21
  • 最后登录2009-03-08
  • 粉丝1
  • 关注0
  • 积分10分
  • 威望64点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2009-02-24 23:47
清了缓存,非加密进程不是跟加密进程一样,都看到明文或者都看到密文了?
方法不对,只有双FSB或者另外一种方法,才能解决同时打开文件的问题。至于另外一种方法是什么,我不说
z8726
驱动牛犊
驱动牛犊
  • 注册日期2010-06-30
  • 最后登录2020-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2011-02-13 17:00
引用第8楼evc11于2009-02-24 23:47发表的  :
清了缓存,非加密进程不是跟加密进程一样,都看到明文或者都看到密文了?
方法不对,只有双FSB或者另外一种方法,才能解决同时打开文件的问题。至于另外一种方法是什么,我不说

有什么好的方法说出来大家分享啦
游客

返回顶部