RtlpWow64CreateUserStack

UINT64 __fastcall RtlpWow64CreateUserStack(unsigned __int64 a1, unsigned __int64 a2, __int64 a3, int a4, __int64 a5){
  ULONG_PTR v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  UINT64 result; 
  __int64 v12; 
  unsigned __int64 v13; 
  NTSTATUS v14; 
  char *v15; 
  int v16; 
  IMAGE_NT_HEADERS *v17; 
  IMAGE_NT_HEADERS *v18; 
  unsigned __int64 SizeOfStackReserve_high; 
  unsigned int SizeOfStackReserve; 
  UINT64 AllocationType; 
  UINT64 AllocationTypea; 
  UINT64 Protect; 
  UINT64 Protecta; 
  PVOID BaseAddress; 
  int v26; 
  ULONG_PTR v27[2]; 
  ULONG_PTR RegionSize; 
  ULONG_PTR v29; 
  PVOID v30; 
  int ProcessInformation; 
  int v32; 
  int v33; 
  int v34; 
  unsigned __int64 v35; 
  __int64 v36; 
  __int64 v37; 
  unsigned __int64 v38; 
  unsigned __int64 v39; 
  v39 = a1;
  v27[0] = 0i64;
  v37 = 0i64;
  v7 = *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1360i64);
  v27[1] = v7;
  if( !a1 || (v8 = a2) == 0 )
  {
    v16 = 0;
    v17 = RtlImageNtHeader(*(PVOID *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1312i64));
    v18 = v17;
    if( v17 )
    {
      SizeOfStackReserve_high = HIDWORD(v17->OptionalHeader.SizeOfStackReserve);
      SizeOfStackReserve = v18->OptionalHeader.SizeOfStackReserve;
      a1 = v39;
      if( !v39 )
        a1 = SizeOfStackReserve_high;
      v8 = a2;
      if( !a2 )
        v8 = SizeOfStackReserve;
    }
    else
    {
      v16 = -1073741701;
      v26 = -1073741701;
      v8 = a2;
      a1 = v39;
    }
    if( v16 < 0 )
      return(unsigned int)v16;
  }
  if( !a1 )
    a1 = 0x4000i64;
  if( a1 >= v8 )
    v8 = (a1 + 0xFFFFF) & 0xFFFFFFFFFFF00000ui64;
  v9 = (a1 + 4095) & 0xFFFFFFFFFFFFF000ui64;
  v10 = (v8 + 0xFFFF) & 0xFFFFFFFFFFFF0000ui64;
  v38 = *(_QWORD *)(v7 + 792);
  if( v38 && v9 < v38 )
  {
    v9 = (v38 + 4095) & 0xFFFFFFFFFFFFF000ui64;
    v10 = (v9 + 0xFFFFF) & 0xFFFFFFFFFFF00000ui64;
  }
  ProcessInformation = a4;
  v32 = 0;
  v34 = 0;
  v33 = 0;
  v35 = v10;
  v36 = a3;
  result = ZwSetInformationProcess((GROUP_AFFINITY *)0xFFFFFFFFFFFFFFFFi64);
  if( (result & 0x80000000) == 0i64 )
  {
    v12 = v37;
    *(_QWORD *)(a5 + 56) = v37;
    *(_QWORD *)(a5 + 40) = v12 + v10;
    BaseAddress = (PVOID)(v10 + v12 - v9);
    v13 = v10 - v9;
    RegionSize = v9;
    LODWORD(Protect) = 4;
    LODWORD(AllocationType) = 4096;
    v14 = ZwAllocateVirtualMemory(
            (PVOID)0xFFFFFFFFFFFFFFFFi64,
            &BaseAddress,
            0i64,
            &RegionSize,
            AllocationType,
            Protect);
    if( v14 < 0
      || (v15 = (char *)BaseAddress, *(_QWORD *)(a5 + 48) = BaseAddress, v13 >= 0x2000)
      && (BaseAddress = v15 - 0x2000,
          v27[0] = 0x2000i64,
          LODWORD(Protecta) = 260,
          LODWORD(AllocationTypea) = 4096,
          v14 = ZwAllocateVirtualMemory(
                  (PVOID)0xFFFFFFFFFFFFFFFFi64,
                  &BaseAddress,
                  0i64,
                  v27,
                  AllocationTypea,
                  Protecta),
          v14 < 0) )
    {
      v30 = *(PVOID *)(a5 + 56);
      v29 = 0i64;
      ZwFreeVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &v30, &v29, 0x8000ui64);
      *(_QWORD *)(a5 + 56) = 0i64;
      *(_QWORD *)(a5 + 40) = 0i64;
      *(_QWORD *)(a5 + 48) = 0i64;
      return(unsigned int)v14;
    }
    else
    {
      return 0i64;
    }
  }
  return result;
}

Referenced by:

PspWow64SetupUserStack