PsImpersonateClient

INT64 __stdcall PsImpersonateClient(
        _ETHREAD *Thread,
        PVOID Token,
        UINT8 CopyOnOpen,
        UINT8 EffectiveOnly,
        _SECURITY_IMPERSONATION_LEVEL ImpersonationLevel){
  _EX_FAST_REF *v5; 
  char v6; 
  unsigned __int64 v9; 
  struct _DMA_ADAPTER *v11; 
  struct _DMA_ADAPTER *v12; 
  _ETHREAD *CurrentThread; 
  char v14; 
  bool v15; 
  _ETHREAD *v16; 
  _EX_FAST_REF *v17; 
  struct DMA_ADAPTER *v18; 
  _SECURITY_IMPERSONATION_LEVEL v19; 
  CHAR v20; 
  char v21; 
  _ETHREAD *v22; 
  unsigned __int64 v23; 
  char v24; 
  VOID *ProcessTrustSid; 
  CHAR v27; 
  int v28; 
  _SECURITY_IMPERSONATION_LEVEL v29; 
  INT64 *v30; 
  PVOID TokenToBeLinked; 
  VOID *DuplicateToken; 
  UINT8 UseProcessTrust; 
  _ETHREAD *v34; 
  v5 = (_EX_FAST_REF *)*((_QWORD *)Thread + 68);
  v6 = 0;
  DuplicateToken = 0i64;
  UseProcessTrust = 0;
  v9 = (unsigned __int64)Token;
  TokenToBeLinked = 0i64;
  if( !Token )
  {
    v11 = 0i64;
    v12 = 0i64;
    if( (*((_DWORD *)Thread + 324) & 8) == 0 )
      return 0i64;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockExclusiveEx((UINT64)Thread + 1280, 0i64);
    if( (*((_DWORD *)Thread + 324) & 8) != 0 )
    {
      v12 = (struct _DMA_ADAPTER *)*((_QWORD *)Thread + 183);
      v11 = (struct _DMA_ADAPTER *)(*((_QWORD *)Thread + 149) & 0xFFFFFFFFFFFFFFF8ui64);
      *((_QWORD *)Thread + 183) = 0i64;
      _InterlockedAnd((volatile signed __int32 *)Thread + 324, 0xFFFFFFF7);
    }
    v14 = _InterlockedExchangeAdd64((volatile signed __int64 *)Thread + 160, 0xFFFFFFFFFFFFFFFFui64);
    if( (v14 & 2) != 0 && (v14 & 4) == 0 )
      ExfTryToWakePushLock((volatile INT64 *)Thread + 160);
    KeAbPostRelease((char *)Thread + 1280);
    v15 = (*((_WORD *)CurrentThread + 242))++ == 0xFFFF;
    if( v15
      && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152)
      && !*((_WORD *)CurrentThread + 243) )
    {
      KiCheckForKernelApcDelivery();
    }
    v16 = CurrentThread;
LABEL_21:
    PspWriteTebImpersonationInfo(Thread, v16);
    if( v11 )
      HalPutDmaAdapter(v11);
    if( v12 )
      HalPutDmaAdapter(v12);
    return 0i64;
  }
  v17 = v5 + 151;
  v18 = (struct DMA_ADAPTER *)ObFastReferenceObject((INT64 *)&v5[151]);
  if( !v18 )
  {
    v34 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v34 + 242);
    v30 = (INT64 *)&v5[135];
    ExAcquirePushLockSharedEx((UINT64)v30, 0i64);
    v18 = (struct DMA_ADAPTER *)ObFastReferenceObjectLocked(v17);
    if( _InterlockedCompareExchange64(v30, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v30);
    KeAbPostRelease(v30);
    KeLeaveCriticalRegionThread((__int64)v34);
    if( !v18 )
    {
      v21 = ImpersonationLevel;
      goto LABEL_13;
    }
  }
  v19 = ImpersonationLevel;
  LODWORD(v34) = ImpersonationLevel;
  if( (int)SeTokenCanImpersonate(v18, (PVOID)v9, ImpersonationLevel, &UseProcessTrust) < 0 )
  {
    v15 = *(_DWORD *)(v9 + 192) == 2;
    v29 = SecurityIdentification;
    LODWORD(v34) = 1;
    if( v15 && *(int *)(v9 + 196) < 1 )
    {
      v29 = *(_DWORD *)(v9 + 196);
      LODWORD(v34) = v29;
    }
    v28 = SeCopyClientToken((VOID *)v9, v29, v20, 0, 0i64, &DuplicateToken);
    if( v28 >= 0 )
    {
      v9 = (unsigned __int64)DuplicateToken;
      v6 = 1;
      goto LABEL_12;
    }
  }
  else
  {
    if( !UseProcessTrust )
      goto LABEL_12;
    LODWORD(ProcessTrustSid) = SeQueryTokenTrustSid(v18);
    v28 = SeCopyClientToken((VOID *)v9, v19, v27, 1u, ProcessTrustSid, &TokenToBeLinked);
    if( v28 >= 0 )
    {
      if( CopyOnOpen )
      {
        SeSetTokenTrustLink(TokenToBeLinked, (PVOID)v9);
      }
      else
      {
        v9 = (unsigned __int64)TokenToBeLinked;
        TokenToBeLinked = 0i64;
        v6 = 1;
      }
LABEL_12:
      ObFastDereferenceObject((INT64 *)v17, v18);
      v15 = v6 == 0;
      v21 = (char)v34;
      if( !v15 )
      {
LABEL_14:
        v22 = (_ETHREAD *)KeGetCurrentThread();
        v23 = v9 & 0xFFFFFFFFFFFFFFF8ui64 | v21 & 3 | (4i64 * (EffectiveOnly & 1));
        --*((_WORD *)v22 + 242);
        ExAcquirePushLockExclusiveEx((UINT64)Thread + 1280, 0i64);
        if( (*((_DWORD *)Thread + 324) & 8) != 0 )
        {
          v12 = (struct _DMA_ADAPTER *)*((_QWORD *)Thread + 183);
          v11 = (struct _DMA_ADAPTER *)(*((_QWORD *)Thread + 149) & 0xFFFFFFFFFFFFFFF8ui64);
        }
        else
        {
          v11 = 0i64;
          v12 = 0i64;
          _InterlockedOr((volatile signed __int32 *)Thread + 324, 8u);
        }
        *((_QWORD *)Thread + 183) = TokenToBeLinked;
        *((_QWORD *)Thread + 149) = v23;
        if( CopyOnOpen )
          _InterlockedOr((volatile signed __int32 *)Thread + 324, 0x100u);
        else
          _InterlockedAnd((volatile signed __int32 *)Thread + 324, 0xFFFFFEFF);
        v24 = _InterlockedExchangeAdd64((volatile signed __int64 *)Thread + 160, 0xFFFFFFFFFFFFFFFFui64);
        if( (v24 & 2) != 0 && (v24 & 4) == 0 )
          ExfTryToWakePushLock((volatile INT64 *)Thread + 160);
        KeAbPostRelease((char *)Thread + 1280);
        v15 = (*((_WORD *)v22 + 242))++ == 0xFFFF;
        if( v15 && *((_ETHREAD **)v22 + 19) != (_ETHREAD *)((char *)v22 + 152) && !*((_WORD *)v22 + 243) )
          KiCheckForKernelApcDelivery();
        v16 = v22;
        goto LABEL_21;
      }
LABEL_13:
      ObfReferenceObject((PVOID)v9);
      goto LABEL_14;
    }
  }
  ObFastDereferenceObject((INT64 *)v17, v18);
  return(unsigned int)v28;
}

Referenced by:

AlpcpImpersonateMessage
CmpCmdHiveOpen
CmpOpenHiveFile
NtImpersonateAnonymousToken
PsAssignImpersonationToken
PsRevertThreadToSelf
PsRevertToSelf
SeImpersonateClientEx