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