MmMapViewInSystemCache

INT64 __fastcall MmMapViewInSystemCache(
        VOID *SectionToMap,
        VOID **CapturedBase,
        LARGE_INTEGER *SectionOffset,
        UINT64 *CapturedViewSize){
  _CONTROL_AREA *v8; 
  _CONTROL_AREA *v9; 
  BOOL v10; 
  int v11; 
  __int64 v12; 
  _SUBSECTION *v13; 
  UINT64 v14; 
  _SUBSECTION *v15; 
  INT64 v16; 
  __int64 v17; 
  _WORD *v18; 
  MMPTE *v19; 
  INT64 v20; 
  CHAR v21; 
  __int64 *v22; 
  __int64 v23; 
  UINT64 v24; 
  __int64 v25; 
  __int64 *v26; 
  UINT64 v27; 
  _QWORD *SystemCacheReverseMap; 
  unsigned __int64 v29; 
  unsigned __int64 QuadPart; 
  __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  _MMPTE *PteBase; 
  UINT64 PteLink; 
  int v37[8]; 
  UINT64 PteOffset; 
  _QWORD *v39; 
  VOID **v40; 
  LARGE_INTEGER *v41; 
  _SUBSECTION *v42; 
  INT64 result; 
  int v44; 
  __int64 v45; 
  v41 = SectionOffset;
  v40 = CapturedBase;
  PteOffset = 0i64;
  memset((INT64)&result, 0i64);
  if( (*((_DWORD *)SectionToMap + 14) & 0x20) != 0 )
    return 3221225608i64;
  v8 = MiSectionControlArea((_SECTION *)SectionToMap);
  v9 = v8;
  v10 = (*(_DWORD *)CapturedViewSize & 0xFFF) != 0;
  v11 = *(_DWORD *)CapturedViewSize >> 12;
  v12 = (unsigned int)(v10 + v11);
  if( !(v10 + v11) )
    KeBugCheckEx(0x1Au, 0x103087ui64, (ULONG_PTR)v8, 0i64, 0i64);
  v13 = MiOffsetToProtos(v8, SectionOffset->QuadPart, &PteOffset);
  v14 = v12 + PteOffset;
  v42 = v13;
  v15 = v13;
  v16 = MiAddViewsForSection((ULONG_PTR)v13, v12 + PteOffset, 5);
  if( (int)v16 < 0 )
  {
    ++dword_140C4F560;
    return v16;
  }
  v17 = *((_WORD *)v9 + 30) & 0x3FF;
  v18 = *(_WORD **)(qword_140C4E388 + 8 * v17);
  if( *CapturedBase )
  {
    PteBase = MmGetPteBase();
    v22 = (__int64 *)((char *)PteBase + (((unsigned __int64)*CapturedBase >> 9) & 0x7FFFFFFFF8i64));
    if( MiGetPteLink(v22[3]) == 2 )
    {
      PteLink = MiGetPteLink(v22[2]);
      if( MiCompareTbFlushTimeStamp(PteLink, 0xFFFFFui64) )
      {
        v44 = 20;
        v45 = 0i64;
        MiInsertTbFlushEntry(
          (INT64)&result,
          (__int64)(((_QWORD)v22 << 25) - ((_QWORD)PteBase << 25)) >> 16,
          64i64,
          0i64);
        MiFlushTbList((__int64)&result);
      }
    }
  }
  else
  {
    v19 = MiObtainSystemCacheView(*(_MI_PARTITION **)(qword_140C4E388 + 8 * v17));
    v22 = (__int64 *)v19;
    if( !v19 )
    {
      ++dword_140C4F560;
      MiRemoveSystemCacheReferences(v15, v14, v20, v21);
      return 3221225495i64;
    }
    *CapturedBase = (VOID *)((__int64)(((_QWORD)v19 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
  }
  *v22 = ZeroPte;
  v22[1] = ZeroPte;
  v22[2] = ZeroPte;
  v22[3] = ZeroPte;
  v23 = *((_QWORD *)v15 + 1);
  v24 = v23 + 8 * PteOffset;
  v25 = *((unsigned int *)v15 + 11);
  v26 = &v22[v12];
  v27 = v23 + 8 * v25;
  SystemCacheReverseMap = (_QWORD *)MiGetSystemCacheReverseMap((UINT64)*v40);
  v29 = (unsigned __int64)(*v18 & 0x3FF) << 6;
  v39 = SystemCacheReverseMap;
  QuadPart = v41->QuadPart;
  SystemCacheReverseMap[2] &= 0xFFFFFFFFFFFFFFFCui64;
  v31 = v12 & 0x3F | (QuadPart >> 2) & 0x3FFFFFFFFFFF0000i64 | v29;
  v32 = (__int64)v42;
  SystemCacheReverseMap[3] = v42;
  SystemCacheReverseMap[4] = v31;
  if( !*((_QWORD *)v9 + 8) )
    SystemCacheReverseMap[3] = v32 | 1;
  for( ; v22 < v26; v24 += 8i64 )
  {
    if( v24 >= v27 )
    {
      v32 = *(_QWORD *)(v32 + 16);
      v24 = *(_QWORD *)(v32 + 8);
      v34 = *(unsigned int *)(v32 + 44);
      SystemCacheReverseMap[3] |= 1ui64;
      v27 = v24 + 8 * v34;
    }
    v33 = (v24 << 16) | 0x400;
    if( qword_140C4DC80 )
    {
      if( (qword_140C4DC80 & v33) != 0 )
        v33 = (v24 << 16) | 0x410;
      else
        v33 |= qword_140C4DC80;
    }
    *v22 = v33;
    SystemCacheReverseMap = v39;
    ++v22;
  }
  _InterlockedOr(v37, 0);
  SystemCacheReverseMap[2] = *v40;
  MiManageSubsectionView(v32, SystemCacheReverseMap, (2 * (unsigned __int8)SystemCacheReverseMap[3]) & 2 | 1u);
  return 0i64;
}

Referenced by:

CcGetVacbMiss