PsCreateMinimalProcess

INT64 __fastcall PsCreateMinimalProcess(
        _EPROCESS *Parent,
        _UNICODE_STRING *ProcessName,
        _PS_PROTECTION Protection,
        VOID *Token,
        UINT64 CreateFlags,
        VOID **ProcessHandle){
  ULONG_PTR v7; 
  struct _DMA_ADAPTER *v8; 
  char v9; 
  __int64 v10; 
  signed int MemoryPartitionContext; 
  _EPROCESS *v12; 
  char v13; 
  _EPROCESS *PROCESS; 
  INT64 a3; 
  PVOID a5; 
  __int64 v18; 
  const void **v19; 
  __int64 v20; 
  _QWORD *v21; 
  INT64 result[48]; 
  int v23; 
  __int64 v24; 
  struct _KAPC_STATE ApcState; 
  unsigned int ProcessHandlea; 
  char v27[8]; 
  __int64 v28; 
  __int64 v29; 
  _QWORD *v30; 
  v7 = v29;
  v20 = *(_QWORD *)&Protection;
  v19 = (const void **)ProcessName;
  a3 = v29;
  v8 = (struct _DMA_ADAPTER *)CreateFlags;
  v21 = v30;
  v18 = 0i64;
  v9 = (char)Token;
  memset(&ApcState, 0, sizeof(ApcState));
  memset((INT64)result, 0i64);
  a5 = 0i64;
  PROCESS = 0i64;
  if( !CreateFlags )
    v8 = (struct _DMA_ADAPTER *)PsReferencePrimaryToken((PEPROCESS)Parent);
  v10 = CreateFlags != 0;
  ProcessHandlea = (unsigned int)ProcessHandle | 0x800;
  MemoryPartitionContext = PspGetMemoryPartitionContext((INT64)Parent, ProcessHandlea, (INT64)&a3, v29 != 0, &a5);
  if( MemoryPartitionContext >= 0 )
  {
    MemoryPartitionContext = PspAllocateProcess(
                               (__int64)Parent,
                               0,
                               0i64,
                               v9,
                               0,
                               0,
                               0i64,
                               v8,
                               ProcessHandlea,
                               v27[0],
                               0i64,
                               CreateFlags != 0,
                               a5,
                               (__int64)&v18,
                               &PROCESS);
    if( MemoryPartitionContext < 0 )
    {
      PROCESS = 0i64;
    }
    else
    {
      if( v28 )
        *((_QWORD *)PROCESS + 280) = v28;
      v12 = PROCESS;
      if( (*((_DWORD *)PROCESS + 543) & 1) != 0 && !*((_QWORD *)PROCESS + 280) && (unsigned int)KeKvaShadowingActive() )
      {
        *((_BYTE *)v12 + 912) = 1;
        if( !_interlockedbittestandset((volatile signed __int32 *)PROCESS + 543, 0xEu) )
        {
          KeStackAttachProcess((PRKPROCESS)PROCESS, &ApcState);
          MmSynchronizeAddressPolicy((UINT64)PROCESS);
          KeUnstackDetachProcess(&ApcState);
        }
        v7 = a3;
        v12 = PROCESS;
      }
      if( v19 )
      {
        PspSetMinimalProcessName((__int64)v12, v19);
        v12 = PROCESS;
      }
      v13 = 1;
      if( (_DWORD)v18 )
        v13 = 3;
      MemoryPartitionContext = PspInsertProcess((PADAPTER_OBJECT)v12, 0i64, v13, v20, (PACCESS_STATE)result);
      if( MemoryPartitionContext < 0 )
      {
        PspRundownSingleProcess((ULONG_PTR)PROCESS, 0);
      }
      else
      {
        LODWORD(v10) = v10 | 4;
        if( !v7
          || (MemoryPartitionContext = PsAssignProcessToJobObject(v7, PROCESS, 0i64), MemoryPartitionContext >= 0) )
        {
          DbgkCreateMinimalProcess((PEPROCESS)PROCESS);
          LODWORD(v10) = v10 | 2;
          v23 |= 0x200u;
          MemoryPartitionContext = PspCreateObjectHandle(PROCESS, (INT64)result, (struct OBJECT_TYPE *)PsProcessType);
          if( MemoryPartitionContext >= 0 )
          {
            LODWORD(v10) = v10 & 0xFFFFFFFB;
            *v21 = v24;
          }
        }
      }
    }
  }
  if( (v10 & 2) != 0 )
    PspDeleteObjectAccessState((ACCESS_STATE *)result);
  if( PROCESS )
  {
    if( (unsigned int)v10 >= 4 )
      PsTerminateProcess((ULONG_PTR)PROCESS, MemoryPartitionContext);
    ObfDereferenceObjectWithTag(PROCESS, 0x72437350ui64);
  }
  if( a5 )
    PspDeleteMemoryPartitionContext(a5);
  if( (v10 & 1) == 0 )
    HalPutDmaAdapter(v8);
  return(unsigned int)MemoryPartitionContext;
}

Referenced by:

CmpInitializeRegistryProcess
PspCreatePartitionSystemProcess
PspCreatePicoProcess
PspCreateProcess
PspInitPhase1
SmFirstTimeInit
VmCreateMemoryProcess