RtlpDereferenceAtom

UINT8 __stdcall RtlpDereferenceAtom(
        _RTL_ATOM_TABLE_ENTRY *AtomEntry,
        _RTL_ATOM_TABLE_REFERENCE *LowBox,
        _RTL_ATOM_TABLE *AtomTable){
  bool v5; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 

  if( (LowBox->Flags & 1) != 0 )
    return 0;
  v5 = LowBox->ReferenceCount-- == 1;
  if( !v5 )
    return 0;
  if( LowBox != &AtomEntry->Reference )
  {
    Flink = LowBox->LowBoxList.Flink;
    if( (_RTL_ATOM_TABLE_REFERENCE *)LowBox->LowBoxList.Flink->Blink != LowBox
      || (Blink = LowBox->LowBoxList.Blink, (_RTL_ATOM_TABLE_REFERENCE *)Blink->Flink != LowBox) )
    {
      __fastfail(3u);
    }
    Blink->Flink = Flink;
    Flink->Blink = Blink;
    RtlpFreeAtom(LowBox);
    if( (AtomEntry->Reference.Flags & 1) != 0 )
      return 0;
    v5 = AtomEntry->Reference.ReferenceCount-- == 1;
    if( !v5 )
      return 0;
  }
  RtlpFreeAllAtom(AtomEntry, AtomTable);
  return 1;
}

Referenced by:

RtlDeleteAtomFromAtomTable
RtlDestroyLowBoxAtoms