RtlEmptyAtomTable

NTSTATUS __stdcall RtlEmptyAtomTable(VOID *AtomTableHandle, UINT8 IncludePinnedAtoms){
  unsigned int v5; 
  _RTL_ATOM_TABLE_ENTRY *i; 
  _RTL_ATOM_TABLE_ENTRY *v7; 
  _RTL_ATOM_TABLE_ENTRY *v8; 
  _RTL_ATOM_TABLE_REFERENCE *p_Reference; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v11; 
  _RTL_ATOM_TABLE_ENTRY *HashLink; 

  if( !RtlpLockAtomTable((_RTL_ATOM_TABLE *)AtomTableHandle) )
    return -1073741811;
  v5 = 0;
  for( i = (_RTL_ATOM_TABLE_ENTRY *)((char *)AtomTableHandle + 32); v5 < *((_DWORD *)AtomTableHandle + 7); ++v5 )
  {
    v7 = i;
    i = (_RTL_ATOM_TABLE_ENTRY *)((char *)i + 8);
    while( 1 )
    {
      HashLink = v7->HashLink;
      if( !v7->HashLink )
        break;
      if( IncludePinnedAtoms || (HashLink->Reference.Flags & 1) == 0 )
      {
        v8 = v7->HashLink;
        v7->HashLink = HashLink->HashLink;
        HashLink->HashLink = 0i64;
        RtlpFreeHandleForAtom((_RTL_ATOM_TABLE *)AtomTableHandle, v8);
        p_Reference = &HashLink->Reference;
        while( 1 )
        {
          Flink = p_Reference->LowBoxList.Flink;
          if( (_RTL_ATOM_TABLE_REFERENCE *)p_Reference->LowBoxList.Flink == p_Reference )
            break;
          if( (_RTL_ATOM_TABLE_REFERENCE *)Flink->Blink != p_Reference
            || (v11 = Flink->Flink, Flink->Flink->Blink != Flink) )
          {
            __fastfail(3u);
          }
          p_Reference->LowBoxList.Flink = v11;
          v11->Blink = &p_Reference->LowBoxList;
          RtlpFreeAtom(Flink);
        }
        RtlpFreeAtom(HashLink);
      }
      else
      {
        v7 = v7->HashLink;
      }
    }
  }
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)AtomTableHandle + 1, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)AtomTableHandle + 1);
  KeAbPostRelease((char *)AtomTableHandle + 8);
  KeLeaveCriticalRegion();
  return 0;
}

Referenced by:

No references.