MiFreeToSubAllocatedRegion
NTSTATUS __stdcall MiFreeToSubAllocatedRegion(PVOID P){
char *v1;
__int64 v2;
_ETHREAD *CurrentThread;
char *v4;
__int64 v5;
INT64 ***VadEvent;
__int64 v8;
_EPROCESS *v9;
__int64 v10;
unsigned int v11;
__int64 v12;
INT64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
unsigned int v16;
unsigned int v17;
unsigned int v18;
bool v19;
__int64 *i;
bool v21;
int v22;
NTSTATUS result;
_QWORD *v24;
__int64 v25;
__int64 v26;
_QWORD *v27;
__int64 v28;
_QWORD *v29;
__int64 v30;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = v1;
v5 = v2;
v30 = *((_QWORD *)CurrentThread + 23);
VadEvent = MiLocateVadEvent((__int64)P, 64i64);
if( !VadEvent )
goto LABEL_21;
v11 = *(unsigned __int8 *)(v8 + 32);
v12 = *(unsigned int *)(v8 + 24);
v13 = (INT64)(VadEvent + 1);
v14 = (unsigned __int64)(v10 + 4095) >> 12;
LOCK_PAGE_TABLE_COMMITMENT(CurrentThread, v9);
RtlClearBitsEx(v13, (unsigned __int64)&v4[-4096 * (v12 | ((unsigned __int64)v11 << 32))] >> 12, v14);
v15 = *(unsigned int *)(v13 + 44);
v16 = *(_DWORD *)(v13 + 40) - v14;
*(_DWORD *)(v13 + 40) = v16;
if( v14 + v16 >= v15 && v16 < (unsigned int)v15 )
{
v24 = (_QWORD *)(v13 + 16);
v25 = *(_QWORD *)(v30 + 1680) + 16 * ((*(_DWORD *)(v13 + 48) & 3) + 20i64);
v26 = *(_QWORD *)v25;
if( *(_QWORD *)(*(_QWORD *)v25 + 8i64) != v25 )
goto LABEL_28;
*v24 = v26;
*(_QWORD *)(v13 + 24) = v25;
*(_QWORD *)(v26 + 8) = v24;
*(_QWORD *)v25 = v24;
v16 = *(_DWORD *)(v13 + 40);
}
v17 = 0;
v18 = 0;
v19 = v16 == 0;
for( i = (__int64 *)*((_QWORD *)P + 7); i; i = (__int64 *)*i )
{
if( *((_DWORD *)i + 16) == 2 )
{
if( v18 <= 1 )
++v18;
if( (unsigned __int64)v4 <= i[2] && (unsigned __int64)&v4[v5 - 1] >= (i[1] & 0xFFFFFFFFFFFFF000ui64) && v17 <= 1 )
++v17;
}
}
v21 = v19;
v22 = 1;
if( v18 != 1 )
v21 = 0;
if( v17 != 1 )
v22 = 0;
if( v21 )
{
v27 = (_QWORD *)(v13 + 16);
v28 = *(_QWORD *)(v13 + 16);
if( *(_QWORD *)(v28 + 8) == v13 + 16 )
{
v29 = *(_QWORD **)(v13 + 24);
if( (_QWORD *)*v29 == v27 )
{
*v29 = v28;
*(_QWORD *)(v28 + 8) = v29;
*v27 = 0i64;
*(_QWORD *)(v13 + 24) = 0i64;
goto LABEL_20;
}
}
LABEL_28:
__fastfail(3u);
}
if( v22 )
MiDecommitRegion((_MMVAD_SHORT *)P, v4, &v4[v5 - 1]);
LABEL_20:
UNLOCK_PAGE_TABLE_COMMITMENT((__int64)CurrentThread, v30);
if( !v21 )
{
LABEL_21:
MiUnlockAndDereferenceVad(P);
return result;
}
MiDeleteVad((_MMVAD *)P, 0i64);
return result;
}Referenced by:
MiAllocateFromSubAllocatedRegion
MmDeleteTeb