SepDereferenceCachedHandlesEntry
NTSTATUS __stdcall SepDereferenceCachedHandlesEntry(INT64 a1, INT64 a2){
_ETHREAD *CurrentThread;
INT64 v3;
NTSTATUS v4;
__int64 v6;
char v7;
UINT8 v9;
char v10;
void *v11;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = a1 + 88;
v4 = 0;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(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((_EX_PUSH_LOCK *)v3);
KeAbPostRelease((VOID *)v3);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( !v9 )
return -1073741823;
SepCloseCachedTokenHandles(*(_DWORD *)(a2 + 56), *(VOID ***)(a2 + 64));
v11 = *(void **)(a2 + 64);
if( v11 )
ExFreePoolWithTag(v11, 0);
ExFreePoolWithTag((PVOID)a2, 0);
return v4;
}
else
{
v7 = _InterlockedExchangeAdd64((volatile signed __int64 *)v3, 0xFFFFFFFFFFFFFFFFui64);
if( (v7 & 2) != 0 && (v7 & 4) == 0 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v3);
KeAbPostRelease((VOID *)v3);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return 0;
}
}Referenced by:
NtSetInformationToken
SepSetTokenBnoIsolation
SepTokenDeleteMethod