MiInsertVadCharges
NTSTATUS __stdcall MiInsertVadCharges(_MMVAD_SHORT *Vad, ULONG_PTR CurrentProcess){
unsigned __int64 v3;
UINT64 v4;
_EPROCESS *v5;
unsigned __int64 v6;
__int64 LongFlags1;
VOID *v8;
unsigned __int64 v9;
VOID *v10;
NTSTATUS result;
int v12;
unsigned int v13;
__int64 v14;
unsigned __int64 v15;
_ETHREAD *CurrentThread;
int v17;
_EPROCESS *v18;
UINT64 v19;
_EPROCESS *v20;
_MI_PARTITION *ProcessPartition;
__int64 ********v22;
__int64 v23;
_MI_PARTITION *v24;
v3 = 0i64;
v4 = 0i64;
v5 = *(_EPROCESS **)&CurrentProcess;
v6 = Vad->StartingVpn | ((unsigned __int64)Vad->StartingVpnHigh << 32);
LongFlags1 = Vad->u1.LongFlags1;
LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
v8 = (VOID *)(((Vad->EndingVpn | ((unsigned __int64)Vad->EndingVpnHigh << 32)) << 12) | 0xFFF);
v9 = LongFlags1 | ((unsigned __int64)Vad->CommitChargeHigh << 31);
v10 = (VOID *)(v6 << 12);
if( v9 >= 0x7FFFFFFFDi64 )
{
if( v9 == 0x7FFFFFFFDi64 )
{
result = PsChargeProcessNonPagedPoolQuota(*(_EPROCESS **)&CurrentProcess, 0x40ui64);
if( result < 0 )
return result;
}
goto LABEL_10;
}
result = PsChargeProcessNonPagedPoolQuota(*(_EPROCESS **)&CurrentProcess, 0x88ui64);
if( result < 0 )
return result;
if( (Vad->u.LongFlags & 0x100000) == 0 && !MiVadPureReserve(Vad) )
{
v3 = 8
* ((Vad->EndingVpn | ((unsigned __int64)Vad->EndingVpnHigh << 32))
- (Vad->StartingVpn | ((unsigned __int64)Vad->StartingVpnHigh << 32)))
+ 8;
if( v5 != PsInitialSystemProcess )
{
v12 = PspChargeQuota(v5->QuotaBlock, v5, PsResourcePagedPool, v3);
if( v12 < 0 )
{
PsReturnProcessNonPagedPoolQuota(v5, 0x88ui64);
return v12;
}
}
}
v13 = Vad->u.LongFlags & 0x70;
if( v13 == 48 )
{
if( (Vad->u.LongFlags & 0x3100000) == 34603008 )
v22 = 0i64;
else
v22 = MiLocateVadEvent((__int64)Vad, 256) + 1;
LODWORD(v19) = MiComputeAweCharges((__int64)Vad, (INT64)v22);
}
else
{
if( v13 != 64 && v13 != 16 )
goto LABEL_10;
LODWORD(v19) = MiResidentPagesForSpan(v10, v8);
}
v4 = v19;
if( !v19
|| (ProcessPartition = MiGetProcessPartition(v5, v20),
MiChargeResident((ULONG_PTR *)&ProcessPartition->Core.PartitionId, v4, 0x80ui64)) )
{
LABEL_10:
v14 = Vad->u1.LongFlags1;
LODWORD(v14) = v14 & 0x7FFFFFFF;
v15 = v14 | ((unsigned __int64)Vad->CommitChargeHigh << 31);
if( v15 >= 0x7FFFFFFFDi64 && v15 != 0x7FFFFFFFEi64
|| (CurrentThread = (_ETHREAD *)KeGetCurrentThread(),
LOCK_PAGE_TABLE_COMMITMENT(CurrentThread, v5),
v17 = MiCommitPageTablesForVad(Vad, v10, v8),
UNLOCK_PAGE_TABLE_COMMITMENT(CurrentThread, v5),
v17 >= 0) )
{
MiSetVadBits(Vad);
return 0;
}
goto LABEL_27;
}
v4 = 0i64;
v17 = -1073741670;
LABEL_27:
v23 = Vad->u1.LongFlags1;
LODWORD(v23) = v23 & 0x7FFFFFFF;
if( (v23 | ((unsigned __int64)Vad->CommitChargeHigh << 31)) < 0x7FFFFFFFDi64 )
PsReturnProcessNonPagedPoolQuota(v5, 0x88ui64);
if( v3 )
PsReturnProcessPagedPoolQuota((ULONG_PTR)v5, v3);
if( v4 )
{
v24 = MiGetProcessPartition(v5, v18);
MiReturnResident((INT64)v24, v4);
}
return v17;
}Referenced by:
MiAllocateEnclaveVad
MiAllocateNewSubAllocatedRegion
MiDeletePartialVad
MiInsertChildVads
MiInsertProcessVads
MiMapLockedPagesInUserSpace
MiMapViewOfDataSection
MiMapViewOfImageSection
MiMapViewOfPhysicalSection
MiReserveUserMemory