MmMapViewInSystemCache

NTSTATUS __stdcall MmMapViewInSystemCache(
        VOID *SectionToMap,
        VOID **CapturedBase,
        _LARGE_INTEGER *SectionOffset,
        UINT64 *CapturedViewSize){
  _CONTROL_AREA *v8; 
  _CONTROL_AREA *v9; 
  _BOOL4 v10; 
  int v11; 
  __int64 v12; 
  _SUBSECTION *v13; 
  UINT64 v14; 
  _SUBSECTION *v15; 
  NTSTATUS result; 
  __int64 v17; 
  _WORD *v18; 
  UINT64 v19; 
  INT64 v20; 
  CHAR v21; 
  UINT64 v22; 
  unsigned __int64 Long; 
  int v24; 
  unsigned __int64 v25; 
  int v26; 
  unsigned __int64 v27; 
  int v28; 
  unsigned __int64 v29; 
  int v30; 
  _MMPTE *SubsectionBase; 
  _MMPTE *v32; 
  __int64 PtesInSubsection; 
  UINT64 v34; 
  _MMPTE *v35; 
  _QWORD *v36; 
  __int64 v37; 
  unsigned __int64 v38; 
  unsigned __int64 QuadPart; 
  __int64 v40; 
  __int64 v41; 
  __int64 v42; 
  int v43; 
  __int64 v44; 
  _MMPTE *PteBase; 
  __int64 v46; 
  UINT64 v47; 
  INT64 v48; 
  INT64 v49; 
  int v50[8]; 
  PVOID BugCheckParameter4; 
  UINT64 PteOffset; 
  _QWORD *v53; 
  VOID **v54; 
  _LARGE_INTEGER *v55; 
  _SUBSECTION *v56; 
  _MI_TB_FLUSH_LIST TbFlushList[48]; 

  v55 = SectionOffset;
  v54 = CapturedBase;
  PteOffset = 0i64;
  memset(TbFlushList, 0i64, 0xB8u);
  if( (*((_DWORD *)SectionToMap + 14) & 0x20) != 0 )
    return -1073741688;
  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, (PVOID)0x103087, v8, 0i64, 0i64);
  v13 = MiOffsetToProtos(v8, SectionOffset->QuadPart, &PteOffset);
  v14 = v12 + PteOffset;
  v56 = v13;
  v15 = v13;
  result = MiAddViewsForSection(v13, v12 + PteOffset, 5ui64);
  if( result < 0 )
  {
    ++*(&stru_140C4DB30 + 1676);
    return result;
  }
  v17 = v9->u1.Flags._bf_0 & 0x3FF;
  v18 = *(_WORD **)(*(&stru_140C4DB30 + 267) + 8 * v17);
  if( *CapturedBase )
  {
    PteBase = MmGetPteBase();
    v22 = (UINT64)PteBase + (((unsigned __int64)*CapturedBase >> 9) & 0x7FFFFFFFF8i64);
    LODWORD(v46) = MiGetPteLink(*(_QWORD *)(v22 + 24));
    if( v46 == 2 )
    {
      LODWORD(v47) = MiGetPteLink(*(_QWORD *)(v22 + 16));
      if( MiCompareTbFlushTimeStamp(v47, 0xFFFFFui64, v48, v49, (UINT64)BugCheckParameter4) )
      {
        TbFlushList[2] = 20;
        *(_QWORD *)&TbFlushList[6] = 0i64;
        MiInsertTbFlushEntry(
          TbFlushList,
          (VOID *)((__int64)((v22 << 25) - ((_QWORD)PteBase << 25)) >> 16),
          0x40ui64,
          0i64);
        MiFlushTbList(TbFlushList);
      }
    }
  }
  else
  {
    v19 = (UINT64)MiObtainSystemCacheView(*(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v17));
    v22 = v19;
    if( !v19 )
    {
      ++*(&stru_140C4DB30 + 1676);
      MiRemoveSystemCacheReferences(v15, v14, v20, v21);
      return -1073741801;
    }
    *CapturedBase = (VOID *)((__int64)((v19 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
  }
  Long = ZeroPte.u.Long;
  LOBYTE(v24) = MiPteInShadowRange(v22);
  if( v24 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
    Long = ZeroPte.u.Long | 0x8000000000000000ui64;
  *(_QWORD *)v22 = Long;
  v25 = ZeroPte.u.Long;
  LOBYTE(v26) = MiPteInShadowRange(v22 + 8);
  if( v26 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
    v25 = ZeroPte.u.Long | 0x8000000000000000ui64;
  *(_QWORD *)(v22 + 8) = v25;
  v27 = ZeroPte.u.Long;
  LOBYTE(v28) = MiPteInShadowRange(v22 + 16);
  if( v28 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
    v27 = ZeroPte.u.Long | 0x8000000000000000ui64;
  *(_QWORD *)(v22 + 16) = v27;
  v29 = ZeroPte.u.Long;
  LOBYTE(v30) = MiPteInShadowRange(v22 + 24);
  if( v30 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
    v29 = ZeroPte.u.Long | 0x8000000000000000ui64;
  *(_QWORD *)(v22 + 24) = v29;
  SubsectionBase = v15->SubsectionBase;
  v32 = &SubsectionBase[PteOffset];
  PtesInSubsection = v15->PtesInSubsection;
  v34 = v22 + 8 * v12;
  v35 = &SubsectionBase[PtesInSubsection];
  LODWORD(v36) = MiGetSystemCacheReverseMap((UINT64)*v54);
  v37 = (__int64)v36;
  v38 = (unsigned __int64)(*v18 & 0x3FF) << 6;
  v53 = v36;
  QuadPart = v55->QuadPart;
  v36[2] &= 0xFFFFFFFFFFFFFFFCui64;
  v40 = v12 & 0x3F | (QuadPart >> 2) & 0x3FFFFFFFFFFF0000i64 | v38;
  v41 = (__int64)v56;
  v36[3] = v56;
  v36[4] = v40;
  if( !v9->FilePointer.Value )
    v36[3] = v41 | 1;
  for( ; v22 < v34; ++v32 )
  {
    if( v32 >= v35 )
    {
      v41 = *(_QWORD *)(v41 + 16);
      v32 = *(_MMPTE **)(v41 + 8);
      v44 = *(unsigned int *)(v41 + 44);
      *(_QWORD *)(v37 + 24) |= 1ui64;
      v35 = &v32[v44];
    }
    v42 = ((_QWORD)v32 << 16) | 0x400i64;
    if( *(&stru_140C4DB30 + 42) )
    {
      if( (*(&stru_140C4DB30 + 42) & v42) != 0 )
        v42 = ((_QWORD)v32 << 16) | 0x410i64;
      else
        v42 |= *(&stru_140C4DB30 + 42);
    }
    LOBYTE(v43) = MiPteInShadowRange(v22);
    if( v43 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v42 & 1) != 0 )
      v42 |= 0x8000000000000000ui64;
    *(_QWORD *)v22 = v42;
    v37 = (__int64)v53;
    v22 += 8i64;
  }
  _InterlockedOr(v50, 0);
  *(_QWORD *)(v37 + 16) = *v54;
  MiManageSubsectionView(v41, v37, (2 * (unsigned __int8)*(_QWORD *)(v37 + 24)) & 2 | 1u);
  return 0;
}

Referenced by:

CcGetVacbMiss