SepSetTokenClaims

INT64 __fastcall SepSetTokenClaims(INT64 a1, UINT64 a2, INT64 a3, UINT64 a4){
  char v5; 
  INT64 result; 
  unsigned int v7; 
  UINT16 *v8; 
  _ETHREAD *CurrentThread; 
  __int64 v10; 
  INT64 v11; 
  INT64 v12; 
  void *P[3]; 
  void *v14; 
  P[0] = 0i64;
  v5 = 0;
  result = SepCreateClaimAttributes(P, a2, a3, a4, v14);
  v7 = result;
  if( (int)result >= 0 )
  {
    v8 = (UINT16 *)P[0];
    if( !P[0] )
    {
      *(_QWORD *)(a1 + 1096) = 0i64;
      return result;
    }
    if( !*(_QWORD *)(*(_QWORD *)(a1 + 216) + 112i64) )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      ExAcquirePushLockExclusiveEx(*(_QWORD *)(a1 + 216) + 104i64, 0i64);
      v10 = *(_QWORD *)(a1 + 216);
      if( !*(_QWORD *)(v10 + 112) )
      {
        v5 = 1;
        *(void **)(v10 + 112) = P[0];
        v10 = *(_QWORD *)(a1 + 216);
      }
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v10 + 104), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(v10 + 104));
      KeAbPostRelease((PVOID)(v10 + 104));
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      v8 = (UINT16 *)P[0];
      if( v5 )
        goto LABEL_13;
    }
    if( SepCompareClaimAttributes(
           (_AUTHZBASEP_CLAIM_ATTRIBUTES_COLLECTION *)v8,
           *(_AUTHZBASEP_CLAIM_ATTRIBUTES_COLLECTION **)(*(_QWORD *)(a1 + 216) + 112i64)) )
    {
LABEL_13:
      v12 = *(_QWORD *)(*(_QWORD *)(a1 + 216) + 112i64);
      *(_QWORD *)(a1 + 1096) = v12;
      if( !v5 )
        SepDeleteClaimAttributes(v8, v12, v11);
    }
    else
    {
      *(_DWORD *)(a1 + 200) |= 0x8000u;
      *(_QWORD *)(a1 + 1096) = v8;
    }
  }
  return v7;
}

Referenced by:

SepCreateTokenEx