CcMapDataForOverwrite

VOID __stdcall CcMapDataForOverwrite(
        _FILE_OBJECT *FileObject,
        _LARGE_INTEGER *FileOffset,
        UINT64 Length,
        VOID **Bcb,
        VOID **Buffer){
  unsigned int v5; 
  _ETHREAD *CurrentThread; 
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  _DWORD *SharedCacheMap; 
  unsigned int v10; 
  VOID **v11; 
  char *v12; 
  unsigned int v13; 
  int v14; 
  unsigned __int64 *Partition; 
  unsigned int v16; 
  VOID *v17; 
  char *v18; 
  _ETHREAD *v19; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT8 ReturnResult; 
  VOID **v23; 

  v23 = Bcb;
  v5 = Length;
  v17 = 0i64;
  v16 = ((unsigned int)Length + 4095i64 + (unsigned __int64)(FileOffset->anonymous_0.LowPart & 0xFFF)) >> 12;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v19 = CurrentThread;
  ReturnResult = 1;
  memset(&LockHandle, 0, sizeof(LockHandle));
  SectionObjectPointer = FileObject->SectionObjectPointer;
  SharedCacheMap = SectionObjectPointer->SharedCacheMap;
  if( (SharedCacheMap[38] & 0x20000) == 0 )
  {
    Partition = (unsigned __int64 *)CcGetPartition((_QWORD *)SectionObjectPointer->SharedCacheMap);
    KeAcquireInStackQueuedSpinLock(Partition + 16, &LockHandle);
    SharedCacheMap[38] |= 0x20000u;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
  }
  v10 = CurrentThread->CacheManagerActive + 4 * CurrentThread->ReadClusterSize;
  v11 = Buffer;
  CcMapDataCommon(FileObject, FileOffset, v5, 1ui64, &v17, Buffer);
  v12 = (char *)*v11;
  v18 = v12;
  v13 = v16;
  while( v13 )
  {
    ReturnResult = 1;
    CurrentThread->CacheManagerActive = 1;
    if( --v13 > CurrentThread->ReadClusterSize )
    {
      v14 = v13;
      if( v13 > 0xF )
        v14 = 15;
      CurrentThread->ReadClusterSize = v14;
    }
    MmCheckCachedPageStates(v12, 1ui64, 5ui64, &ReturnResult);
    if( !ReturnResult )
      MmCheckCachedPageStates(v12, 1ui64, 4ui64, 0i64);
    v12 += 4096;
    v18 = v12;
  }
  CurrentThread->CacheManagerActive = v10 & 3;
  CurrentThread->ReadClusterSize = v10 >> 2;
  __addgsdword(0x8150u, KeGetCurrentThread()[1].Timer.DueTime.HighPart);
  *v23 = v17;
}

Referenced by:

CcPreparePinWrite