{
LoValue = (USHORT)((ULONG)AtomName & 0xFFFF);
- if (LoValue >= 0xC000)
- return FALSE;
-
if (LoValue == 0)
LoValue = 0xC000;
BOOLEAN DeletePinned)
{
PRTL_ATOM_TABLE_ENTRY *CurrentBucket, *LastBucket;
- PRTL_ATOM_TABLE_ENTRY CurrentEntry, NextEntry;
+ PRTL_ATOM_TABLE_ENTRY CurrentEntry, NextEntry, *PtrEntry;
DPRINT("RtlEmptyAtomTable (AtomTable %p DeletePinned %x)\n",
AtomTable, DeletePinned);
CurrentBucket++)
{
NextEntry = *CurrentBucket;
- *CurrentBucket = NULL;
+ PtrEntry = CurrentBucket;
while (NextEntry != NULL)
{
CurrentEntry = NextEntry;
NextEntry = NextEntry->HashLink;
- RtlpFreeAtomHandle(AtomTable,
- CurrentEntry);
+ if (DeletePinned || !(CurrentEntry->Flags & RTL_ATOM_IS_PINNED))
+ {
+ *PtrEntry = NextEntry;
- RtlpFreeAtomTableEntry(CurrentEntry);
+ RtlpFreeAtomHandle(AtomTable,
+ CurrentEntry);
+
+ RtlpFreeAtomTableEntry(CurrentEntry);
+ }
+ else
+ {
+ PtrEntry = &CurrentEntry->HashLink;
+ }
}
}
else
{
/* The caller supplied an empty atom name! */
- Status = STATUS_INVALID_PARAMETER;
+ Status = STATUS_OBJECT_NAME_INVALID;
}
}