- 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]