wht0395
驱动小牛
驱动小牛
  • 注册日期2006-07-06
  • 最后登录2009-06-10
  • 粉丝0
  • 关注0
  • 积分583分
  • 威望135点
  • 贡献值0点
  • 好评度122点
  • 原创分0分
  • 专家分0分
阅读:2129回复:4

[恢复]放段代码,如何去修改缓存中的FileSize。送给有需要的兄弟

楼主#
更多 发布于:2007-01-03 14:24
  原贴作者:bluacat


放段代码,如何去修改缓存中的FileSize:

VOID
   CheatCMFileSize(IN PFILE_OBJECT FileObject,
                   IN PIRP Irp,                    
                   IN PLARGE_INTEGER NewFileSize)
{
   PFSRTL_COMMON_FCB_HEADER fcbHeader = NULL;    
   BOOLEAN IoPagingRelease = FALSE,    MainResRelease = FALSE;
      
   if (!NewFileSize)
   {
       return;
   }
  
   //
   // IRP_PAGE_IO Can not Mod fcbHeader VailDataLength ***** Most******
   //
   if (FlagOn(Irp->Flags,IRP_PAGING_IO))
   {
       KdPrint(("CheatCM:PageIO fo:%p\n",FileObject->FsContext));        
       return;
   }

   fcbHeader = (PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext;
   if (!fcbHeader)
   {
       return;
   }

   if (FileObject->SectionObjectPointer)
   {
       //
       // Before we actually truncate, check to see if the purge
       // is going to fail.
       //
       if (!MmCanFileBeTruncated(FileObject->SectionObjectPointer,NewFileSize))
       {
           KdPrint(("CheatCM:MmCanNot fo:%p\n",FileObject->FsContext));
           return;
       }

       if (ExAcquireResourceExclusive(fcbHeader->Resource,TRUE))
       {
           MainResRelease = TRUE;
       }

       if (MainResRelease)
       {

ACQ_PAGE_RES:
           if (ExAcquireResourceExclusive( fcbHeader->PagingIoResource , TRUE ))
           {
               IoPagingRelease = TRUE;
           }else{
               LARGE_INTEGER SleepTime;                
               SleepTime.QuadPart = DELAY_ONE_MILLISECOND * 50;//50ms
               KeDelayExecutionThread(KernelMode, FALSE, &SleepTime);
               goto ACQ_PAGE_RES;
           }
       }
   }
  
   if (IoPagingRelease && MainResRelease)
   {
       IoSetTopLevelIrp( (PIRP)FSRTL_FSP_TOP_LEVEL_IRP );
      
       //
       // All Lock Acquired Success Update CM File Sizes
       //
       if (NewFileSize)
       {
           PCC_FILE_SIZES ccSizes = NULL;

           ccSizes = ExAllocatePoolWithTag(NonPagedPool,sizeof(CC_FILE_SIZES),POOL_TEMP_TAG);

           if (ccSizes)
           {
               ccSizes->AllocationSize = fcbHeader->AllocationSize;
               ccSizes->ValidDataLength.QuadPart = NewFileSize->QuadPart;
               ccSizes->FileSize.QuadPart = NewFileSize->QuadPart;
              
               CcSetFileSizes(FileObject,ccSizes);
               SetFlag(FileObject->Flags,FO_FILE_SIZE_CHANGED);
               SetHashEntryAclStatus(FileObject,ACL_CHEATE_CM_SIZE_COMPELETE,FALSE);

               ExFreePoolWithTag(ccSizes,POOL_TEMP_TAG);

           }
       }
   }    
  

//CLEANUP:
   if (IoPagingRelease) ExReleaseResource(fcbHeader->PagingIoResource);
   if (MainResRelease)    ExReleaseResource(fcbHeader->Resource);
   IoSetTopLevelIrp(NULL);

   return;
}
什么不懂的学生
hua1998
驱动牛犊
驱动牛犊
  • 注册日期2006-04-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分175分
  • 威望59点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-01-04 10:53
SetHashEntryAclStatus是干什么用的?
haifong2
驱动牛犊
驱动牛犊
  • 注册日期2006-05-15
  • 最后登录2014-10-16
  • 粉丝0
  • 关注0
  • 积分890分
  • 威望114点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-01-11 11:35
SetHashEntryAclStatus 这个函数是不是楼主定义的,我在DDK在找不到,如果是的话,这个函数的作用是什么?
请前辈们多多指教,在此先谢谢你们了!!!
redsuki
驱动牛犊
驱动牛犊
  • 注册日期2006-03-03
  • 最后登录2007-04-15
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-01-12 21:23
路过 顶下
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
地下室#
发布于:2007-03-20 09:53
死锁!
人总在矛盾中徘徊。。。
游客

返回顶部