PspReserveAndCommitUserShadowStack

__int64 __fastcall PspReserveAndCommitUserShadowStack(UINT64 a1, UINT64 a2, unsigned int a3, INT64 *a4, _QWORD *a5){
  NTSTATUS v7; 
  INT64 v8; 
  NTSTATUS v9; 
  UINT64 v10; 
  UINT64 AllocationType; 
  UINT64 AllocationTypea; 
  UINT64 Protect; 
  VOID *BaseAddress; 
  UINT64 RegionSize; 
  INT64 v17; 
  UINT64 v18; 
  UINT64 v19; 

  v19 = a1;
  RegionSize = 0i64;
  BaseAddress = 0i64;
  if( a3 > 0x40 || a1 < 0x3000 || (a1 & 0xFFF) != 0 || a2 < 0x1000 || (a2 & 0xFFF) != 0 || a2 > a1 - 0x2000 )
    return 3221225485i64;
  v17 = 0i64;
  v7 = MmAllocateUserStack(&v17, 0i64, &v19, a3, 1);
  v8 = v17;
  v9 = v7;
  if( v7 >= 0 )
  {
    v10 = v19;
    LODWORD(Protect) = 2;
    RegionSize = a2;
    LODWORD(AllocationType) = 4096;
    BaseAddress = (VOID *)(v19 + v17 - a2 - 4096);
    v9 = ZwAllocateVirtualMemory(
           (VOID *)0xFFFFFFFFFFFFFFFFi64,
           &BaseAddress,
           0i64,
           &RegionSize,
           AllocationType,
           Protect);
    if( v9 >= 0 )
    {
      if( v10 - a2 - 0x2000 < 0x1000
        || (BaseAddress = (char *)BaseAddress - 4096,
            LODWORD(Protect) = 258,
            LODWORD(AllocationTypea) = 4096,
            RegionSize = 4096i64,
            v9 = ZwAllocateVirtualMemory(
                   (VOID *)0xFFFFFFFFFFFFFFFFi64,
                   &BaseAddress,
                   0i64,
                   &RegionSize,
                   AllocationTypea,
                   Protect),
            v9 >= 0) )
      {
        *a5 = v8 + v10 - 4096;
        *a4 = v8;
        v8 = 0i64;
      }
    }
  }
  if( v8 )
  {
    v17 = 0i64;
    LODWORD(Protect) = 0x40000000;
    v18 = v8;
    MmFreeVirtualMemory(-1i64, &v18, &v17, 0x8000i64, 0, Protect);
  }
  return(unsigned int)v9;
}

Referenced by:

PspSetupUserFiberShadowStack
PspSetupUserShadowStack