MiCoalescePlaceholderAllocations
NTSTATUS __stdcall MiCoalescePlaceholderAllocations(_EPROCESS *Process, VOID *StartingVa, UINT64 a3){
unsigned __int64 v5;
UINT64 v6;
_MMVAD *Address;
_MMVAD_SHORT *p_Core;
_MMVAD_SHORT *i;
int v10;
__int64 LongFlags1;
int v12;
_MMVAD_SHORT **ExtraCreateInfo;
_MMVAD_SHORT *v14;
_MMVAD_SHORT *v15;
_MMVAD_SHORT *NextVad;
_MMVAD_SHORT *v17;
_MMVAD *v18;
_MMVAD_SHORT *v19;
_MMVAD_SHORT *j;
unsigned __int64 k;
unsigned __int64 v22;
unsigned __int64 v23;
_QWORD *v24;
unsigned __int64 m;
_MMVAD *v26;
_ETHREAD *Thread;
Thread = (_ETHREAD *)KeGetCurrentThread();
LODWORD(v5) = MiLockVadRange(Process, StartingVa, (VOID *)(a3 & 0xFFFFFFFFFFFFF000ui64));
v6 = v5;
if( v5 >= 2 )
{
Address = MiLocateAddress(StartingVa);
p_Core = &Address->Core;
if( (VOID *)((Address->Core.StartingVpn | ((unsigned __int64)Address->Core.StartingVpnHigh << 32)) << 12) == StartingVa )
{
i = &Address->Core;
v10 = 0;
while( 1 )
{
LongFlags1 = i->u1.LongFlags1;
LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
if( (LongFlags1 | ((unsigned __int64)i->CommitChargeHigh << 31)) != 0x7FFFFFFFDi64 )
break;
if( (i->u.LongFlags & 8) != 0 )
{
v12 = MiCheckSecuredVad(
i,
(VOID *)((i->StartingVpn | ((unsigned __int64)i->StartingVpnHigh << 32)) << 12),
((i->EndingVpn | ((unsigned __int64)i->EndingVpnHigh << 32))
- (i->StartingVpn | ((unsigned __int64)i->StartingVpnHigh << 32))
+ 1) << 12,
0x55ui64);
if( v12 < 0 )
goto LABEL_38;
}
ExtraCreateInfo = (_MMVAD_SHORT **)i->ExtraCreateInfo;
v14 = i;
v15 = i;
if( ExtraCreateInfo )
{
NextVad = *ExtraCreateInfo;
for( i = (_MMVAD_SHORT *)i->ExtraCreateInfo; NextVad; NextVad = NextVad->NextVad )
i = NextVad;
}
else
{
while( 1 )
{
i = (_MMVAD_SHORT *)(i->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
if( !i || i->NextVad == v15 )
break;
v15 = i;
}
}
if( (unsigned int)++v10 >= v6 )
{
if( (((v14->EndingVpn | ((unsigned __int64)v14->EndingVpnHigh << 32)) << 12) | 0xFFF) != a3 )
break;
v17 = (_MMVAD_SHORT *)p_Core->ExtraCreateInfo;
v18 = 0i64;
v19 = p_Core;
if( v17 )
{
for( j = v17->NextVad; j; j = j->NextVad )
v17 = j;
}
else
{
for( k = p_Core->VadNode.ParentValue; ; k = v17->VadNode.ParentValue )
{
v17 = (_MMVAD_SHORT *)(k & 0xFFFFFFFFFFFFFFFCui64);
if( !v17 || v17->NextVad == v19 )
break;
v19 = v17;
}
}
while( 1 )
{
v22 = (unsigned __int64)v17->ExtraCreateInfo;
v23 = (unsigned __int64)v17;
if( v22 )
{
v24 = *(_QWORD **)v22;
if( *(_QWORD *)v22 )
{
do
{
v22 = (unsigned __int64)v24;
v24 = (_QWORD *)*v24;
}
while( v24 );
}
}
else
{
for( m = v17->VadNode.ParentValue; ; m = *(_QWORD *)(v22 + 16) )
{
v22 = m & 0xFFFFFFFFFFFFFFFCui64;
if( !v22 || *(_QWORD *)v22 == v23 )
break;
v23 = v22;
}
}
MiReferenceVad(v17);
MiRemovePlaceholderVad((_RTL_BALANCED_NODE *)v17);
v17->NextVad = &v18->Core;
v18 = (_MMVAD *)v17;
if( v17 == v14 )
break;
v17 = (_MMVAD_SHORT *)v22;
}
p_Core->EndingVpn = a3 >> 12;
p_Core->EndingVpnHigh = a3 >> 44;
UNLOCK_ADDRESS_SPACE_UNORDERED(Thread, Process);
do
{
v26 = v18;
v18 = (_MMVAD *)v18->Core.NextVad;
MiDeleteVad(v26, 0i64);
}
while( v18 );
MiUnlockVad(Thread, p_Core);
return 0;
}
}
}
}
v12 = -1073741800;
LABEL_38:
MiUnlockVadRange(Process, StartingVa, v6);
return v12;
}Referenced by:
MmFreeVirtualMemory