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