SepSetTokenCachedHandles

__int64 __fastcall SepSetTokenCachedHandles(_QWORD *a1, CHAR **a2, unsigned int a3, _XSTATE_FEATURE **a4){
  _HANDLE *v4; 
  char v6; 
  VOID **PoolWithTag; 
  NTSTATUS CachedHandlesEntry; 
  _ETHREAD *CurrentThread; 
  __int64 v13; 
  bool v14; 
  _RTL_DYNAMIC_HASH_TABLE_ENTRY *v15; 
  char v16; 
  _HANDLE *v17; 
  char v18; 
  bool v20; 
  _RTL_DYNAMIC_HASH_TABLE_ENTRY *v21; 
  char v22; 

  v4 = 0i64;
  v21 = 0i64;
  v6 = 0;
  v22 = 0;
  if( !a3 )
    goto LABEL_5;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, 8i64 * a3, 1665688915i64);
  v4 = (_HANDLE *)PoolWithTag;
  if( !PoolWithTag )
    return(unsigned int)-1073741801;
  CachedHandlesEntry = SepReferenceCachedTokenHandles(a3, a4, (INT64)PoolWithTag);
  if( CachedHandlesEntry >= 0 )
  {
    v6 = 1;
    CachedHandlesEntry = SepValidateReferencedCachedHandles((INT64)a1, a2, a3, v4);
    if( CachedHandlesEntry >= 0 )
    {
LABEL_5:
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      v13 = a1[27] + 88i64;
      --CurrentThread->Tcb.KernelApcDisable;
      ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v13, 0i64);
      if( !*(_QWORD *)(v13 + 8) && !RtlCreateHashTable((_RTL_DYNAMIC_HASH_TABLE **)(v13 + 8), 0i64, 0i64) )
      {
        CachedHandlesEntry = -1073741670;
        goto LABEL_27;
      }
      CachedHandlesEntry = SepGetCachedHandlesEntry(v13, (int *)a2, &v22, &v21);
      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((_EX_PUSH_LOCK *)v13);
LABEL_18:
          KeAbPostRelease((VOID *)v13);
          KeLeaveCriticalRegionThread(KeGetCurrentThread());
          goto LABEL_19;
        }
        v14 = v22 == 0;
        v15 = v21;
        a1[144] = v21;
      }
      else
      {
        v15 = v21;
        if( a3 )
          v14 = LODWORD(v21[2].Linkage.Blink) == 0;
        a1[136] = v21;
      }
      if( v14 )
      {
        LODWORD(v15[2].Linkage.Blink) = a3;
        v15[2].Signature = (unsigned __int64)v4;
      }
      goto LABEL_13;
    }
  }
LABEL_19:
  if( v4 )
  {
    if( v6 )
      SepCloseCachedTokenHandles(a3, (VOID **)v4);
    ExFreePoolWithTag(v4, 0);
  }
  return(unsigned int)CachedHandlesEntry;
}

Referenced by:

NtCreateLowBoxToken
SepSetTokenBnoIsolation