彻底刷新文件系统的缓存

   
彻底刷新文件系统的缓存 [转载]

void PurgeFileSystemBuffers(PFILE_OBJECT FileObject)
{
KeEnterCriticalRegion();
if(ExAcquireResourceExclusiveLite(((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource,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,
                TRUE);
//为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)->Resource );
}
KeLeaveCriticalRegion();
}

 

参考2:

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;
      BOOLEAN bReleaseResource=FALSE;
      BOOLEAN bReleasePagingIoResource=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);
      
      if(!bLockedPagingIoResource)
         bReleasePagingIoResource=TRUE;
      
      if(!bLockedResource)
         bReleaseResource=TRUE;

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



      
//加锁完毕

      if(pFileObject->SectionObjectPointer !=NULL)
         {
            IO_STATUS_BLOCK ioStatus;
          CcFlushCache(pFileObject->SectionObjectPointer,NULL, 0,&ioStatus);
          
          if(pFileObject->SectionObjectPointer->ImageSectionObject !=NULL)
             MmFlushImageSection(pFileObject->SectionObjectPointer, MmFlushForWrite);
//MmFlushForDelete

             
          if(pFileObject->SectionObjectPointer->DataSectionObject !=NULL)
             CcPurgeCacheSection(pFileObject->SectionObjectPointer ,NULL, 0,FALSE);
       }
      
      if(bReleasePagingIoResource)
         {
           ExReleaseResourceLite(pFcb->PagingIoResource);
           bLockedPagingIoResource =FALSE;
      }
      if(bReleaseResource)
      {
        ExReleaseResourceLite(pFcb->Resource);
           bLockedResource=FALSE;
       }

      KeLeaveCriticalRegion();

   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值