MiGetClusterPage
_MMPFN *__stdcall MiGetClusterPage(
_MMVAD *Vad,
VOID *VirtualAddress,
UINT64 ProtectionCode,
UINT64 ExistingProtectionCode,
UINT8 *SuboptimalPage){
unsigned __int64 v7;
_MMSUPPORT_FULL *p_Vm;
unsigned __int64 v9;
unsigned int v10;
__int64 v11;
unsigned __int64 v12;
unsigned int v13;
__int64 v14;
char *v15;
_MMPTE *v16;
__int64 v17;
__int64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
unsigned __int64 v21;
unsigned __int64 v22;
unsigned __int64 v23;
__int64 v24;
unsigned __int64 v25;
__int64 v26;
unsigned __int64 v27;
INT64 v28;
bool v29;
unsigned __int64 v30;
int v31;
__int64 v32;
_MMSUPPORT_INSTANCE *v33;
__int64 v34;
_MI_PFN_CACHE_ATTRIBUTE v35;
unsigned int v36;
_KQUEUE *LargePage;
unsigned __int64 v39;
unsigned __int64 v40;
__int64 Alignment;
_MI_PFN_CACHE_ATTRIBUTE v42;
_MMPFN *PageChain;
__int64 v44;
bool v45;
_LIST_ENTRY **EntryArray;
unsigned int ProtectionMask;
_MMVAD *Vada;
PVOID *Partition;
__int64 v50[2];
__int64 v51;
INT64 v52;
_BYTE *v53;
_MI_COLOR_BASE ColorBase[4];
UINT64 v55;
UINT64 NumberOfPages;
_MI_FAULT_VA_LIST FaultHead[56];
_BYTE *v58;
v55 = ProtectionCode;
ProtectionMask = ExistingProtectionCode;
v53 = v58;
*(_OWORD *)ColorBase = 0i64;
memset(FaultHead, 0i64, 0x60u);
*v58 = 0;
v7 = (unsigned __int64)Vad->Core.StartingVpnHigh << 32;
v51 = 0i64;
p_Vm = &KeGetCurrentThread()->ApcState.Process->Vm;
v9 = Vad->Core.StartingVpn | v7;
Vada = (_MMVAD *)p_Vm;
v50[0] = (unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFF0000ui64;
v50[1] = 0x10000i64;
if( ((unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFF0000ui64) >> 12 < v9
|| (((unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFF0000ui64) + 0xFFFF) >> 12 > (Vad->Core.EndingVpn | ((unsigned __int64)Vad->Core.EndingVpnHigh << 32)) )
{
return 0i64;
}
v10 = (Vad->Core.u.LongFlags >> 12) & 0x3F;
MiInitializePageColorBase(&p_Vm->Instance, v10, ColorBase);
v13 = (unsigned int)ColorBase[3] >> *(&stru_140C4DB30 + 156);
v29 = (Vad->Core.u.LongFlags & 0x100000) == 0;
LOWORD(FaultHead[0]) = 2;
*(_QWORD *)&FaultHead[2] = v50;
*(_QWORD *)&FaultHead[4] = 1i64;
*(_QWORD *)&FaultHead[6] = v12;
*(_QWORD *)&FaultHead[8] = v12;
if( v29 )
{
MiGetProtoPteAddress();
v18 = v17;
v19 = *(_QWORD *)(v51 + 8);
v20 = (((unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFFF000ui64) - v50[0]) >> 12;
v21 = v19 + 8 * (*(unsigned int *)(v51 + 44) - (unsigned __int64)(*(_DWORD *)(v51 + 52) & 0x3FFFFFFF));
v22 = v17 & 0xFFFFFFFFFFFFF000ui64;
if( v22 > v19 )
v19 = v22;
v23 = v22 + 4096;
v15 = (char *)(v18 - 8 * v20);
if( (unsigned __int64)v15 < v19 )
return 0i64;
if( v21 <= v23 )
v23 = v21;
if( v18 + 8 * (16 - v20) > v23 )
return 0i64;
v16 = (_MMPTE *)((char *)MmGetPteBase() + (((unsigned __int64)v50[0] >> 9) & 0x7FFFFFFFF8i64));
v14 = *(_WORD *)(*(_QWORD *)v51 + 60i64) & 0x3FF;
v12 = 0i64;
}
else
{
v14 = *(unsigned __int16 *)(v11 + 174);
v15 = (char *)MmGetPteBase() + (((unsigned __int64)v50[0] >> 9) & 0x7FFFFFFFF8i64);
v16 = (_MMPTE *)(unsigned int)v12;
}
v24 = v13;
v25 = v12;
Partition = *(PVOID **)(*(&stru_140C4DB30 + 267) + 8 * v14);
*((_BYTE *)Partition[2] + 4544 * v24 + 3251) = 1;
do
{
LODWORD(v26) = MI_READ_PTE_LOCK_FREE((INT64)&v15[8 * v25]);
*(_QWORD *)&FaultHead[2 * v25++ + 24] = v26;
}
while( v25 < 0x10 );
v27 = 0i64;
do
{
v28 = *(_QWORD *)&FaultHead[2 * v27 + 24];
v52 = v28;
if( (_DWORD)SuboptimalPage )
{
IS_PTE_NOT_DEMAND_ZERO();
if( v31 )
break;
v29 = ((v30 >> 5) & 0x1F) == (_DWORD)SuboptimalPage;
}
else
{
v29 = v28 == 0;
}
if( !v29 || v16 && MiIsPteEvaluated(v16, (unsigned int)SuboptimalPage) )
break;
if( ++v27 == v55 )
break;
}
while( v27 < 0x10 );
v32 = -1i64;
if( v27 == 16 )
{
v33 = (_MMSUPPORT_INSTANCE *)Vada;
LODWORD(v34) = MiComputeZeroClusterMaximum(FaultHead, Vada);
if( v34 != 16 )
return 0i64;
_InterlockedExchangeAdd(*(volatile signed __int32 **)ColorBase, 1u);
v35 = MiProtectionToCacheAttribute(ProtectionMask);
LargePage = (_KQUEUE *)MiGetLargePage((INT64)Partition, 2u, v35, v36, 4, 0i64);
if( LargePage )
{
MiConvertEntireLargePageToSmall(LargePage, 2, 2u, (_LARGE_INTEGER *)1, 0i64, 0i64);
return(_MMPFN *)LargePage;
}
}
else
{
v27 = 0i64;
while( 1 )
{
v52 = *(_QWORD *)&FaultHead[2 * v27 + 24];
if( (v52 & 1) != 0 )
break;
if( ++v27 >= 0x10 )
goto LABEL_33;
}
LODWORD(v39) = MI_READ_PTE_LOCK_FREE((INT64)&v52);
v32 = (v39 >> 12) & 0xFFFFFFFFFi64;
if( (unsigned __int16)v39 >> 12 != v27 )
return 0i64;
LABEL_33:
v33 = (_MMSUPPORT_INSTANCE *)Vada;
}
v40 = ((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64;
NumberOfPages = 1i64;
Alignment = ((__int64)(v40 - (((unsigned __int64)v50[0] >> 9) & 0x7FFFFFFFF8i64)) >> 3) & 0xF;
v42 = MiProtectionToCacheAttribute(ProtectionMask);
LODWORD(EntryArray) = 258;
PageChain = MiGetPageChain(Partition, v33, v10, (unsigned int)v42, (UINT64)EntryArray, Alignment, &NumberOfPages);
if( !PageChain )
return 0i64;
v44 = PageChain - MmGetPfnDb();
if( v27 == 16 )
v45 = (v44 & 0xF) == Alignment;
else
v45 = v32 + ((__int64)(v40 - (((unsigned __int64)v50[0] >> 9) & 0x7FFFFFFFF8i64)) >> 3) - v27 == v44;
if( !v45 )
*v53 = 1;
return PageChain;
}Referenced by:
MiCreateSharedZeroPages
MiResolvePrivateZeroFault