PsReferenceImpersonationTokenEx

VOID *__stdcall PsReferenceImpersonationTokenEx(
        _ETHREAD *Thread,
        UINT64 Flags,
        UINT8 *CopyOnOpen,
        UINT8 *EffectiveOnly,
        _SECURITY_IMPERSONATION_LEVEL *ImpersonationLevel,
        PS_PROTECTION *ProcessProtection){
  char v8; 
  _ETHREAD *CurrentThread; 
  _EPROCESS *Process; 
  void *AdjustedClientToken; 
  UINT8 v14; 

  v8 = Flags;
  if( (Thread->CrossThreadFlags & 8) == 0 )
    return 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Process = Thread->Tcb.Process;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx(&Thread->ThreadLock, 0i64);
  if( (Thread->CrossThreadFlags & 8) != 0 )
  {
    if( (v8 & 1) != 0 && (AdjustedClientToken = Thread->AdjustedClientToken) != 0i64 )
    {
      v14 = 0;
    }
    else
    {
      AdjustedClientToken = (void *)(Thread->ClientSecurity.ImpersonationData & 0xFFFFFFFFFFFFFFF8ui64);
      v14 = BYTE1(Thread->CrossThreadFlags) & 1;
    }
    *CopyOnOpen = v14;
    ObfReferenceObject(AdjustedClientToken);
    *ImpersonationLevel = Thread->ClientSecurity.ImpersonationData & 3;
    *EffectiveOnly = (Thread->ClientSecurity._bf_0 & 4) != 0;
    if( ProcessProtection )
      ProcessProtection->Level = (unsigned __int8)Process->Protection;
  }
  else
  {
    AdjustedClientToken = 0i64;
  }
  if( _InterlockedCompareExchange64(&Thread->ThreadLock._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(&Thread->ThreadLock);
  KeAbPostRelease(&Thread->ThreadLock);
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
  return AdjustedClientToken;
}

Referenced by:

CmpCmdHiveOpen
CmpOpenHiveFile
ObpLookupObjectName
ObpReferenceDeviceMap
PsReferenceImpersonationToken
SeCaptureSubjectContext
SeCreateClientSecurity
SeCreateClientSecurityEx
SepReferenceTokenUsingPseudoHandle