SepSetTokenLowboxNumber

INT64 __fastcall SepSetTokenLowboxNumber(_TOKEN *Token, VOID *PackageSid){
  __int64 SessionId; 
  VOID *v3; 
  char v5; 
  char v6; 
  int LowBoxNumberEntry; 
  __int64 *v8; 
  _ETHREAD *v9; 
  _SEP_LOWBOX_NUMBER_MAPPING *v10; 
  _ETHREAD *CurrentThread; 
  volatile signed __int64 *v13; 
  _ETHREAD *v14; 
  int TokenSessionMapEntry; 
  _ETHREAD *v16; 
  ULONG_PTR BugCheckParameter2; 
  VOID *v18; 
  _SEP_LOWBOX_NUMBER_ENTRY *MatchingEntry; 
  v18 = PackageSid;
  SessionId = Token->SessionId;
  BugCheckParameter2 = 0i64;
  MatchingEntry = 0i64;
  v3 = PackageSid;
  v5 = 0;
  v6 = 0;
  LowBoxNumberEntry = 0;
  if( (unsigned int)SessionId < 5 )
  {
    v8 = &g_SessionLowboxArray[5 * SessionId];
    BugCheckParameter2 = (ULONG_PTR)v8;
LABEL_3:
    if( !*((_BYTE *)v8 + 32) )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      v13 = (volatile signed __int64 *)BugCheckParameter2;
      ExAcquirePushLockExclusiveEx(BugCheckParameter2, 0i64);
      if( !*((_BYTE *)v8 + 32) )
        LowBoxNumberEntry = SepInitializeLowBoxNumberTable((INT64)v13);
      if( (_InterlockedExchangeAdd64(v13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)BugCheckParameter2);
      KeAbPostRelease((PVOID)BugCheckParameter2);
      KeLeaveCriticalRegion();
      v3 = v18;
    }
    if( !LowBoxNumberEntry )
    {
      v9 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v9 + 242);
      v10 = (_SEP_LOWBOX_NUMBER_MAPPING *)BugCheckParameter2;
      ExAcquirePushLockExclusiveEx(BugCheckParameter2, 0i64);
      LowBoxNumberEntry = SepGetLowBoxNumberEntry(v10, v3, &MatchingEntry);
      if( !LowBoxNumberEntry )
        Token->LowboxNumberEntry = MatchingEntry;
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)BugCheckParameter2);
      KeAbPostRelease((PVOID)BugCheckParameter2);
      KeLeaveCriticalRegion();
    }
    goto LABEL_10;
  }
  v14 = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)v14 + 242);
  ExAcquirePushLockSharedEx((UINT64)&LowboxSessionMapLock, 0i64);
  v5 = 1;
  TokenSessionMapEntry = SepGetTokenSessionMapEntry((unsigned int)SessionId, 0, (CHAR **)&BugCheckParameter2);
  LowBoxNumberEntry = TokenSessionMapEntry;
  if( TokenSessionMapEntry >= 0 )
    goto LABEL_24;
  if( TokenSessionMapEntry == -1073741275 )
  {
    if( _InterlockedCompareExchange64((volatile signed __int64 *)&LowboxSessionMapLock, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)&LowboxSessionMapLock);
    KeAbPostRelease(&LowboxSessionMapLock);
    KeLeaveCriticalRegion();
    v16 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v16 + 242);
    ExAcquirePushLockExclusiveEx((UINT64)&LowboxSessionMapLock, 0i64);
    v6 = 1;
    v5 = 0;
    LowBoxNumberEntry = SepGetTokenSessionMapEntry((unsigned int)SessionId, 1, (CHAR **)&BugCheckParameter2);
  }
  if( LowBoxNumberEntry >= 0 )
  {
LABEL_24:
    v8 = (__int64 *)BugCheckParameter2;
    goto LABEL_3;
  }
LABEL_10:
  if( v6 )
  {
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&LowboxSessionMapLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)&LowboxSessionMapLock);
    goto LABEL_29;
  }
  if( v5 )
  {
    if( _InterlockedCompareExchange64((volatile signed __int64 *)&LowboxSessionMapLock, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)&LowboxSessionMapLock);
LABEL_29:
    KeAbPostRelease(&LowboxSessionMapLock);
    KeLeaveCriticalRegion();
  }
  return(unsigned int)LowBoxNumberEntry;
}

Referenced by:

NtCreateLowBoxToken
SeExchangePrimaryToken
SeSetSessionIdToken
SeSubProcessToken
SepGetAnonymousToken