MiCreateLargePageVad
NTSTATUS __stdcall MiCreateLargePageVad(_EPROCESS *TargetProcess, _MMVAD_SHORT *Vad){
VOID *v2;
int v3;
__int64 Pool;
VOID *v5;
_ETHREAD *CurrentThread;
_EPROCESS *Process;
__int64 LongFlags1;
unsigned __int64 v12;
int v13;
int v14;
v3 = 1;
Pool = 1i64;
v5 = v2;
if( (Vad->u.LongFlags & 0x100000) != 0 )
Pool = -(__int64)(v2 != 0i64) & 1;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Process = CurrentThread->Tcb.ApcState.Process;
if( Pool )
{
Pool = (__int64)MiAllocatePool(64i64, 0x48ui64, 0x624C6D4Dui64);
if( !Pool )
return -1073741670;
}
LongFlags1 = Vad->u1.LongFlags1;
LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
v12 = LongFlags1 | ((unsigned __int64)Vad->CommitChargeHigh << 31);
if( !v12 )
{
if( !v5 )
goto LABEL_24;
LABEL_23:
ObfReferenceObjectWithTag(v5, 0x746C6644ui64);
*(_QWORD *)(Pool + 24) = v5;
goto LABEL_24;
}
if( !MiChargeProcessPhysicalPages(TargetProcess, LongFlags1 | ((unsigned __int64)Vad->CommitChargeHigh << 31)) )
{
if( Pool )
ExFreePoolWithTag((PVOID)Pool, 0);
return -1073741523;
}
if( v5 )
goto LABEL_23;
if( v13 || Process != TargetProcess )
v3 = 0;
else
LOCK_ADDRESS_SPACE_SHARED(CurrentThread, TargetProcess);
v14 = MiChargeFullProcessCommitment((ULONG_PTR)TargetProcess, v12);
if( v3 )
UNLOCK_ADDRESS_SPACE_SHARED(CurrentThread, TargetProcess);
if( v14 < 0 )
{
_InterlockedExchangeAdd64((volatile signed __int64 *)&TargetProcess->VadPhysicalPages, -(__int64)v12);
if( Pool )
ExFreePoolWithTag((PVOID)Pool, 0);
return v14;
}
LABEL_24:
if( Pool )
{
*(_DWORD *)(Pool + 64) = 16;
MiInsertVadEvent((__int64)Vad, (_QWORD *)Pool, 0);
}
return 0;
}Referenced by:
MiAllocateChildVads
MiMapViewOfImageSection
MiReserveUserMemory