VmpAllocateMemoryRanges
CHAR *__fastcall VmpAllocateMemoryRanges(UINT64 a1){
CHAR *v2;
CHAR *PoolWithTag;
CHAR *v4;
char *v5;
UINT64 v6;
char *v7;
char *v8;
char **v9;
v2 = 0i64;
PoolWithTag = (CHAR *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x38ui64, 0x72566D56ui64);
v4 = PoolWithTag;
if( PoolWithTag )
{
v5 = PoolWithTag + 40;
*(_OWORD *)PoolWithTag = 0i64;
v6 = 0i64;
*((_OWORD *)PoolWithTag + 1) = 0i64;
*((_OWORD *)PoolWithTag + 2) = 0i64;
*((_QWORD *)PoolWithTag + 6) = 0i64;
*((_QWORD *)PoolWithTag + 2) = -1i64;
*((_QWORD *)PoolWithTag + 6) = PoolWithTag + 40;
*((_QWORD *)PoolWithTag + 5) = PoolWithTag + 40;
if( a1 )
{
while( 1 )
{
v7 = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x40ui64, 0x72476D56ui64);
v8 = v7;
if( !v7 )
break;
memset((INT64)v7, 0i64);
*((_QWORD *)v8 + 5) = -1i64;
*((_QWORD *)v8 + 2) = v4;
v9 = (char **)*((_QWORD *)v4 + 6);
if( *v9 != v5 )
__fastfail(3u);
*(_QWORD *)v8 = v5;
++v6;
*((_QWORD *)v8 + 1) = v9;
*v9 = v8;
*((_QWORD *)v4 + 6) = v8;
if( v6 >= a1 )
goto LABEL_6;
}
}
else
{
LABEL_6:
v2 = v4;
v4 = 0i64;
}
if( v4 )
VmpFreeMemoryRanges(v4);
}
return v2;
}Referenced by:
VmCreateMemoryRange
VmPreallocateForRangeCreate
VmpSplitMemoryRange