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