SepSetTokenCachedHandles

INT64 __fastcall SepSetTokenCachedHandles(_QWORD *a1, CHAR **a2, UINT64 a3, PVOID *a4){
  HANDLE *v4; 
  unsigned int v5; 
  char v6; 
  HANDLE *PoolWithTag; 
  int CachedHandlesEntry; 
  _ETHREAD *CurrentThread; 
  __int64 v13; 
  bool v14; 
  __int64 v15; 
  char v16; 
  HANDLE *v17; 
  char v18; 
  bool v20; 
  _QWORD a4a[7]; 
  char a3a; 
  v4 = 0i64;
  v5 = a3;
  a4a[0] = 0i64;
  v6 = 0;
  a3a = 0;
  if( !(_DWORD)a3 )
    goto LABEL_5;
  PoolWithTag = (HANDLE *)ExAllocatePoolWithTag(PagedPool, 8i64 * (unsigned int)a3, 0x63486553ui64);
  v4 = PoolWithTag;
  if( !PoolWithTag )
    return(unsigned int)-1073741801;
  CachedHandlesEntry = SepReferenceCachedTokenHandles(v5, a4, (INT64)PoolWithTag);
  if( CachedHandlesEntry >= 0 )
  {
    v6 = 1;
    CachedHandlesEntry = SepValidateReferencedCachedHandles((INT64)a1, a2, v5, v4);
    if( CachedHandlesEntry >= 0 )
    {
LABEL_5:
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      v13 = a1[27] + 88i64;
      --*((_WORD *)CurrentThread + 242);
      ExAcquirePushLockExclusiveEx(v13, 0i64);
      if( !*(_QWORD *)(v13 + 8) && !RtlCreateHashTable((RTL_DYNAMIC_HASH_TABLE **)(v13 + 8), 0i64, 0i64) )
      {
        CachedHandlesEntry = -1073741670;
        goto LABEL_27;
      }
      CachedHandlesEntry = SepGetCachedHandlesEntry(v13, (INT64 *)a2, &a3a, a4a);
      if( CachedHandlesEntry )
      {
LABEL_27:
        v20 = (_InterlockedExchangeAdd64((volatile signed __int64 *)v13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2;
        goto LABEL_31;
      }
      v14 = 0;
      if( *(_DWORD *)a2 )
      {
        if( *(_DWORD *)a2 != 1 )
        {
LABEL_13:
          v16 = 0;
          if( !v14 )
            v16 = v6;
          v17 = 0i64;
          v6 = v16;
          if( !v14 )
            v17 = v4;
          v4 = v17;
          v18 = _InterlockedExchangeAdd64((volatile signed __int64 *)v13, 0xFFFFFFFFFFFFFFFFui64);
          if( (v18 & 2) == 0 )
            goto LABEL_18;
          v20 = (v18 & 4) == 0;
LABEL_31:
          if( v20 )
            ExfTryToWakePushLock((volatile INT64 *)v13);
LABEL_18:
          KeAbPostRelease((PVOID)v13);
          KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
          goto LABEL_19;
        }
        v14 = a3a == 0;
        v15 = a4a[0];
        a1[144] = a4a[0];
      }
      else
      {
        v15 = a4a[0];
        if( v5 )
          v14 = *(_DWORD *)(a4a[0] + 56i64) == 0;
        a1[136] = a4a[0];
      }
      if( v14 )
      {
        *(_DWORD *)(v15 + 56) = v5;
        *(_QWORD *)(v15 + 64) = v4;
      }
      goto LABEL_13;
    }
  }
LABEL_19:
  if( v4 )
  {
    if( v6 )
      SepCloseCachedTokenHandles(v5, v4);
    ExFreePoolWithTag(v4, 0);
  }
  return(unsigned int)CachedHandlesEntry;
}

Referenced by:

NtCreateLowBoxToken
SepSetTokenBnoIsolation