PsSwapImpersonationToken

__int64 __fastcall PsSwapImpersonationToken(__int64 a1, struct _DMA_ADAPTER *a2, struct _DMA_ADAPTER *a3){
  int v3; 
  struct _DMA_ADAPTER *v7; 
  _ETHREAD *CurrentThread; 
  __int64 v9; 
  char v10; 
  struct _DMA_ADAPTER *v12; 
  v3 = 0;
  v7 = 0i64;
  if( (*(_DWORD *)(a1 + 1296) & 8) != 0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    ObfReferenceObject(a3);
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockExclusiveEx(a1 + 1280, 0i64);
    if( (*(_DWORD *)(a1 + 1296) & 8) != 0 )
    {
      v9 = *(_QWORD *)(a1 + 1192);
      if( (struct _DMA_ADAPTER *)(v9 & 0xFFFFFFFFFFFFFFF8ui64) == a2 && (*(_DWORD *)(a1 + 1296) & 0x100) != 0 )
      {
        v7 = *(struct _DMA_ADAPTER **)(a1 + 1464);
        *(_QWORD *)(a1 + 1464) = 0i64;
        *(_QWORD *)(a1 + 1192) = (unsigned __int64)a3 | v9 & 7;
        _InterlockedAnd((volatile signed __int32 *)(a1 + 1296), 0xFFFFFEFF);
      }
      else
      {
        v3 = -1073741823;
      }
    }
    else
    {
      v3 = -1073741700;
    }
    v10 = _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 1280), 0xFFFFFFFFFFFFFFFFui64);
    if( (v10 & 2) != 0 && (v10 & 4) == 0 )
      ExfTryToWakePushLock((volatile INT64 *)(a1 + 1280));
    KeAbPostRelease((PVOID)(a1 + 1280));
    KeLeaveCriticalRegionThread((__int64)CurrentThread);
    if( v3 < 0 )
    {
      v12 = a3;
    }
    else
    {
      HalPutDmaAdapter(a2);
      if( !v7 )
        return(unsigned int)v3;
      v12 = v7;
    }
    HalPutDmaAdapter(v12);
    return(unsigned int)v3;
  }
  return 3221225596i64;
}

Referenced by:

NtOpenThreadTokenEx