MiDemoteValidLargePageOneLevel
INT64 __fastcall MiDemoteValidLargePageOneLevel(UINT64 Va){
unsigned int v2;
UINT64 v3;
_MMPTE *PteBase;
unsigned __int64 v5;
__int64 v6;
__int16 v7;
unsigned __int64 v8;
void *v9;
__int64 v10;
INT64 v12;
__int64 v13;
unsigned __int64 v14;
INT64 v15;
INT64 v16;
void *v17;
INT64 *v18;
INT64 v19;
unsigned int v20;
unsigned int v21;
INT64 v22;
INT64 v23;
INT64 v24;
UINT64 v25;
INT64 v26;
INT64 v27;
char *v28;
UINT64 v29;
__int64 v30;
__int64 v31;
INT64 i;
INT64 v33;
INT64 v34;
UINT64 BitsMustBeChanged;
UINT8 OldIrql[8];
INT64 ValidPte;
INT64 v38;
unsigned int v39;
int v40;
UINT64 SpinCount;
UINT64 PageFrameIndex;
INT64 v43;
PVOID VirtualAddress;
INT64 a2;
UINT64 ContainingPageFrame;
__int64 v47;
INT64 v48[7];
int v49;
INT64 v50[4];
INT64 result;
int v52;
__int64 v53;
v38 = 0i64;
OldIrql[0] = 0;
memset((INT64)&result, 0i64);
memset((INT64)v48, 0i64);
v52 = 20;
v53 = 0i64;
v39 = MI_IS_PHYSICAL_ADDRESS((PVOID)Va);
v2 = v39;
v3 = (UINT64)MmGetPdeBase() + ((Va >> 18) & 0x3FFFFFF8);
PteBase = MmGetPteBase();
v5 = 0x200000i64;
if( v39 != 1 )
{
v6 = v39 - 1;
do
{
v3 = (UINT64)PteBase + ((v3 >> 9) & 0x7FFFFFFFF8i64);
v5 <<= 9;
--v6;
}
while( v6 );
}
v43 = MI_READ_PTE_LOCK_FREE(v3);
v7 = v43;
v8 = MI_READ_PTE_LOCK_FREE((INT64)&v43);
v49 = 4;
v9 = (void *)((v8 >> 12) & 0xFFFFFFFFFi64);
v48[4] = (INT64)&MiSystemPartition;
a2 = (INT64)v9;
LODWORD(v10) = MiSearchNumaNodeTable(v9);
MiInitializeColorBase(Va, (unsigned int)(*(_DWORD *)(v10 + 8) + 1), (INT64)v50);
if( (int)MiGetPageTablePages((__int64)v48, 1ui64, &v38) < 0 )
return 0i64;
v12 = v38;
*(_QWORD *)v38 = 0i64;
v13 = (v12 - (__int64)MmGetPfnDb()) / 48;
PageFrameIndex = v13;
ValidPte = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v3 >> 9) & 0x7FFFFFFFF8i64));
v14 = MI_READ_PTE_LOCK_FREE((INT64)&ValidPte);
v15 = 2147483652i64;
ContainingPageFrame = (v14 >> 12) & 0xFFFFFFFFFi64;
if( (v7 & 0x100) != 0 && v2 == 1 )
v15 = 2684354564i64;
v47 = (v3 << 25) - ((_QWORD)MmGetPteBase() << 25);
ValidPte = MiMakeValidPte(v47 >> 16, (INT64)v9, v15);
v16 = ValidPte;
LODWORD(v17) = MiMapPageInHyperSpaceWorker(v13, OldIrql, 0x80000000ui64);
VirtualAddress = v17;
v18 = (INT64 *)v17;
v19 = v16;
do
{
*(_DWORD *)&OldIrql[4] = 0;
*v18++ = v19;
v16 ^= (v16 ^ ((v16 & 0xFFFFFFFFFFFFF000ui64) + 4096)) & 0xFFFFFFFFF000i64;
ValidPte = v16;
v19 = v16;
}
while( ((unsigned __int16)v18 & 0xFFF) != 0 );
MiUnmapPageInHyperSpaceWorker(VirtualAddress, OldIrql[0], 0x80000000ui64);
v20 = v39;
v21 = -2080374780;
v22 = a2;
if( v39 == 1 )
v21 = -2147483644;
v23 = v21;
LODWORD(v23) = v21 | 0x20000000;
if( (v43 & 0x100) == 0 )
v23 = v21;
LODWORD(v23) = v23 | 0x8000000;
v24 = MiMakeValidPte(v3, a2, v23);
v25 = PageFrameIndex;
ValidPte = v24;
MiInitializePfnForOtherProcess(PageFrameIndex, (MMPTE *)v3, ContainingPageFrame, 0xA00ui64);
v40 = 0;
v26 = v38;
while( _interlockedbittestandset64((volatile signed __int32 *)(v26 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)&v40);
while( *(__int64 *)(v26 + 24) < 0 );
}
*(_QWORD *)(v26 + 24) ^= (*(_QWORD *)(v26 + 24) ^ (*(_QWORD *)(v26 + 24) + 512i64)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)(v26 + 24), 0x7FFFFFFFFFFFFFFFui64);
PageFrameIndex = v25 & 0xFFFFFFFFFi64;
ValidPte = ((v25 & 0xFFFFFFFFFi64) << 12) | ValidPte & 0xFFFF000000000FFFui64;
MiTransformValidPteInPlace((volatile INT64 *)v3, v3, ValidPte, v20);
if( v20 == 3 )
MiInsertLargeTbFlushEntry((INT64)&result, 3ui64, v3);
v28 = (char *)MmGetPfnDb() + 48 * v22;
v29 = PageFrameIndex;
v30 = (v47 + 0x10000000) >> 16;
v31 = 512i64;
for( i = (INT64)(v28 + 24576); ; i = v38 )
{
v33 = i - 48;
v30 -= 8i64;
LODWORD(SpinCount) = 0;
v38 = v33;
while( _interlockedbittestandset64((volatile signed __int32 *)(v33 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(v33 + 24) < 0 );
}
v34 = v38;
if( (*(_BYTE *)(v38 + 35) & 0x10) == 0 )
{
if( (*(_QWORD *)(v38 + 40) & 0x1000000000i64) != 0 )
MiConvertLargePfnToSmall((INT64)v28, v38, v27, 0i64);
*(_QWORD *)(v34 + 8) = v30;
*(_QWORD *)(v34 + 40) = v29 | *(_QWORD *)(v34 + 40) & 0xFFFFFFF000000000ui64;
}
_InterlockedAnd64((volatile signed __int64 *)(v34 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( !--v31 )
break;
}
if( v39 == 1 )
{
LODWORD(BitsMustBeChanged) = 1;
MiUpdateLargePageBitMap((UINT64)&MiSystemPartition, v22, v5 >> 12, 0i64, BitsMustBeChanged);
}
MiFlushTbList((__int64)&result);
return 1i64;
}Referenced by:
MiPfnRangeIsZero