MmCreateProcessAddressSpace
char __fastcall MmCreateProcessAddressSpace(__int64 a1, __int64 a2, unsigned __int64 a3, char a4, int a5, __int64 a6){
unsigned __int64 v7;
unsigned __int64 v8;
__int64 v9;
_MI_PARTITION *v10;
__int64 v11;
__int64 v12;
INT64 v13;
INT64 TopLevelPage;
_MM_SESSION_SPACE *v15;
INT64 v16;
__int64 v17;
CHAR v18;
INT64 v19;
CHAR v20;
__int64 v21;
UINT64 v23;
INT64 v24;
UINT64 v25[2];
CHAR v26;
UINT64 *v27;
INT64 *v28;
CHAR v29;
_MM_SESSION_SPACE *SessionGlobal;
UINT64 v31;
v31 = a3;
SessionGlobal = 0i64;
v7 = PspMinimumWorkingSet;
v8 = a3;
v9 = a6;
v25[0] = PspMinimumWorkingSet;
if( a1 )
v10 = **(_MI_PARTITION ***)(a6 + 2520);
else
v10 = (_MI_PARTITION *)&MiSystemPartition;
if( !MiMakePartitionActive(v10) )
return 0;
MiSetProcessPartitionId(v9, *(_WORD *)v10);
if( !(unsigned int)MiChargeCommit(v10, 4ui64, 0i64) )
return 0;
*(_DWORD *)(v9 + 1664) = (unsigned __int16)RtlRandomEx((UINT64 *)&Seed);
*(_QWORD *)(v9 + 2368) = v9 + 2360;
*(_QWORD *)(v9 + 2360) = v9 + 2360;
*(_QWORD *)(v9 + 2352) = 0i64;
if( v8 != PsGetDefaultWsMaximum() )
{
MiCheckWsLimits(v9 + 1664, v25, &v31, a4, 1);
v8 = v31;
v7 = v25[0];
}
*(_QWORD *)(v9 + 1776) = v7;
*(_QWORD *)(v9 + 1816) = v8;
if( (a4 & 1) != 0 )
*(_BYTE *)(v9 + 1848) |= 0x40u;
if( (int)PsChargeProcessQuota(v9, v11, v7) < 0 )
{
LABEL_23:
MiReturnCommit(v10, 4ui64);
return 0;
}
if( !(unsigned int)MiChargeResident((ULONG_PTR *)v10, v7, 0i64) )
{
LABEL_22:
PsReturnProcessQuota(v9, v12, v7);
goto LABEL_23;
}
v13 = MiReservePtes((INT64)&qword_140C4EC80, 1ui64);
if( !v13 )
{
LABEL_21:
MiReturnResident((INT64)v10, v7);
goto LABEL_22;
}
if( (int)MiAllocateProcessShadow() < 0 )
{
LABEL_20:
MiReleasePtes((INT64)&qword_140C4EC80, v13, 1ui64);
goto LABEL_21;
}
if( !(unsigned int)MiJoinSession((volatile signed __int32 **)&SessionGlobal) )
{
MiDeleteProcessShadow();
goto LABEL_20;
}
*(_QWORD *)(v9 + 1608) = 4i64;
TopLevelPage = MiAllocateTopLevelPage(v9, (UINT64 *)v13);
v15 = SessionGlobal;
v16 = TopLevelPage;
if( SessionGlobal )
{
*(_QWORD *)(v9 + 1368) = SessionGlobal;
_InterlockedOr((volatile signed __int32 *)(v9 + 1124), 0x10000u);
v15 = SessionGlobal;
}
MiInsertNewProcess((_EPROCESS *)v9, v15);
v17 = ((v13 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
MiCreateNewProcessTopLevelMappings(v9, v17);
*(_QWORD *)(v17 + 8 * (((unsigned __int64)MmGetPxeSelfRef() >> 3) & 0x1FF)) = MiMakeValidPte(0i64, v16, 2415919110i64) & 0xFFFFFFFFFFFFFEFFui64;
LODWORD(v21) = KeMakeKernelDirectoryTableBase(
(UINT64 *)(v16 << 12),
v18,
v19,
v20,
v23,
v24,
(PRIVILEGE_SET **)v25[0],
(INT64 *)v25[1],
v26,
v27,
v28,
v29);
*(_QWORD *)(v9 + 40) = v21;
MiSyncSystemPdes(v9);
MiReleasePtes((INT64)&qword_140C4EC80, v13, 1ui64);
return 1;
}Referenced by:
PspAllocateProcess