MiAllocateFromSubAllocatedRegion
NTSTATUS MiAllocateFromSubAllocatedRegion(UINT64 ecx0, INT64 a2, UINT64 *a3, ...){
__int64 v3;
unsigned __int64 v4;
_MMVAD_SHORT *v5;
VOID *v6;
_ETHREAD *CurrentThread;
_EPROCESS *Process;
__int64 p_NextPteToAge;
__int64 v10;
INT64 v11;
__int64 *v12;
UINT64 ClearBitsAndSet;
UINT64 v14;
int v15;
unsigned int v16;
_MMVAD_SHORT *v17;
int NewSubAllocatedRegion;
__int64 *v20;
__int64 **v21;
UINT64 *ChangeProtection;
INT64 v23;
INT64 v24;
INT64 v25;
__int64 v26;
unsigned int v27;
INT64 v30;
va_list va1;
va_list va;
va_start(va1, a3);
va_start(va, a3);
v30 = va_arg(va1, _QWORD);
v27 = ecx0;
v3 = (int)ecx0;
v4 = (unsigned __int64)(a2 + 4095) >> 12;
LODWORD(v24) = 0;
v5 = 0i64;
LOWORD(v30) = 0;
v6 = 0i64;
*a3 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Process = CurrentThread->Tcb.ApcState.Process;
p_NextPteToAge = (__int64)&Process->Vm.Instance.VmWorkingSetList[1].NextPteToAge;
--CurrentThread->Tcb.SpecialApcDisable;
v26 = p_NextPteToAge;
LOCK_ADDRESS_SPACE(CurrentThread, Process);
if( (Process->Flags & 0x20) != 0 )
{
NewSubAllocatedRegion = -1073741558;
LABEL_16:
UNLOCK_ADDRESS_SPACE(CurrentThread, Process);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return NewSubAllocatedRegion;
}
v10 = 2 * (v3 + 17);
v11 = p_NextPteToAge + 16 * (v3 + 17);
v25 = v11;
while( 2 )
{
LOCK_PAGE_TABLE_COMMITMENT(CurrentThread, Process);
v12 = *(__int64 **)(p_NextPteToAge + 8 * v10);
while( v12 != (__int64 *)v11 )
{
ClearBitsAndSet = RtlFindClearBitsAndSetEx(
(_RTL_BITMAP_EX *)v12 - 1,
v4,
(unsigned __int64)*((unsigned int *)v12 + 8) >> 2);
v14 = ClearBitsAndSet;
if( ClearBitsAndSet != -1i64 )
{
*((_DWORD *)v12 + 6) += v4;
v15 = v12[4] & 3 | (4 * (v4 + ClearBitsAndSet));
v16 = *((_DWORD *)v12 + 6);
*((_DWORD *)v12 + 8) = v15;
if( v16 >= *((_DWORD *)v12 + 7) )
{
v20 = (__int64 *)*v12;
if( *(__int64 **)(*v12 + 8) != v12 || (v21 = (__int64 **)v12[1], *v21 != v12) )
__fastfail(3u);
*v21 = v20;
v20[1] = (__int64)v21;
*v12 = 0i64;
}
v5 = (_MMVAD_SHORT *)v12[2];
v11 = v25;
v6 = (VOID *)((v14 << 12) + ((v5->StartingVpn | ((unsigned __int64)v5->StartingVpnHigh << 32)) << 12));
break;
}
v12 = (__int64 *)*v12;
v11 = v25;
}
UNLOCK_PAGE_TABLE_COMMITMENT(CurrentThread, Process);
if( !v5 )
{
NewSubAllocatedRegion = MiAllocateNewSubAllocatedRegion(v27, v4);
if( NewSubAllocatedRegion >= 0 )
{
p_NextPteToAge = v26;
continue;
}
goto LABEL_16;
}
break;
}
MiReferenceVad(v5);
UNLOCK_ADDRESS_SPACE(CurrentThread, Process);
MiLockVad(CurrentThread, v5);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
if( !MiVadDeleted(v5) )
{
LOBYTE(v23) = 0;
LODWORD(ChangeProtection) = 0;
NewSubAllocatedRegion = MiCommitExistingVad(
v17,
v6,
a2,
(v5->u.LongFlags >> 7) & 0x1F,
ChangeProtection,
0i64,
v23,
0i64,
(INT64)&v24,
(INT64)va,
v24,
v25);
if( NewSubAllocatedRegion < 0 )
{
MiFreeToSubAllocatedRegion(v5);
}
else
{
MiUnlockAndDereferenceVad(v5);
*a3 = (UINT64)v6;
}
return NewSubAllocatedRegion;
}
MiUnlockAndDereferenceVad(v17);
return -1073741558;
}Referenced by:
MiCreatePebOrTeb