MiAllocateChildVads
NTSTATUS __stdcall MiAllocateChildVads(ULONG_PTR ProcessToInitialize, UINT64 *LargePageVads){
_EPROCESS *v2;
_MMVAD_SHORT *p_Core;
int v4;
_QWORD *Children;
_RTL_BALANCED_NODE *i;
_QWORD **v8;
INT64 v9;
_QWORD *v10;
_QWORD *v11;
int v12;
unsigned int v13;
unsigned __int64 v14;
_MMVAD *Pool;
_MMVAD *v16;
union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v17;
unsigned int v18;
int v19;
int inserted;
__int64 LongFlags1;
int v22;
unsigned __int64 v23;
int v24;
int v25;
NTSTATUS v26;
int v28;
int v29;
_KAPC_STATE ApcState;
v2 = *(_EPROCESS **)&ProcessToInitialize;
memset(&ApcState, 0, sizeof(ApcState));
p_Core = 0i64;
v4 = 0;
Children = 0i64;
for( i = KeGetCurrentThread()->ApcState.Process->VadRoot.Root; i; i = i->Children[0] )
Children = i->Children;
while( 1 )
{
do
{
if( !Children )
return MiInsertChildVads((ULONG_PTR)v2, p_Core);
v8 = (_QWORD **)Children[1];
v9 = (INT64)Children;
v10 = Children;
if( v8 )
{
v11 = *v8;
for( Children = (_QWORD *)Children[1]; v11; v11 = (_QWORD *)*v11 )
Children = v11;
}
else
{
while( 1 )
{
Children = (_QWORD *)(Children[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !Children || (_QWORD *)*Children == v10 )
break;
v10 = Children;
}
}
}
while( !MiVadShouldBeForked(v9) );
v12 = *(_DWORD *)(v9 + 48);
v13 = 1818517846;
v14 = (-(__int64)((v12 & 0x100000) != 0) & 0xFFFFFFFFFFFFFFB8ui64) + 136;
if( (v12 & 0x100000) == 0 && (v12 & 0x70) == 32 && (v12 & 0x200000) != 0 )
{
v13 = 1231315286;
v14 = 8
* (((unsigned __int64)*(unsigned int *)(***(_QWORD ***)(v9 + 72) + 8i64) >> 6)
+ ((*(_DWORD *)(***(_QWORD ***)(v9 + 72) + 8i64) & 0x3F) != 0)
+ 20i64);
}
Pool = (_MMVAD *)MiAllocatePool(64i64, v14, v13);
v16 = Pool;
if( !Pool )
break;
memmove(Pool, (const VOID *)v9, v14);
v17.LongFlags = (unsigned int)v16->Core.u;
if( (*(_DWORD *)(v9 + 48) & 0x100000) != 0 )
v17.LongFlags &= ~8u;
else
v16->VadsProcess = (_EPROCESS *)((unsigned __int64)v2 | 1);
v16->Core.EventList = 0i64;
v18 = v17.LongFlags & 0xFFFFFFFC;
v16->Core.ReferenceCount = 0;
v16->Core.PushLock._bf_0 = 0i64;
v16->Core.ExtraCreateInfo = 0i64;
v16->Core.u.LongFlags = v18;
if( (v18 & 0x100000) == 0 && (v18 & 0x70) == 32 && (v18 & 0x400000) != 0 )
v16->Core.u.LongFlags = v18 & 0xFFBFFFFF;
v16->Core.VadNode.ParentValue = -2i64;
LOBYTE(v19) = MiVadHasSharedCommit(v9);
if( v19 )
{
inserted = MiInsertSharedCommitNode(**(_RTL_BALANCED_NODE ***)(v9 + 72), v2, 0i64);
if( inserted < 0 )
goto LABEL_52;
}
if( MiVadPureReserve(&v16->Core) )
{
LongFlags1 = v16->Core.u1.LongFlags1;
LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
if( (LongFlags1 | ((unsigned __int64)v16->Core.CommitChargeHigh << 31)) < 0x7FFFFFFFDi64 )
{
inserted = MiCloneCaptureVadCommit((INT64)v16);
if( inserted < 0 )
{
LOBYTE(v28) = MiVadHasSharedCommit((INT64)v16);
if( v28 )
MiRemoveSharedCommitNode(v16->Subsection->ControlArea, v2, 0i64);
LABEL_52:
ExFreePoolWithTag(v16, 0);
v16 = 0i64;
goto LABEL_56;
}
}
}
if( (*(_DWORD *)(v9 + 48) & 8) != 0 )
{
inserted = MiCloneNoChange((_MMVAD_SHORT *)v9, &v16->Core);
if( inserted < 0 )
goto LABEL_56;
}
if( MiLocateVadEvent(v9, 128) )
{
KiStackAttachProcess(v2, 0i64, &ApcState);
v4 = 1;
inserted = MiCreatePlaceholderStorage(&v16->Core);
if( inserted < 0 )
goto LABEL_56;
}
if( (*(_DWORD *)(v9 + 48) & 0x300000) == 3145728 )
{
if( !v4 )
{
KiStackAttachProcess(v2, 0i64, &ApcState);
v4 = 1;
}
inserted = MiCreateWriteWatchView(
v2,
&v16->Core,
(v16->Core.EndingVpn | ((unsigned __int64)v16->Core.EndingVpnHigh << 32))
- (v16->Core.StartingVpn | ((unsigned __int64)v16->Core.StartingVpnHigh << 32))
+ 1);
if( inserted < 0 )
goto LABEL_56;
}
LOBYTE(v22) = MiIsVadLargePrivate(v9);
if( v22 )
{
v23 = *(_DWORD *)(v9 + 52) & 0x7FFFFFFF | ((unsigned __int64)*(unsigned __int8 *)(v9 + 34) << 31);
v24 = (v23 ^ v16->Core.u1.LongFlags1) & 0x7FFFFFFF;
v16->Core.CommitChargeHigh = v23 >> 31;
v16->Core.u1.LongFlags1 ^= v24;
inserted = MiCreateLargePageVad(v2, &v16->Core);
if( inserted < 0 )
goto LABEL_56;
++*LargePageVads;
}
else
{
v25 = *(_DWORD *)(v9 + 48) & 0x70;
if( v25 == 32 )
{
v26 = MiCloneImageVad(v2, v16, (_MMVAD *)v9);
}
else
{
if( v25 != 80 || !*(_QWORD *)(**(_QWORD **)(v9 + 72) + 64i64) )
goto LABEL_47;
v26 = MiCloneLargeFileOnlyVad((_MMVAD *)v9);
}
inserted = v26;
if( v26 < 0 )
goto LABEL_56;
}
LABEL_47:
if( v4 )
{
KiUnstackDetachProcess(&ApcState, 0i64);
v4 = 0;
}
v16->Core.NextVad = p_Core;
p_Core = &v16->Core;
}
inserted = -1073741670;
LABEL_56:
if( !v4 )
KiStackAttachProcess(v2, 0i64, &ApcState);
if( v16 )
{
LOBYTE(v29) = MiVadHasSharedCommit((INT64)v16);
if( v29 )
MiRemoveSharedCommitNode(v16->Subsection->ControlArea, v2, 0i64);
MiCloneDiscardVadCommit((INT64)v16);
MiFreeVadEventBitmap((ULONG_PTR)v2, &v16->Core, 4ui64);
MiFreePlaceholderStorage((INT64)v16);
MiFreeVadEvents(&v16->Core);
ExFreePoolWithTag(v16, 0);
}
if( p_Core )
MiDeletePartialCloneVads(p_Core);
KiUnstackDetachProcess(&ApcState, 0i64);
return inserted;
}Referenced by:
MiCloneProcessAddressSpace