PspDeleteUserStack

VOID __stdcall PspDeleteUserStack(
        _EPROCESS *Process,
        _PS_INITIAL_TEB *InitialTeb,
        _PSP_STACK_ALLOCATION_STATE *AllocationState){
  char *v3; 
  char *v5; 
  char v6; 
  VOID *v7; 
  UINT64 v8; 
  UINT64 v9; 
  INT64 v10; 
  UINT64 RegionSize; 
  VOID *BaseAddress; 
  _KAPC_STATE ApcState; 

  memset(&ApcState, 0, sizeof(ApcState));
  v5 = v3;
  KiStackAttachProcess(Process, 0i64, &ApcState);
  v6 = *v5;
  if( (*v5 & 2) != 0 )
  {
    v7 = *(VOID **)&AllocationState[2].StackAllocationFlags;
    RegionSize = 0i64;
    BaseAddress = v7;
    ZwFreeVirtualMemory((VOID *)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 0x8000ui64);
    v6 = *v5;
  }
  if( (v6 & 4) != 0 )
  {
    v8 = *(_QWORD *)&AllocationState[3].StackSize;
    BaseAddress = 0i64;
    RegionSize = v8;
    ZwFreeVirtualMemory((VOID *)0xFFFFFFFFFFFFFFFFi64, (VOID **)&RegionSize, (UINT64 *)&BaseAddress, 0x8000ui64);
    v6 = *v5;
  }
  if( (v6 & 8) != 0 )
  {
    v9 = *(_QWORD *)&AllocationState[4].StackAllocationFlags;
    BaseAddress = 0i64;
    LODWORD(v10) = 0x40000000;
    RegionSize = v9;
    MmFreeVirtualMemory(-1i64, &RegionSize, (INT64 *)&BaseAddress, 0x8000i64, 0, v10);
  }
  KiUnstackDetachProcess(&ApcState, 0i64);
}

Referenced by:

PspAllocateThread
PspInsertThread