Chinaluo_007
驱动牛犊
驱动牛犊
  • 注册日期2009-04-22
  • 最后登录2010-04-13
  • 粉丝1
  • 关注1
  • 积分40分
  • 威望361点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1973回复:2

如何快速清掉缓存?

楼主#
更多 发布于:2009-05-15 09:25
在加载文件过滤驱动前,如何快速清掉被挂载磁盘上所有文件的缓存?
guaiguaiguan
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2011-01-12
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望556点
  • 贡献值0点
  • 好评度490点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-05-15 10:03
清除缓存的代码在本论坛可以找到,为了你方面,我把本坛高人提供的代码给你转帖一遍。由于对缓存机制 不太清除,对可执行文件映像和内存映像文件不太理解,使用这些代码困难重重。楼主能否给我介绍一下你那个内存映射文件是怎么搞定的?在文件过滤驱动中我怎么才能拦截到和内存映射文件相关的所谓pageio操作?
void ManageFileCache(PFILE_OBJECT pFileObject, BOOLEAN bClearOrFlush)
{
   PFSRTL_COMMON_FCB_HEADER pFcb;
   LARGE_INTEGER liInterval;
   BOOLEAN bNeedReleaseResource = FALSE;
   BOOLEAN bNeedReleasePagingIoResource = FALSE;
   KIRQL irql;

   pFcb = (PFSRTL_COMMON_FCB_HEADER)pFileObject->FsContext;
   if(pFcb == NULL)
   {
       return;
   }

   irql = KeGetCurrentIrql();
   if (irql >= DISPATCH_LEVEL)
   {
       return;
   }

   liInterval.QuadPart = -1 * (LONGLONG)50;

   while (TRUE)
   {
       BOOLEAN bBreak = TRUE;
       BOOLEAN bLockedResource = FALSE;
       BOOLEAN bLockedPagingIoResource = FALSE;
       bNeedReleaseResource = FALSE;
       bNeedReleasePagingIoResource = FALSE;

       if (pFcb->PagingIoResource)
       {
           bLockedPagingIoResource = ExIsResourceAcquiredExclusiveLite(pFcb->PagingIoResource);
       }

       if (pFcb->Resource)
       {
           bLockedResource = TRUE;
           if (ExIsResourceAcquiredExclusiveLite(pFcb->Resource) == FALSE)
           {
               bNeedReleaseResource = TRUE;
               if (bLockedPagingIoResource)
               {
                   if (ExAcquireResourceExclusiveLite(pFcb->Resource, FALSE) == FALSE)
                   {
                       bBreak = FALSE;
                       bNeedReleaseResource = FALSE;
                       bLockedResource = FALSE;
                   }
               }
               else
               {
                   ExAcquireResourceExclusiveLite(pFcb->Resource, TRUE);
               }
           }
       }
  
       //if (bBreak)
       if (bLockedPagingIoResource == FALSE)
       {
           if (pFcb->PagingIoResource)
           {
               bLockedPagingIoResource = TRUE;
               bNeedReleasePagingIoResource = TRUE;
               if (bLockedResource)
               {
                   if (ExAcquireResourceExclusiveLite(pFcb->PagingIoResource, FALSE) == FALSE)
                   {
                       bBreak = FALSE;
                       bLockedPagingIoResource = FALSE;
                       bNeedReleasePagingIoResource = FALSE;
                   }
               }
               else
               {
                   ExAcquireResourceExclusiveLite(pFcb->PagingIoResource, TRUE);
               }
           }
       }

       if (bBreak)
       {
           break;
       }
      
       if (bNeedReleasePagingIoResource)
       {
           ExReleaseResourceLite(pFcb->PagingIoResource);
       }
       if (bNeedReleaseResource)
       {
           ExReleaseResourceLite(pFcb->Resource);
       }

       if (irql == PASSIVE_LEVEL)
       {
           KeDelayExecutionThread(KernelMode, FALSE, &liInterval);
       }
       else
       {
           KEVENT waitEvent;
           KeInitializeEvent(&waitEvent, NotificationEvent, FALSE);
           KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, &liInterval);
       }
   }

   //加锁完毕
   if (pFileObject->SectionObjectPointer)
   {
       if (bClearOrFlush == FALSE)
       {
           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 (bNeedReleasePagingIoResource)
   {
       ExReleaseResourceLite(pFcb->PagingIoResource);
   }
   if (bNeedReleaseResource)
   {
       ExReleaseResourceLite(pFcb->Resource);
   }
}
lzh_zhb
驱动牛犊
驱动牛犊
  • 注册日期2010-03-12
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分38分
  • 威望381点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-03-23 11:49
游客

返回顶部