PspRevertContainerImpersonation

__int64 __fastcall PspRevertContainerImpersonation(ULONG_PTR BugCheckParameter1){
  _ETHREAD *v1; 
  UINT8 CurrentIrql; 
  struct _KPRCB *CurrentPrcb; 
  struct _KPRCB *v6; 
  __int64 v7; 
  UINT64 SpinCount; 
  v1 = *(_ETHREAD **)(BugCheckParameter1 + 1472);
  if( !v1 )
    return 3221225473i64;
  if( (*(_DWORD *)(BugCheckParameter1 + 120) & 0x200) != 0 )
  {
    KeGetCurrentIrql();
    __writecr8(2ui64);
    CurrentPrcb = KeGetCurrentPrcb();
    _disable();
    KiUpdateTotalCyclesCurrentThread((__int64)CurrentPrcb, BugCheckParameter1, 0i64);
    _enable();
    v6 = KeGetCurrentPrcb();
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((_QWORD *)CurrentPrcb + 6) );
      v7 = *((_QWORD *)v6 + 4247);
      if( v7 )
      {
        if( *((_BYTE *)v6 + 32) <= 1u )
          ++*(_DWORD *)(v7 + 24);
      }
    }
    _interlockedbittestandreset((volatile signed __int32 *)BugCheckParameter1, 0x12u);
    *(_QWORD *)(BugCheckParameter1 + 104) = 0i64;
    _interlockedbittestandreset((volatile signed __int32 *)(BugCheckParameter1 + 120), 9u);
    _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
    __writecr8(0i64);
  }
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  ExpAcquireSpinLockExclusive((INT64 *)PspThreadWorkOnBehalfLock, CurrentIrql);
  *(_QWORD *)(BugCheckParameter1 + 1472) = 0i64;
  KeClearSystemPriority((PVOID)BugCheckParameter1);
  *(_DWORD *)PspThreadWorkOnBehalfLock = 0;
  __writecr8(CurrentIrql);
  EtwTraceThreadWorkOnBehalfUpdate(v1, 0i64);
  ObDereferenceObjectDeferDeleteWithTag(v1, 0x746E6F43ui64);
  return 0i64;
}

Referenced by:

IopProcessWorkItem
NtRevertContainerImpersonation
NtSetInformationThread
PsImpersonateContainerOfThread
PspExitThread