- Moved ntdll's atom table implementation to rtl, rewrote it to use
proper structures and share the generic implementation between ntoskrnl
and ntdll
- Updated the rtl handle table implementation to use proper structures.
Reserved handles are not yet supported correctly.
Modified: trunk/reactos/include/ndk/extypes.h
Modified: trunk/reactos/include/ndk/rtlfuncs.h
Modified: trunk/reactos/include/ndk/rtltypes.h
Modified: trunk/reactos/include/ndk/umtypes.h
Modified: trunk/reactos/include/ntdll/rtl.h
Modified: trunk/reactos/include/ntos/rtltypes.h
Modified: trunk/reactos/lib/ntdll/ntdll.xml
Deleted: trunk/reactos/lib/ntdll/rtl/atom.c
Modified: trunk/reactos/lib/ntdll/rtl/handle.c
Modified: trunk/reactos/lib/ntdll/rtl/libsupp.c
Added: trunk/reactos/lib/rtl/atom.c
Modified: trunk/reactos/lib/rtl/rtl.xml
Deleted: trunk/reactos/ntoskrnl/include/internal/handle.h
Modified: trunk/reactos/ntoskrnl/include/ntoskrnl.h
Modified: trunk/reactos/ntoskrnl/ntoskrnl.xml
Modified: trunk/reactos/ntoskrnl/rtl/atom.c
Deleted: trunk/reactos/ntoskrnl/rtl/handle.c
Modified: trunk/reactos/ntoskrnl/rtl/libsupp.c
  _____
Modified: trunk/reactos/include/ndk/extypes.h
--- trunk/reactos/include/ndk/extypes.h 2005-06-24 16:39:49 UTC (rev
16256)
+++ trunk/reactos/include/ndk/extypes.h 2005-06-24 18:11:16 UTC (rev
16257)
@@ -86,7 +86,7 @@
     ERESOURCE HandleTableLock;
     LIST_ENTRY HandleTableList;
     KEVENT HandleContentionEvent;
-} HANDLE_TABLE;
+} HANDLE_TABLE, *PHANDLE_TABLE;
 #endif
  _____
Modified: trunk/reactos/include/ndk/rtlfuncs.h
--- trunk/reactos/include/ndk/rtlfuncs.h        2005-06-24 16:39:49 UTC
(rev 16256)
+++ trunk/reactos/include/ndk/rtlfuncs.h        2005-06-24 18:11:16 UTC
(rev 16257)
@@ -859,6 +859,14 @@
     PULONG Value
 );
+NTSTATUS
+STDCALL
+RtlHashUnicodeString(
+    IN CONST UNICODE_STRING *String,
+    IN BOOLEAN CaseInSensitive,
+    IN ULONG HashAlgorithm,
+    OUT PULONG HashValue);
+
 /*
  * Ansi String Functions
  */
@@ -1333,7 +1341,7 @@
 /*
  * Handle Table Functions
  */
-PRTL_HANDLE
+PRTL_HANDLE_TABLE_ENTRY
 STDCALL
 RtlAllocateHandle (
     IN PRTL_HANDLE_TABLE       HandleTable,
@@ -1348,7 +1356,7 @@
 STDCALL
 RtlFreeHandle (
     IN PRTL_HANDLE_TABLE       HandleTable,
-    IN PRTL_HANDLE             Handle
+    IN PRTL_HANDLE_TABLE_ENTRY Handle
 );
 VOID
@@ -1363,15 +1371,15 @@
 STDCALL
 RtlIsValidHandle (
     IN PRTL_HANDLE_TABLE       HandleTable,
-    IN PRTL_HANDLE             Handle
+    IN PRTL_HANDLE_TABLE_ENTRY Handle
 );
 BOOLEAN
 STDCALL
 RtlIsValidIndexHandle (
-    IN PRTL_HANDLE_TABLE       HandleTable,
-    IN OUT     PRTL_HANDLE             *Handle,
-    IN ULONG                   Index
+    IN PRTL_HANDLE_TABLE               HandleTable,
+    IN OUT     PRTL_HANDLE_TABLE_ENTRY *Handle,
+    IN ULONG                           Index
 );
 /*
  _____
Modified: trunk/reactos/include/ndk/rtltypes.h
--- trunk/reactos/include/ndk/rtltypes.h        2005-06-24 16:39:49 UTC
(rev 16256)
+++ trunk/reactos/include/ndk/rtltypes.h        2005-06-24 18:11:16 UTC
(rev 16257)
@@ -50,6 +50,13 @@
 #define PDI_HEAP_TAGS   0x08   /* The heap tags */
 #define PDI_HEAP_BLOCKS 0x10   /* The heap blocks */
 #define PDI_LOCKS       0x20   /* The locks created by the process */
+
+/* RTL Handle Flags */
+#define RTL_HANDLE_VALID        0x1
+
+/* RTL Atom Flags */
+#define RTL_ATOM_IS_PINNED      0x1
+
 /* ENUMERATIONS
**************************************************************/
 typedef enum
@@ -173,20 +180,23 @@
     ULONG NumberOfSharedWaiters;
     ULONG NumberOfExclusiveWaiters;
 } DEBUG_LOCK_INFORMATION, *PDEBUG_LOCK_INFORMATION;
-typedef struct _RTL_HANDLE
+
+typedef struct _RTL_HANDLE_TABLE_ENTRY
 {
-     struct _RTL_HANDLE *Next; /* pointer to next free handle */
-} RTL_HANDLE, *PRTL_HANDLE;
-
+     ULONG Flags;
+     struct _RTL_HANDLE_TABLE_ENTRY *NextFree;
+} RTL_HANDLE_TABLE_ENTRY, *PRTL_HANDLE_TABLE_ENTRY;
 typedef struct _RTL_HANDLE_TABLE
 {
-     ULONG TableSize;          /* maximum number of handles */
-     ULONG HandleSize;         /* size of handle in bytes */
-     PRTL_HANDLE Handles;              /* pointer to handle array */
-     PRTL_HANDLE Limit;                /* limit of pointers */
-     PRTL_HANDLE FirstFree;    /* pointer to first free handle */
-     PRTL_HANDLE LastUsed;     /* pointer to last allocated handle */
+     ULONG MaximumNumberOfHandles;
+     ULONG SizeOfHandleTableEntry;
+     ULONG Reserved[2];
+     PRTL_HANDLE_TABLE_ENTRY FreeHandles;
+     PRTL_HANDLE_TABLE_ENTRY CommittedHandles;
+     PRTL_HANDLE_TABLE_ENTRY UnCommittedHandles;
+     PRTL_HANDLE_TABLE_ENTRY MaxReservedHandles;
 } RTL_HANDLE_TABLE, *PRTL_HANDLE_TABLE;
+
 typedef struct _LOCK_INFORMATION
 {
     ULONG LockCount;
@@ -346,15 +356,32 @@
    SECTION_IMAGE_INFORMATION ImageInfo;
 } RTL_PROCESS_INFO, *PRTL_PROCESS_INFO;
-/* FIXME: This is a Windows Type which which we are not implementing
properly
-      The type below however is our own implementation. We will
eventually use Windows' */
-typedef struct _RTL_ATOM_TABLE
+typedef struct _RTL_ATOM_TABLE_ENTRY
 {
-    ULONG TableSize;
-    ULONG NumberOfAtoms;
-    PVOID Lock;        /* fast mutex (kernel mode)/ critical section
(user mode) */
-    PVOID HandleTable;
-    LIST_ENTRY Slot[0];
+    struct _RTL_ATOM_TABLE_ENTRY *HashLink;
+    USHORT HandleIndex;
+    USHORT Atom;
+    USHORT ReferenceCount;
+    UCHAR Flags;
+    UCHAR NameLength;
+    WCHAR Name[1];
+} RTL_ATOM_TABLE_ENTRY, *PRTL_ATOM_TABLE_ENTRY;
+
+typedef struct _RTL_ATOM_TABLE
+{
+    ULONG Signature;
+    union
+    {
+        RTL_CRITICAL_SECTION CriticalSection;
+        FAST_MUTEX FastMutex;
+    };
+    union
+    {
+        RTL_HANDLE_TABLE RtlHandleTable;
+        PHANDLE_TABLE ExHandleTable;
+    };
+    ULONG NumberOfBuckets;
+    PRTL_ATOM_TABLE_ENTRY Buckets[1];
 } RTL_ATOM_TABLE, *PRTL_ATOM_TABLE;
 /* Let Kernel Drivers use this */
  _____
Modified: trunk/reactos/include/ndk/umtypes.h
--- trunk/reactos/include/ndk/umtypes.h 2005-06-24 16:39:49 UTC (rev
16256)
+++ trunk/reactos/include/ndk/umtypes.h 2005-06-24 18:11:16 UTC (rev
16257)
@@ -1382,6 +1382,10 @@
     PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;
 } UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;
+/* FIXME - need FAST_MUTEX and PHANDLE_TABLE for RTL_ATOM_TABLE in
umode! */
+typedef void *FAST_MUTEX;
+typedef void *PHANDLE_TABLE;
+
 typedef OSVERSIONINFOW RTL_OSVERSIONINFOW;
 typedef LPOSVERSIONINFOW PRTL_OSVERSIONINFOW;
 typedef OSVERSIONINFOEXW RTL_OSVERSIONINFOEXW;
  _____
Modified: trunk/reactos/include/ntdll/rtl.h
--- trunk/reactos/include/ntdll/rtl.h   2005-06-24 16:39:49 UTC (rev
16256)
+++ trunk/reactos/include/ntdll/rtl.h   2005-06-24 18:11:16 UTC (rev
16257)
@@ -132,19 +132,21 @@
    PVOID DebugInfo; /* ?? */
 } RTL_RESOURCE, *PRTL_RESOURCE;
-typedef struct _RTL_HANDLE
+typedef struct _RTL_HANDLE_TABLE_ENTRY
 {
-   struct _RTL_HANDLE *Next;   /* pointer to next free handle */
-} RTL_HANDLE, *PRTL_HANDLE;
+     ULONG Flags;
+     struct _RTL_HANDLE_TABLE_ENTRY *NextFree;
+} RTL_HANDLE_TABLE_ENTRY, *PRTL_HANDLE_TABLE_ENTRY;
 typedef struct _RTL_HANDLE_TABLE
 {
-   ULONG TableSize;            /* maximum number of handles */
-   ULONG HandleSize;           /* size of handle in bytes */
-   PRTL_HANDLE Handles;                /* pointer to handle array */
-   PRTL_HANDLE Limit;          /* limit of pointers */
-   PRTL_HANDLE FirstFree;      /* pointer to first free handle */
-   PRTL_HANDLE LastUsed;       /* pointer to last allocated handle */
+     ULONG MaximumNumberOfHandles;
+     ULONG SizeOfHandleTableEntry;
+     ULONG Reserved[2];
+     PRTL_HANDLE_TABLE_ENTRY FreeHandles;
+     PRTL_HANDLE_TABLE_ENTRY CommittedHandles;
+     PRTL_HANDLE_TABLE_ENTRY UnCommittedHandles;
+     PRTL_HANDLE_TABLE_ENTRY MaxReservedHandles;
 } RTL_HANDLE_TABLE, *PRTL_HANDLE_TABLE;
@@ -594,7 +596,7 @@
 /* handle table functions */
-PRTL_HANDLE
+PRTL_HANDLE_TABLE_ENTRY
 STDCALL
 RtlAllocateHandle (
        IN      PRTL_HANDLE_TABLE       HandleTable,
@@ -611,7 +613,7 @@
 STDCALL
 RtlFreeHandle (
        IN      PRTL_HANDLE_TABLE       HandleTable,
-       IN      PRTL_HANDLE             Handle
+       IN      PRTL_HANDLE_TABLE_ENTRY Handle
        );
 VOID
@@ -626,14 +628,14 @@
 STDCALL
 RtlIsValidHandle (
        IN      PRTL_HANDLE_TABLE       HandleTable,
-       IN      PRTL_HANDLE             Handle
+       IN      PRTL_HANDLE_TABLE_ENTRY Handle
        );
 BOOLEAN
 STDCALL
 RtlIsValidIndexHandle (
        IN      PRTL_HANDLE_TABLE       HandleTable,
-       IN OUT  PRTL_HANDLE             *Handle,
+       IN OUT  PRTL_HANDLE_TABLE_ENTRY *Handle,
        IN      ULONG                   Index
        );
  _____
Modified: trunk/reactos/include/ntos/rtltypes.h
--- trunk/reactos/include/ntos/rtltypes.h       2005-06-24 16:39:49 UTC
(rev 16256)
+++ trunk/reactos/include/ntos/rtltypes.h       2005-06-24 18:11:16 UTC
(rev 16257)
@@ -227,18 +227,51 @@
   ULONG Unknown[11];
 } RTL_HEAP_DEFINITION, *PRTL_HEAP_DEFINITION;
+typedef struct _RTL_HANDLE_TABLE_ENTRY
+{
+     ULONG Flags;
+     struct _RTL_HANDLE_TABLE_ENTRY *NextFree;
+} RTL_HANDLE_TABLE_ENTRY, *PRTL_HANDLE_TABLE_ENTRY;
+typedef struct _RTL_HANDLE_TABLE
+{
+     ULONG MaximumNumberOfHandles;
+     ULONG SizeOfHandleTableEntry;
+     ULONG Reserved[2];
+     PRTL_HANDLE_TABLE_ENTRY FreeHandles;
+     PRTL_HANDLE_TABLE_ENTRY CommittedHandles;
+     PRTL_HANDLE_TABLE_ENTRY UnCommittedHandles;
+     PRTL_HANDLE_TABLE_ENTRY MaxReservedHandles;
+} RTL_HANDLE_TABLE, *PRTL_HANDLE_TABLE;
+
+typedef struct _RTL_ATOM_TABLE_ENTRY
+{
+    struct _RTL_ATOM_TABLE_ENTRY *HashLink;
+    USHORT HandleIndex;
+    USHORT Atom;
+    USHORT ReferenceCount;
+    UCHAR Flags;
+    UCHAR NameLength;
+    WCHAR Name[1];
+} RTL_ATOM_TABLE_ENTRY, *PRTL_ATOM_TABLE_ENTRY;
+
 typedef struct _RTL_ATOM_TABLE
 {
-  ULONG TableSize;
-  ULONG NumberOfAtoms;
-  PVOID Lock;          /* fast mutex (kernel mode)/ critical section
(user mode) */
-  PVOID HandleTable;
-  LIST_ENTRY Slot[0];
+    ULONG Signature;
+    union
+    {
+        RTL_CRITICAL_SECTION CriticalSection;
+        FAST_MUTEX FastMutex;
+    };
+    union
+    {
+        RTL_HANDLE_TABLE RtlHandleTable;
+        PHANDLE_TABLE ExHandleTable;
+    };
+    ULONG NumberOfBuckets;
+    PRTL_ATOM_TABLE_ENTRY Buckets[1];
 } RTL_ATOM_TABLE, *PRTL_ATOM_TABLE;
-
-
 #include <pshpack1.h>
 typedef struct _NLS_FILE_HEADER
  _____
Modified: trunk/reactos/lib/ntdll/ntdll.xml
--- trunk/reactos/lib/ntdll/ntdll.xml   2005-06-24 16:39:49 UTC (rev
16256)
+++ trunk/reactos/lib/ntdll/ntdll.xml   2005-06-24 18:11:16 UTC (rev
16257)
@@ -36,7 +36,6 @@
                        <file>ftol.c</file>
                </directory>
                <file>apc.c</file>
-               <file>atom.c</file>
                <file>callback.c</file>
                <file>crc32.c</file>
                <file>critical.c</file>
  _____
Deleted: trunk/reactos/lib/ntdll/rtl/atom.c
--- trunk/reactos/lib/ntdll/rtl/atom.c  2005-06-24 16:39:49 UTC (rev
16256)
+++ trunk/reactos/lib/ntdll/rtl/atom.c  2005-06-24 18:11:16 UTC (rev
16257)
@@ -1,722 +0,0 @@
-/* $Id$
- *
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS kernel
- * FILE:            lib/ntdll/rtl/atom.c
- * PURPOSE:         Atom managment
- * PROGRAMMER:      Nobody
- * UPDATE HISTORY:
- *                  Created 22/05/98
- */
-
-/* INCLUDES
*****************************************************************/
-
-#include <ntdll.h>
-#define NDEBUG
-#include <debug.h>
-
-/* LOCAL TYPES
***************************************************************/
-
-typedef struct _RTL_ATOM_ENTRY
-{
-   LIST_ENTRY List;
-   UNICODE_STRING Name;
-   ULONG RefCount;
-   BOOLEAN Locked;
-   ULONG Index;
-   PRTL_HANDLE Handle;
-} RTL_ATOM_ENTRY, *PRTL_ATOM_ENTRY;
-
-typedef struct _RTL_ATOM_HANDLE
-{
-   RTL_HANDLE Handle;
-   PRTL_ATOM_ENTRY Entry;
-} RTL_ATOM_HANDLE, *PRTL_ATOM_HANDLE;
-
-
-/* PROTOTYPES
****************************************************************/
-
-static ULONG RtlpHashAtomName(ULONG TableSize, PWSTR AtomName);
-static BOOLEAN RtlpCheckIntegerAtom(PWSTR AtomName, PUSHORT AtomValue);
-
-static NTSTATUS RtlpInitAtomTableLock(PRTL_ATOM_TABLE AtomTable);
-static VOID RtlpDestroyAtomTableLock(PRTL_ATOM_TABLE AtomTable);
-static BOOLEAN RtlpLockAtomTable(PRTL_ATOM_TABLE AtomTable);
-static VOID RtlpUnlockAtomTable(PRTL_ATOM_TABLE AtomTable);
-
-static BOOLEAN RtlpCreateAtomHandleTable(PRTL_ATOM_TABLE AtomTable);
-static VOID RtlpDestroyAtomHandleTable(PRTL_ATOM_TABLE AtomTable);
-
-
-/* FUNCTIONS
*****************************************************************/
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlCreateAtomTable(ULONG TableSize,
-                  PRTL_ATOM_TABLE *AtomTable)
-{
-   PRTL_ATOM_TABLE Table;
-   ULONG i;
-   NTSTATUS Status;
-
-   DPRINT("RtlCreateAtomTable(TableSize %lu AtomTable %p)\n",
-         TableSize, AtomTable);
-
-   if (*AtomTable != NULL)
-     {
-       return STATUS_SUCCESS;
-     }
-
-   /* allocate atom table */
-   Table = RtlAllocateHeap(RtlGetProcessHeap(),
-                          HEAP_ZERO_MEMORY,
-                          TableSize * sizeof(LIST_ENTRY) +
-                          sizeof(RTL_ATOM_TABLE));
-   if (Table == NULL)
-     {
-       return STATUS_NO_MEMORY;
-     }
-
-   /* initialize atom table */
-   Table->TableSize = TableSize;
-
-   for (i = 0; i < TableSize; i++)
-     {
-       InitializeListHead(&Table->Slot[i]);
-     }
-
-   Status = RtlpInitAtomTableLock(Table);
-   if (!NT_SUCCESS(Status))
-     {
-       RtlFreeHeap(RtlGetProcessHeap(),
-                   0,
-                   Table);
-       return Status;
-     }
-
-   if (RtlpCreateAtomHandleTable(Table) == FALSE)
-     {
-       RtlpDestroyAtomTableLock(Table);
-       RtlFreeHeap(RtlGetProcessHeap(),
-                   0,
-                   Table);
-       return STATUS_NO_MEMORY;
-     }
-
-   *AtomTable = Table;
-   return STATUS_SUCCESS;
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable)
-{
-   PLIST_ENTRY Current;
-   PRTL_ATOM_ENTRY AtomEntry;
-   ULONG i;
-
-   if (RtlpLockAtomTable(AtomTable) == FALSE)
-     {
-       return (STATUS_INVALID_PARAMETER);
-     }
-
-   /* delete all atoms */
-   for (i = 0; i < AtomTable->TableSize; i++)
-     {
-
-       Current = AtomTable->Slot[i].Flink;
-       while (Current != &AtomTable->Slot[i])
-         {
-            AtomEntry = (PRTL_ATOM_ENTRY)Current;
-            RtlFreeUnicodeString(&AtomEntry->Name);
-            RemoveEntryList(&AtomEntry->List);
-            RtlFreeHeap(RtlGetProcessHeap(),
-                        0,
-                        AtomEntry);
-            Current = AtomTable->Slot[i].Flink;
-         }
-
-     }
-
-   RtlpDestroyAtomHandleTable(AtomTable);
-
-   RtlpUnlockAtomTable(AtomTable);
-
-   RtlpDestroyAtomTableLock(AtomTable);
-
-   RtlFreeHeap(RtlGetProcessHeap(),
-              0,
-              AtomTable);
-
-   return STATUS_SUCCESS;
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlEmptyAtomTable(PRTL_ATOM_TABLE AtomTable,
-                 BOOLEAN DeletePinned)
-{
-   PLIST_ENTRY Current, Next;
-   PRTL_ATOM_ENTRY AtomEntry;
-   ULONG i;
-
-   DPRINT("RtlEmptyAtomTable (AtomTable %p DeletePinned %x)\n",
-         AtomTable, DeletePinned);
-
-   if (RtlpLockAtomTable(AtomTable) == FALSE)
-     {
-       return (STATUS_INVALID_PARAMETER);
-     }
-
-   /* delete all atoms */
-   for (i = 0; i < AtomTable->TableSize; i++)
-     {
-       Current = AtomTable->Slot[i].Flink;
-       while (Current != &AtomTable->Slot[i])
-         {
-            Next = Current->Flink;
-            AtomEntry = (PRTL_ATOM_ENTRY)Current;
-
-            if ((AtomEntry->Locked == FALSE) ||
-                ((AtomEntry->Locked == TRUE) && (DeletePinned ==
TRUE)))
-              {
-                 RtlFreeUnicodeString(&AtomEntry->Name);
-
-                 RtlFreeHandle(AtomTable->HandleTable,
-                               AtomEntry->Handle);
-
-                 RemoveEntryList(&AtomEntry->List);
-                 RtlFreeHeap(RtlGetProcessHeap(),
-                             0,
-                             AtomEntry);
-              }
-            Current = Next;
-         }
-
-     }
-
-   RtlpUnlockAtomTable(AtomTable);
-
-   return STATUS_SUCCESS;
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlAddAtomToAtomTable(IN PRTL_ATOM_TABLE AtomTable,
-                     IN PWSTR AtomName,
-                     OUT PRTL_ATOM Atom)
-{
-   ULONG Hash;
-   PLIST_ENTRY Current;
-   PRTL_ATOM_ENTRY Entry;
-   USHORT AtomValue;
-   NTSTATUS Status;
-   PRTL_ATOM_HANDLE AtomHandle;
-   ULONG AtomIndex;
-
-   DPRINT("RtlAddAtomToAtomTable (AtomTable %p AtomName %S Atom %p)\n",
-         AtomTable, AtomName, Atom);
-
-   if (RtlpCheckIntegerAtom (AtomName, &AtomValue))
-     {
-       /* integer atom */
-       if (AtomValue >= 0xC000)
-         {
-            AtomValue = 0;
-            Status = STATUS_INVALID_PARAMETER;
-         }
-       else
-         {
-            Status = STATUS_SUCCESS;
-         }
-
-       if (Atom)
-         *Atom = (RTL_ATOM)AtomValue;
-
-       return Status;
-     }
-
-   RtlpLockAtomTable(AtomTable);
-
-   /* string atom */
-   Hash = RtlpHashAtomName(AtomTable->TableSize, AtomName);
-
-   /* search for existing atom */
-   Current = AtomTable->Slot[Hash].Flink;
-   while (Current != &AtomTable->Slot[Hash])
-     {
-       Entry = (PRTL_ATOM_ENTRY)Current;
-
-       DPRINT("Comparing %S and %S\n", Entry->Name.Buffer, AtomName);
-       if (_wcsicmp(Entry->Name.Buffer, AtomName) == 0)
-         {
-            Entry->RefCount++;
-            if (Atom)
-              *Atom = (RTL_ATOM)(Entry->Index + 0xC000);
-            RtlpUnlockAtomTable(AtomTable);
-            return STATUS_SUCCESS;
-         }
-       Current = Current->Flink;
-     }
-
-   /* insert new atom */
-   Entry = RtlAllocateHeap(RtlGetProcessHeap(),
-                          HEAP_ZERO_MEMORY,
-                          sizeof(RTL_ATOM_ENTRY));
-   if (Entry == NULL)
-     {
-       RtlpUnlockAtomTable(AtomTable);
-       return STATUS_NO_MEMORY;
-     }
-
-   InsertTailList(&AtomTable->Slot[Hash], &Entry->List);
-   RtlCreateUnicodeString (&Entry->Name,
-                          AtomName);
-   Entry->RefCount = 1;
-   Entry->Locked = FALSE;
-
-   /* FIXME: use general function instead !! */
-   AtomHandle =
(PRTL_ATOM_HANDLE)RtlAllocateHandle(AtomTable->HandleTable,
-                                                   &AtomIndex);
-
-   DPRINT("AtomHandle %p AtomIndex %x\n", AtomHandle, AtomIndex);
-
-   AtomHandle->Entry = Entry;
-   Entry->Index = AtomIndex;
-   Entry->Handle = (PRTL_HANDLE)AtomHandle;
-
-   if (Atom)
-     *Atom = (RTL_ATOM)(AtomIndex + 0xC000);
-
-   RtlpUnlockAtomTable(AtomTable);
-
-   return STATUS_SUCCESS;
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlDeleteAtomFromAtomTable(IN PRTL_ATOM_TABLE AtomTable,
-                          IN RTL_ATOM Atom)
-{
-   PRTL_ATOM_HANDLE AtomHandle;
-   PRTL_ATOM_ENTRY AtomEntry;
-
-   DPRINT("RtlDeleteAtomFromAtomTable (AtomTable %p Atom %x)\n",
-         AtomTable, Atom);
-
-   if (Atom < 0xC000)
-     {
-       return STATUS_SUCCESS;
-     }
-
-   RtlpLockAtomTable(AtomTable);
-
-   /* FIXME: use general function instead !! */
-   if (!RtlIsValidIndexHandle(AtomTable->HandleTable,
-                             (PRTL_HANDLE *)&AtomHandle,
-                             (ULONG)Atom - 0xC000))
-     {
-       RtlpUnlockAtomTable(AtomTable);
-       return STATUS_INVALID_HANDLE;
-     }
-
-   DPRINT("AtomHandle %x\n", AtomHandle);
-   DPRINT("AtomHandle->Entry %x\n", AtomHandle->Entry);
-
-   AtomEntry = AtomHandle->Entry;
-
-   DPRINT("Atom name: %wZ\n", &AtomEntry->Name);
-
-   AtomEntry->RefCount--;
-
-   if (AtomEntry->RefCount == 0)
-     {
-       if (AtomEntry->Locked == TRUE)
-         {
-            DPRINT("Atom %wZ is locked!\n", &AtomEntry->Name);
-
-            RtlpUnlockAtomTable(AtomTable);
-            return STATUS_WAS_LOCKED;
-         }
-
-       DPRINT("Removing atom: %wZ\n", &AtomEntry->Name);
-
-       RtlFreeUnicodeString(&AtomEntry->Name);
-       RemoveEntryList(&AtomEntry->List);
-       RtlFreeHeap(RtlGetProcessHeap(),
-                   0,
-                   AtomEntry);
-       RtlFreeHandle(AtomTable->HandleTable,
-                     (PRTL_HANDLE)AtomHandle);
-     }
-
-   RtlpUnlockAtomTable(AtomTable);
-
-   return STATUS_SUCCESS;
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlLookupAtomInAtomTable(IN PRTL_ATOM_TABLE AtomTable,
-                        IN PWSTR AtomName,
-                        OUT PRTL_ATOM Atom)
-{
-   ULONG Hash;
-   PLIST_ENTRY Current;
-   PRTL_ATOM_ENTRY Entry;
-   USHORT AtomValue;
-   NTSTATUS Status;
-
-   DPRINT("RtlLookupAtomInAtomTable (AtomTable %p AtomName %S Atom
%p)\n",
-         AtomTable, AtomName, Atom);
-
-   if (RtlpCheckIntegerAtom (AtomName, &AtomValue))
-     {
-       /* integer atom */
-       if (AtomValue >= 0xC000)
-         {
-            AtomValue = 0;
-            Status = STATUS_INVALID_PARAMETER;
-         }
-       else
-         {
-            Status = STATUS_SUCCESS;
-         }
-
-       if (Atom)
-         *Atom = (RTL_ATOM)AtomValue;
-
-       return Status;
-     }
-
-   RtlpLockAtomTable(AtomTable);
-
-   /* string atom */
-   Hash = RtlpHashAtomName(AtomTable->TableSize, AtomName);
-
-   /* search for existing atom */
-   Current = AtomTable->Slot[Hash].Flink;
-   while (Current != &AtomTable->Slot[Hash])
-     {
-       Entry = (PRTL_ATOM_ENTRY)Current;
-
-       DPRINT("Comparing %S and %S\n", Entry->Name.Buffer, AtomName);
-       if (_wcsicmp(Entry->Name.Buffer, AtomName) == 0)
-         {
-            if (Atom)
-              *Atom = (RTL_ATOM)(Entry->Index + 0xC000);
-            RtlpUnlockAtomTable(AtomTable);
-            return STATUS_SUCCESS;
-         }
-
-       Current = Current->Flink;
-     }
-
-   RtlpUnlockAtomTable(AtomTable);
-
-   return STATUS_OBJECT_NAME_NOT_FOUND;
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlPinAtomInAtomTable(IN PRTL_ATOM_TABLE AtomTable,
-                     IN RTL_ATOM Atom)
-{
-   PRTL_ATOM_HANDLE AtomHandle;
-   PRTL_ATOM_ENTRY AtomEntry;
-
-   DPRINT("RtlPinAtomInAtomTable (AtomTable %p Atom %x)\n",
-         AtomTable, Atom);
-
-   if (Atom < 0xC000)
-     {
-       return STATUS_SUCCESS;
-     }
-
-   RtlpLockAtomTable(AtomTable);
-
-   /* FIXME: use general function instead !! */
-   if (!RtlIsValidIndexHandle(AtomTable->HandleTable,
-                             (PRTL_HANDLE *)&AtomHandle,
-                             (ULONG)Atom - 0xC000))
-     {
-       RtlpUnlockAtomTable(AtomTable);
-       return STATUS_INVALID_HANDLE;
-     }
-
-   DPRINT("AtomHandle %x\n", AtomHandle);
-   DPRINT("AtomHandle->Entry %x\n", AtomHandle->Entry);
-
-   AtomEntry = AtomHandle->Entry;
-
-   DPRINT("Atom name: %wZ\n", &AtomEntry->Name);
-
-   AtomEntry->Locked = TRUE;
-
-   RtlpUnlockAtomTable(AtomTable);
-
-   return STATUS_SUCCESS;
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlQueryAtomInAtomTable(PRTL_ATOM_TABLE AtomTable,
-                       RTL_ATOM Atom,
-                       PULONG RefCount,
-                       PULONG PinCount,
-                       PWSTR AtomName,
-                       PULONG NameLength)
-{
-   ULONG Length;
-   PRTL_ATOM_HANDLE AtomHandle;
-   PRTL_ATOM_ENTRY AtomEntry;
-
-   if (Atom < 0xC000)
-     {
-       if (RefCount != NULL)
-         {
-            *RefCount = 1;
-         }
-
-       if (PinCount != NULL)
-         {
-            *PinCount = 1;
-         }
-
-       if ((AtomName != NULL) && (NameLength != NULL) && (NameLength >
0))
-         {
-            Length = swprintf(AtomName, L"#%lu", (ULONG)Atom);
-            *NameLength = Length * sizeof(WCHAR);
-         }
-
-       return STATUS_SUCCESS;
-     }
-
-   RtlpLockAtomTable(AtomTable);
-
-   /* FIXME: use general function instead !! */
-   if (!RtlIsValidIndexHandle(AtomTable->HandleTable,
-                             (PRTL_HANDLE *)&AtomHandle,
-                             (ULONG)Atom - 0xC000))
-     {
-       RtlpUnlockAtomTable(AtomTable);
-       return STATUS_INVALID_HANDLE;
-     }
-
-   DPRINT("AtomHandle %x\n", AtomHandle);
-   DPRINT("AtomHandle->Entry %x\n", AtomHandle->Entry);
-
-   AtomEntry = AtomHandle->Entry;
-
-   DPRINT("Atom name: %wZ\n", &AtomEntry->Name);
-
-   if (RefCount != NULL)
-     {
-       *RefCount = AtomEntry->RefCount;
-     }
-
-   if (PinCount != NULL)
-     {
-       *PinCount = (ULONG)AtomEntry->Locked;
-     }
-
-   if ((AtomName != NULL) && (NameLength != NULL))
-     {
-       if (*NameLength < AtomEntry->Name.Length)
-         {
-            *NameLength = AtomEntry->Name.Length;
-            RtlpUnlockAtomTable(AtomTable);
-            return STATUS_BUFFER_TOO_SMALL;
-         }
-
-       Length = swprintf(AtomName, L"%s", AtomEntry->Name.Buffer);
-       *NameLength = Length * sizeof(WCHAR);
-     }
-
-   RtlpUnlockAtomTable(AtomTable);
-
-   return STATUS_SUCCESS;
-}
-
-
-/* INTERNAL FUNCTIONS
********************************************************/
-
-static ULONG
-RtlpHashAtomName(ULONG TableSize,
-                PWSTR AtomName)
-{
-   ULONG q = 0;
-   PWCHAR p;
-
-   DPRINT("RtlpHashAtomName(TableSize %ld AtomName '%S')\n",
-         TableSize, AtomName);
-
-   /* convert the string to an internal representation */
-   p = AtomName;
-   while (*p != 0)
-     {
-       q += (ULONG)towupper(*p);
-       p++;
-     }
-
-   DPRINT("q %lu Hash %lu\n", q, q % TableSize);
-
-   return (q % TableSize);
-}
-
-
-static BOOLEAN
-RtlpCheckIntegerAtom(PWSTR AtomName,
-                    PUSHORT AtomValue)
-{
-   UNICODE_STRING AtomString;
-   USHORT LoValue;
-   ULONG LongValue;
-   PWCHAR p;
-
-   DPRINT("RtlpCheckIntegerAtom(AtomName '%S' AtomValue %p)\n",
-         AtomName, AtomValue);
-
-   if (!((ULONG)AtomName & 0xFFFF0000))
-     {
-       LoValue = (USHORT)((ULONG)AtomName & 0xFFFF);
-
-       if (LoValue >= 0xC000)
-         return FALSE;
-
-       if (LoValue == 0)
-         LoValue = 0xC000;
-
-       if (AtomValue != NULL)
-         *AtomValue = LoValue;
-
-       return TRUE;
-     }
-
-   if (*AtomName != L'#')
-     return FALSE;
-
-   p = AtomName;
-   p++;
-   while (*p)
-     {
-       if ((*p < L'0') || (*p > L'9'))
-         return FALSE;
-       p++;
-     }
-
-   p = AtomName;
-   p++;
-   RtlInitUnicodeString(&AtomString,
-                       p);
-
-   RtlUnicodeStringToInteger(&AtomString,10, &LongValue);
-
-   *AtomValue = (USHORT)(LongValue & 0x0000FFFF);
-
-   return TRUE;
-}
-
-
-/* lock functions */
-
-static NTSTATUS
-RtlpInitAtomTableLock(PRTL_ATOM_TABLE AtomTable)
-{
-   AtomTable->Lock = RtlAllocateHeap(RtlGetProcessHeap(),
-                                    HEAP_ZERO_MEMORY,
-                                    sizeof(RTL_CRITICAL_SECTION));
-   if (AtomTable->Lock == NULL)
-     return STATUS_NO_MEMORY;
-
-
RtlInitializeCriticalSection((PRTL_CRITICAL_SECTION)AtomTable->Lock);
-
-   return STATUS_SUCCESS;
-}
-
-
-static VOID
-RtlpDestroyAtomTableLock(PRTL_ATOM_TABLE AtomTable)
-{
-   if (AtomTable->Lock)
-     {
-
RtlDeleteCriticalSection((PRTL_CRITICAL_SECTION)AtomTable->Lock);
-       RtlFreeHeap(RtlGetProcessHeap(),
-                   0,
-                   AtomTable->Lock);
-       AtomTable->Lock = NULL;
-     }
[truncated at 1000 lines; 2400 more skipped]