SepDereferenceCachedHandlesEntry
INT64 __fastcall SepDereferenceCachedHandlesEntry(INT64 a1, INT64 a2){
_ETHREAD *CurrentThread;
INT64 v3;
unsigned int v4;
__int64 v6;
char v7;
UINT8 v9;
char v10;
void *v11;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = a1 + 88;
v4 = 0;
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(a1 + 88, 0i64);
v6 = _InterlockedDecrement64((volatile signed __int64 *)(a2 + 24));
if( v6 <= 0 )
{
if( v6 )
__fastfail(0xEu);
v9 = RtlRemoveEntryHashTable(*(RTL_DYNAMIC_HASH_TABLE **)(v3 + 8), (RTL_DYNAMIC_HASH_TABLE_ENTRY *)a2, 0i64);
v10 = _InterlockedExchangeAdd64((volatile signed __int64 *)v3, 0xFFFFFFFFFFFFFFFFui64);
if( (v10 & 2) != 0 && (v10 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)v3);
KeAbPostRelease((PVOID)v3);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v9 )
{
SepCloseCachedTokenHandles(*(unsigned int *)(a2 + 56), *(HANDLE **)(a2 + 64));
v11 = *(void **)(a2 + 64);
if( v11 )
ExFreePoolWithTag(v11, 0);
ExFreePoolWithTag((PVOID)a2, 0);
}
else
{
return(unsigned int)-1073741823;
}
return v4;
}
else
{
v7 = _InterlockedExchangeAdd64((volatile signed __int64 *)v3, 0xFFFFFFFFFFFFFFFFui64);
if( (v7 & 2) != 0 && (v7 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)v3);
KeAbPostRelease((PVOID)v3);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return 0i64;
}
}Referenced by:
NtSetInformationToken
SepSetTokenBnoIsolation
SepTokenDeleteMethod