PspUmsUnInitThread

INT64 __stdcall PspUmsUnInitThread(_ETHREAD *Thread, INT64 *Object){
  _ETHREAD *CurrentThread; 
  __int64 v4; 
  INT64 v5; 
  bool v6; 
  int v7; 
  signed int updated; 
  struct _DMA_ADAPTER *v9; 
  int a2; 
  a2 = 0;
  CurrentThread = Thread;
  if( !Thread )
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (*((_BYTE *)CurrentThread + 3) & 0x40) != 0 )
  {
    v4 = *((_QWORD *)Thread + 62);
    v5 = *(_QWORD *)v4;
    if( (*(_DWORD *)(v4 + 80) & 4) != 0 )
    {
      v6 = 1;
      v7 = PspRundownUmsThreadForApcDelivery((INT64)Thread, &a2, v5, 1);
      if( (*((_DWORD *)Thread + 324) & 0x10000) != 0 )
        v7 = 0;
      if( v7 < 0 || (a2 & 8) == 0 && (a2 & 1) == 0 )
        v6 = (*((_DWORD *)Thread + 324) & 0x10000) != 0;
    }
    else
    {
      KeSetUmsThreadKernelLock(v5, 0i64);
      v6 = 1;
    }
    updated = KeUpdateUmsThreadState(v5, 2i64, v6);
  }
  else
  {
    --*((_WORD *)Thread + 243);
    updated = PspDisassociateUmsThreadFromPrimary((PETHREAD)Thread, 0i64);
    KiLeaveGuardedRegionUnsafe((__int64)Thread);
  }
  v9 = *(struct _DMA_ADAPTER **)(*((_QWORD *)Thread + 62) + 16i64);
  KeUnInitializeUmsThread((INT64)Thread);
  if( v9 )
    HalPutDmaAdapter(v9);
  if( updated < 0 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1124i64) & 0x40000008) == 0 )
    PsTerminateProcess(*((_QWORD *)KeGetCurrentThread() + 23), updated);
  return(unsigned int)updated;
}

Referenced by:

PspExitThread