MiBuildNewCloneDescriptor
_QWORD *__fastcall MiBuildNewCloneDescriptor(ULONG_PTR a1, __int64 a2, __int64 a3){
__int64 v4;
unsigned __int64 v7;
_QWORD *v9;
_QWORD *v10;
_OWORD *v11;
INT64 v12;
__int64 *v13;
__int64 *v14;
void *v15;
_MI_PARTITION *VmPartition;
v4 = 32 * a2;
v7 = 32 * a2 + 32;
if( (int)PsChargeProcessNonPagedPoolQuota(a1, v7) < 0 )
return 0i64;
LODWORD(v9) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v10 = v9;
if( !v9 )
{
PsReturnProcessNonPagedPoolQuota(a1, v7);
return 0i64;
}
LODWORD(v11) = MiAllocatePool((struct _SLIST_ENTRY *)0x112);
v12 = (INT64)v11;
if( !v11 )
{
LABEL_6:
PsReturnProcessNonPagedPoolQuota(a1, v7);
ExFreePoolWithTag(v10, 0);
return 0i64;
}
*v11 = 0i64;
v11[1] = 0i64;
LODWORD(v13) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v14 = v13;
v15 = (void *)v12;
if( !v13 )
{
LABEL_8:
ExFreePoolWithTag(v15, 0);
goto LABEL_6;
}
if( !(unsigned int)MiLockPagedRange(v12, v7) )
{
ExFreePoolWithTag(v14, 0);
v15 = (void *)v12;
goto LABEL_8;
}
VmPartition = MiGetVmPartition((_MMSUPPORT_INSTANCE *)(a1 + 1664));
*v14 = a2;
v14[1] = 1i64;
v14[2] = v12;
v10[6] = 0i64;
v10[4] = v12 + v4 - 32;
v10[3] = v12;
v10[5] = a2;
v10[7] = v14;
v10[8] = v7;
v10[12] = a3;
_InterlockedIncrement64((volatile signed __int64 *)VmPartition + 171);
v14[3] = (__int64)VmPartition;
return v10;
}Referenced by:
MiCloneProcessAddressSpace
MiCloneVads