SepDeReferenceSharedSidEntries

VOID __stdcall SepDeReferenceSharedSidEntries(_SID_AND_ATTRIBUTES *InputSids, UINT64 SidArrayCount){
  _ETHREAD *CurrentThread; 
  unsigned int v3; 
  __int64 v5; 
  _RTL_DYNAMIC_HASH_TABLE_ENTRY *SharedSidEntry; 
  _RTL_DYNAMIC_HASH_TABLE_ENTRY *v7; 
  __int64 v8; 
  _EX_PUSH_LOCK *v9; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = SidArrayCount;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx(g_SepSidMapping, 0i64);
  if( v3 )
  {
    v5 = v3;
    do
    {
      SharedSidEntry = SepFindSharedSidEntry(InputSids->Sid);
      v7 = SharedSidEntry;
      v8 = _InterlockedDecrement64((volatile signed __int64 *)&SharedSidEntry[1]);
      if( v8 <= 0 )
      {
        if( v8 )
          __fastfail(0xEu);
        if( RtlRemoveEntryHashTable((_RTL_DYNAMIC_HASH_TABLE *)g_SepSidMapping[1]._bf_0, SharedSidEntry, 0i64) )
          ExFreePoolWithTag(v7, 0);
      }
      ++InputSids;
      --v5;
    }
    while( v5 );
  }
  v9 = g_SepSidMapping;
  if( (_InterlockedExchangeAdd64(&g_SepSidMapping->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v9);
  KeAbPostRelease(v9);
  KeLeaveCriticalRegion();
}

Referenced by:

SepFreeTokenCapabilities