MiInsertVadCharges
INT64 __fastcall MiInsertVadCharges(__int64 a1, ULONG_PTR a2){
UINT64 v3;
unsigned __int64 v4;
unsigned __int64 v6;
__int64 v7;
void *v8;
unsigned __int64 v9;
void *v10;
INT64 result;
int v12;
int v13;
__int64 v14;
unsigned __int64 v15;
_ETHREAD *CurrentThread;
int v17;
UINT64 v18;
ULONG_PTR *v19;
INT64 ***v20;
__int64 v21;
INT64 v22;
v3 = 0i64;
v4 = 0i64;
v6 = *(unsigned int *)(a1 + 24) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 32) << 32);
v7 = *(unsigned int *)(a1 + 52);
LODWORD(v7) = v7 & 0x7FFFFFFF;
v8 = (void *)(((*(unsigned int *)(a1 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 33) << 32)) << 12) | 0xFFF);
v9 = v7 | ((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31);
v10 = (void *)(v6 << 12);
if( v9 >= 0x7FFFFFFFDi64 )
{
if( v9 == 0x7FFFFFFFDi64 )
{
result = PsChargeProcessNonPagedPoolQuota(a2, 0x40ui64);
if( (int)result < 0 )
return result;
}
goto LABEL_10;
}
result = PsChargeProcessNonPagedPoolQuota(a2, 0x88ui64);
if( (int)result < 0 )
return result;
if( (*(_DWORD *)(a1 + 48) & 0x100000) == 0 && !(unsigned int)MiVadPureReserve(a1) )
{
v3 = 8
* ((*(unsigned int *)(a1 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 33) << 32))
- (*(unsigned int *)(a1 + 24) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 32) << 32)))
+ 8;
if( (PEPROCESS)a2 != PsInitialSystemProcess )
{
v12 = PspChargeQuota(*(_QWORD *)(a2 + 1384), a2, 1i64, v3);
if( v12 < 0 )
{
PsReturnProcessNonPagedPoolQuota(a2, 0x88ui64);
return(unsigned int)v12;
}
}
}
v13 = *(_DWORD *)(a1 + 48) & 0x70;
if( v13 == 48 )
{
if( (*(_DWORD *)(a1 + 48) & 0x3100000) == 34603008 )
v20 = 0i64;
else
v20 = MiLocateVadEvent(a1, 256i64) + 1;
v18 = MiComputeAweCharges(a1, (INT64)v20);
}
else
{
if( v13 != 64 && v13 != 16 )
goto LABEL_10;
v18 = MiResidentPagesForSpan(v10, v8);
}
v4 = v18;
if( !v18 || (MiGetProcessPartition((_EPROCESS *)a2), (unsigned int)MiChargeResident(v19, v4, 128i64)) )
{
LABEL_10:
v14 = *(unsigned int *)(a1 + 52);
LODWORD(v14) = v14 & 0x7FFFFFFF;
v15 = v14 | ((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31);
if( v15 >= 0x7FFFFFFFDi64 && v15 != 0x7FFFFFFFEi64
|| (CurrentThread = (_ETHREAD *)KeGetCurrentThread(),
LOCK_PAGE_TABLE_COMMITMENT(CurrentThread, (_EPROCESS *)a2),
v17 = MiCommitPageTablesForVad(a1, (unsigned __int64)v10, (unsigned __int64)v8),
UNLOCK_PAGE_TABLE_COMMITMENT((__int64)CurrentThread, a2),
v17 >= 0) )
{
MiSetVadBits(a1);
return 0i64;
}
goto LABEL_27;
}
v4 = 0i64;
v17 = -1073741670;
LABEL_27:
v21 = *(unsigned int *)(a1 + 52);
LODWORD(v21) = v21 & 0x7FFFFFFF;
if( (v21 | ((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31)) < 0x7FFFFFFFDi64 )
PsReturnProcessNonPagedPoolQuota(a2, 0x88ui64);
if( v3 )
PsReturnProcessPagedPoolQuota(a2, v3);
if( v4 )
{
MiGetProcessPartition((_EPROCESS *)a2);
MiReturnResident(v22, v4);
}
return(unsigned int)v17;
}Referenced by:
MiAllocateEnclaveVad
MiAllocateNewSubAllocatedRegion
MiDeletePartialVad
MiInsertChildVads
MiInsertProcessVads
MiMapLockedPagesInUserSpace
MiMapViewOfDataSection
MiMapViewOfImageSection
MiMapViewOfPhysicalSection
MiReserveUserMemory