MiUpdateLargePageSectionPfns
INT64 __fastcall MiUpdateLargePageSectionPfns(INT64 a1, INT64 a2, INT64 a3){
char v3;
unsigned __int64 v4;
INT64 v6;
UINT64 ValidPte;
INT64 v8;
int PfnPageSizeIndex;
unsigned __int64 v10;
unsigned __int64 v11;
INT64 result;
unsigned __int64 v13;
INT64 v14;
UINT8 v15;
__int64 v16;
unsigned __int64 v17;
char v18;
INT64 v19;
INT64 v20;
unsigned __int64 v21;
v20 = a2;
v3 = a3;
v4 = a2;
LODWORD(a3) = a3 | 0x80000000;
v6 = (a1 - (__int64)MmGetPfnDb()) / 48;
ValidPte = MiMakeValidPte(0i64, v6, a3);
v8 = MiSwizzleInvalidPte(32i64 * (v3 & 0x1F));
PfnPageSizeIndex = MiGetPfnPageSizeIndex(a1);
v10 = -1i64;
v21 = v4 + 8 * MiLargePageSizes[PfnPageSizeIndex];
v11 = v21;
result = MiConvertEntireLargePageToSmall((KQUEUE *)a1, PfnPageSizeIndex, 0, (LARGE_INTEGER *)1, 0i64, 0i64);
v13 = v4;
if( v4 < v11 )
{
v14 = a1 + 24;
do
{
if( v10 == -1i64 || (v13 & 0xFFF) == 0 )
{
v19 = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v4 >> 9) & 0x7FFFFFFFF8i64));
v10 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v19) >> 12) & 0xFFFFFFFFFi64;
}
ValidPte ^= (ValidPte ^ (v6 << 12)) & 0xFFFFFFFFF000i64;
*(_QWORD *)v13 = ValidPte;
v15 = MiLockPageInline(v14 - 24);
MiSetPfnTbFlushStamp((_MMPFN *)(v14 - 24), 0i64, 1ui64);
MiSetPfnNodeBlinkHigh((_MMPFN *)(v14 - 24), 0i64, 1ui64);
v16 = *(_QWORD *)(v14 + 16);
v17 = *(_QWORD *)v14 & 0xC000000000000001ui64;
*(_QWORD *)(v14 - 24) = 0i64;
*(_QWORD *)v14 = v17 | 1;
*(_WORD *)(v14 + 8) = 2;
*(_QWORD *)(v14 - 8) = v8;
*(_QWORD *)(v14 - 16) = v13;
v18 = *(_BYTE *)(v14 + 10);
*(_QWORD *)(v14 + 16) = v10 & 0xFFFFFFFFFi64 | v16 & 0xFFFFFFF000000000ui64 | 0x8000000000000000ui64;
*(_BYTE *)(v14 + 10) = v18 & 0xF8 | 6;
MiUnlockPage((_MMPFN *)(v14 - 24), v15);
v4 = v20;
++v6;
v14 += 48i64;
v13 += 8i64;
}
while( v13 < v21 );
}
return result;
}Referenced by:
MiCreatePagingFileMap