PspWriteTebImpersonationInfo

INT64 __stdcall PspWriteTebImpersonationInfo(_ETHREAD *Thread, _ETHREAD *CurrentThread){
  _DWORD *v4; 
  __int64 v5; 
  int v6; 
  bool v7; 
  _BOOL8 v8; 
  __int64 v9; 
  __int16 v10; 
  int v12[8]; 
  char v13; 
  bool v14; 
  _DWORD *v15; 
  __int64 v16; 
  _ETHREAD *v17; 
  _KAPC_STATE ApcState; 
  v17 = Thread;
  memset(&ApcState, 0, sizeof(ApcState));
  v4 = (_DWORD *)*((_QWORD *)Thread + 30);
  v15 = v4;
  if( v4 && (*((_DWORD *)Thread + 29) & 0x400) == 0 )
  {
    v5 = *((_QWORD *)Thread + 68);
    v16 = v5;
    if( *((_QWORD *)CurrentThread + 23) == v5 )
    {
      v13 = 0;
    }
    else
    {
      KiStackAttachProcess((_KPROCESS *)v5, 0i64, &ApcState);
      v13 = 1;
    }
    if( Thread == CurrentThread || ExAcquireRundownProtection((PEX_RUNDOWN_REF)Thread + 159) )
    {
      do
      {
        v6 = *((_DWORD *)Thread + 324) & 8;
        v7 = v6 != 0;
        v14 = v6 != 0;
        v8 = v6 != 0;
        v4[1511] = v8;
        v4[1530] = 0;
        v9 = *(_QWORD *)(v5 + 1408);
        if( v9 )
        {
          v10 = *(_WORD *)(v9 + 8);
          if( v10 == 332 || v10 == 452 )
          {
            v4[3047] = v8;
            v4[3057] = 0;
          }
        }
        _InterlockedOr(v12, 0);
      }
      while( v7 != ((*((_DWORD *)Thread + 324) & 8) != 0) );
      if( Thread != CurrentThread )
        ExReleaseRundownProtection((PEX_RUNDOWN_REF)Thread + 159);
    }
    if( v13 )
      KiUnstackDetachProcess(&ApcState, 0i64);
  }
  return 0i64;
}

Referenced by:

PsImpersonateClient
PsRestoreImpersonation