PspSetupUserStack

__int64 __fastcall PspSetupUserStack(ULONG_PTR a1, __int64 a2, __int64 a3, char *a4, unsigned int a5){
  char v5; 
  char v6; 
  unsigned __int64 v11; 
  int UserStack; 
  __int64 v13; 
  UINT64 v15; 
  ULONG_PTR RegionSize; 
  PVOID BaseAddress; 
  _KAPC_STATE ApcState; 
  v5 = *a4;
  v6 = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  if( (v5 & 1) != 0 )
    goto LABEL_9;
  v11 = 4096i64;
  if( a5 )
    v11 = ((unsigned __int64)a5 << 56) | 0x1000;
  KiStackAttachProcess((_KPROCESS *)a1, 0i64, &ApcState);
  UserStack = RtlCreateUserStack(
                *((_QWORD *)a4 + 2),
                *((_QWORD *)a4 + 3),
                *((_QWORD *)a4 + 1),
                v11,
                v15,
                (_INITIAL_TEB *)a3);
  if( UserStack < 0 )
    goto LABEL_13;
  if( (*(_DWORD *)(a1 + 2512) & 0x40) != 0 )
    v13 = 0i64;
  else
    v13 = 16 * (unsigned int)(ExGenRandom(1i64) & 0x7F);
  if( !*(_QWORD *)(a1 + 1408) || (UserStack = PspWow64SetupCpuArea((UINT64 *)(a3 + 16), a1), UserStack >= 0) )
  {
    *(_QWORD *)(a2 + 152) = *(_QWORD *)(a3 + 16) - v13 - 40;
    KiUnstackDetachProcess(&ApcState, 0i64);
    v5 = *a4;
    v6 = 2;
LABEL_9:
    *a4 = v6 | v5 & 0xFD;
    return 0i64;
  }
  BaseAddress = *(PVOID *)(a3 + 32);
  RegionSize = 0i64;
  ZwFreeVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 0x8000ui64);
LABEL_13:
  KiUnstackDetachProcess(&ApcState, 0i64);
  return(unsigned int)UserStack;
}

Referenced by:

PspAllocateThread