MiMapUserLargePages
NTSTATUS __stdcall MiMapUserLargePages(_MMVAD_SHORT *Vad, UINT64 PreferredNode){
unsigned int v3;
_MMSUPPORT_INSTANCE *p_Instance;
unsigned __int64 v5;
unsigned __int64 v6;
INT64 *v7;
CHAR v8;
NTSTATUS result;
union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v10;
unsigned __int64 v11;
__int64 v12;
unsigned int v13;
unsigned int v14;
unsigned int v15;
UINT8 v16;
char *v17;
unsigned __int64 v18;
unsigned __int64 v19;
_MMPTE *PteBase;
unsigned int v21;
bool i;
unsigned __int64 v23;
__int64 v24;
unsigned __int64 v25;
__int64 v26;
int v27;
UINT64 v28;
int v29;
UINT8 v30;
int v31;
UINT64 v32;
UINT64 Flags;
int v34;
unsigned int v35;
int v36;
unsigned int v37;
char *PageTableVirtualAddress;
unsigned __int64 v39;
_EPROCESS *a3;
_MMPFN *Pfn1;
__int64 LargePageIndex;
__int64 v43;
unsigned __int64 v44;
_QWORD v45[2];
__int128 v46;
int v48;
*(_OWORD *)v45 = 0i64;
v46 = 0i64;
v3 = MiComputePreferredNode((INT64)Vad);
v37 = v3;
a3 = KeGetCurrentThread()->ApcState.Process;
p_Instance = &a3->Vm.Instance;
v5 = (Vad->StartingVpn | ((unsigned __int64)Vad->StartingVpnHigh << 32)) << 12;
v6 = (((Vad->EndingVpn | ((unsigned __int64)Vad->EndingVpnHigh << 32)) << 12) | 0xFFF) + 1;
v44 = v6;
result = MiCreateLargePfnList((INT64)Vad, (v6 - v5) >> 12, v8, v7, (CHAR *)v45);
if( result < 0 )
return result;
v10.LongFlags = (unsigned int)Vad->u;
v11 = 0x140000000ui64;
v12 = (v10.LongFlags >> 18) & 3;
if( LODWORD(MiVadPageSizes[v12]) == 16 )
{
v13 = 2;
LABEL_4:
v14 = v13;
goto LABEL_8;
}
if( (v10.LongFlags & 0x500000) == 5242880 )
{
v13 = MiVadPageIndices[v12];
goto LABEL_4;
}
v13 = 1;
LOBYTE(v15) = MiGetLargestPageIndex();
v14 = v15;
LABEL_8:
v36 = 0;
v48 = 0;
v16 = 17;
v34 = 0;
v17 = 0i64;
v35 = v14;
v18 = 0i64;
v19 = v5;
v39 = v5;
PteBase = MmGetPteBase();
PageTableVirtualAddress = (char *)PteBase + ((v5 >> 9) & 0x7FFFFFFFF8i64);
if( v5 >= v6 )
return 0;
do
{
v21 = v14;
for( i = v14 <= v13; i; i = v21 <= v13 )
{
v23 = *(_QWORD *)(v11 + 8i64 * v21 + 108432) << 12;
if( !(v19 % v23) && v6 - v19 >= v23 )
{
LODWORD(v24) = v21;
if( v45[v21] )
{
LABEL_17:
if( (unsigned int)v24 <= v13 )
{
v21 = v24;
break;
}
}
else
{
while( 1 )
{
v24 = (unsigned int)(v24 + 1);
if( (unsigned int)v24 > v13 )
break;
if( v45[v24] )
goto LABEL_17;
}
}
MiDemotePfnListChain((INT64)v45, v21);
v11 = 0x140000000ui64;
PteBase = MmGetPteBase();
break;
}
++v21;
}
Pfn1 = (_MMPFN *)v45[v21];
v45[v21] = Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
v25 = (unsigned __int64)PageTableVirtualAddress;
v43 = *(_QWORD *)(v11 + 8i64 * v21 + 108432);
LargePageIndex = Pfn1 - MmGetPfnDb();
if( v21 < 2 )
{
v26 = 2 - v21;
do
{
v25 = (unsigned __int64)PteBase + ((v25 >> 9) & 0x7FFFFFFFF8i64);
--v26;
}
while( v26 );
v3 = v37;
}
if( ((v25 ^ v18) & 0xFFFFFFFFFFFFF000ui64) != 0 )
{
if( v17 )
{
MiUnlockPageTable((INT64)p_Instance, (UINT64)v17);
v17 = 0i64;
}
v27 = v34;
v28 = 1i64;
if( v34 == 1 )
{
if( v21 )
{
v29 = 1;
v48 = 1;
}
else
{
v29 = v48;
}
}
else
{
v29 = v48;
if( !v21 )
v29 = 1;
v48 = v29;
}
if( v29 )
{
v48 = 0;
if( v16 == 17 )
goto LABEL_41;
LOBYTE(v28) = v16;
if( v34 == 1 )
MiUnlockWorkingSetExclusive(p_Instance, v16);
else
MiUnlockWorkingSetShared(p_Instance, v28);
v16 = 17;
}
if( v16 != 17 )
{
LABEL_45:
if( !v27 )
v17 = (char *)MmGetPteBase() + ((v25 >> 9) & 0x7FFFFFFFF8i64);
LODWORD(Flags) = v27;
MiMakeSystemAddressValid((VOID *)v25, 0i64, v3 + 1, v16, Flags);
goto LABEL_48;
}
LABEL_41:
if( !v21 )
{
v34 = 1;
v27 = 1;
v16 = MiLockWorkingSetForLargeMapping(p_Instance, 1i64, v3);
}
if( v16 == 17 )
{
v27 = 0;
v34 = 0;
MiLockWorkingSetShared();
v16 = v30;
}
goto LABEL_45;
}
LABEL_48:
MiInitializeLargeUserBasePfn(Pfn1, (UINT64)PageTableVirtualAddress, (UINT64)a3);
MiInsertLargeUserMapping(Vad, (_MMPTE)PageTableVirtualAddress, LargePageIndex, v21);
v39 += v43 << 12;
PageTableVirtualAddress += 8 * v43;
if( (++v36 & 0xF) == 0 && (LOBYTE(v31) = MiWorkingSetIsContended((INT64)p_Instance), v31)
|| MiShouldYieldProcessor() )
{
v18 = 0i64;
v48 = 1;
}
else
{
v18 = v25;
}
v6 = v44;
v11 = 0x140000000ui64;
v19 = v39;
v14 = v35;
PteBase = MmGetPteBase();
}
while( v39 < v44 );
if( v17 )
MiUnlockPageTable((INT64)p_Instance, (UINT64)v17);
if( v16 != 17 )
{
LOBYTE(v32) = v16;
if( v34 == 1 )
MiUnlockWorkingSetExclusive(p_Instance, v16);
else
MiUnlockWorkingSetShared(p_Instance, v32);
}
return 0;
}Referenced by:
MiCopyLargeVad
MiMapViewOfImageSection
MiReserveUserMemory