VmCreateMemoryProcess
NTSTATUS __stdcall VmCreateMemoryProcess(
_EPROCESS *Parent,
_UNICODE_STRING *ProcessName,
UINT64 CreateFlags,
VOID *a4,
INT64 a5,
INT64 a6){
int v6;
PS_PROTECTION v7;
int MinimalProcess;
__int16 v10;
__int16 v11;
__int16 v12;
UINT64 CreateFlagsa;
VOID **ProcessHandle;
PVOID Object;
UINT64 RegionSize;
VOID *BaseAddress;
BaseAddress = 0i64;
v6 = (int)a4;
RegionSize = 0i64;
v7.Level = (unsigned __int8)ProcessName;
LOBYTE(a4) = Parent->Protection.Level;
if( (v6 & 0xFFFFFFC0) != 0 )
return -1073741811;
v10 = ((v6 & 1) << 13) | 0x4000;
if( (v6 & 2) == 0 )
v10 = (v6 & 1) << 13;
v11 = v10;
if( (v6 & 4) == 0 )
v11 = v10;
v12 = v11 | 0x400;
if( (v6 & 0x10) == 0 )
v12 = v11;
MinimalProcess = PsCreateMinimalProcess(Parent, v7, 0i64, (UINT64)a4, (VOID **)CreateFlags);
if( MinimalProcess >= 0 )
{
BaseAddress = (VOID *)0x10000;
RegionSize = 4294901760i64;
if( (v12 & 0x6000) != 0
|| (LODWORD(ProcessHandle) = 1,
LODWORD(CreateFlagsa) = 0x2000,
MinimalProcess = ZwAllocateVirtualMemory(
0i64,
&BaseAddress,
0i64,
&RegionSize,
CreateFlagsa,
(UINT64)ProcessHandle),
MinimalProcess >= 0) )
{
if( (v6 & 8) == 0 )
{
Object = 0i64;
ObReferenceObjectByHandle(0i64, 0i64, (_OBJECT_TYPE *)PsProcessType, 0, &Object, 0i64);
_InterlockedOr((volatile signed __int32 *)Object + 543, 0x2000u);
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
}
*(_QWORD *)a6 = 0i64;
return 0;
}
}
return MinimalProcess;
}Referenced by:
No references.