PspWaitForUsermodeExit

NTSTATUS __stdcall PspWaitForUsermodeExit(_EPROCESS *Process){
  _ETHREAD *i; 
  _LIST_ENTRY **NextProcessThread; 
  _ETHREAD *v4; 

LABEL_1:
  for( i = 0i64; ; i = (_ETHREAD *)NextProcessThread )
  {
    NextProcessThread = PsGetNextProcessThread(Process, i);
    v4 = (_ETHREAD *)NextProcessThread;
    if( !NextProcessThread )
      break;
    if( (*((_DWORD *)NextProcessThread + 29) & 0x400) == 0 && !*((_BYTE *)NextProcessThread + 4) )
    {
      ObfReferenceObjectWithTag(NextProcessThread, 0x65547350ui64);
      PsQuitNextProcessThread(v4);
      KeWaitForSingleObject((UINT64)v4, 0, 0, 0, 0i64);
      ObfDereferenceObjectWithTag(v4, 0x65547350ui64);
      goto LABEL_1;
    }
  }
  return 0;
}

Referenced by:

PsShutdownSystem
PspShutdownCsrProcess
PspWaitOnAllProcessesJobCallback