Fix kernel-mode executive atom implementation (mostly add SEH and tidy
up the code). Then fix kernel32 implementation which was sending
incorrect sizes, and also re-factored the entire code, since most
functions were quatriplicated. now there are 3 main functions instead of
12. Also fixed a bug in RtlCreateAtomTable.
Modified: trunk/reactos/lib/kernel32/misc/atom.c
Modified: trunk/reactos/lib/rtl/atom.c
Modified: trunk/reactos/ntoskrnl/ex/atom.c
_____
Modified: trunk/reactos/lib/kernel32/misc/atom.c
--- trunk/reactos/lib/kernel32/misc/atom.c 2005-12-29 05:18:21 UTC
(rev 20413)
+++ trunk/reactos/lib/kernel32/misc/atom.c 2005-12-29 08:43:45 UTC
(rev 20414)
@@ -1,635 +1,584 @@
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/kernel32/misc/atom.c
* PURPOSE: Atom functions
- * PROGRAMMER: Eric Kohl ( ariadne(a)xs4all.nl)
- * UPDATE HISTORY:
- * Created 01/11/98
- * Full rewrite 27/05/2001
+ * PROGRAMMERS: Alex Ionescu (alex(a)relsoft.net)
*/
+/* INCLUDES
******************************************************************/
#include <k32.h>
#define NDEBUG
#include "../include/debug.h"
-
/* GLOBALS
*******************************************************************/
-static PRTL_ATOM_TABLE LocalAtomTable = NULL;
+PRTL_ATOM_TABLE BaseLocalAtomTable = NULL;
-static PRTL_ATOM_TABLE GetLocalAtomTable(VOID);
-
-
/* FUNCTIONS
*****************************************************************/
-/*
- * @implemented
- */
-ATOM STDCALL
-GlobalAddAtomA(LPCSTR lpString)
+PVOID
+WINAPI
+InternalInitAtomTable(VOID)
{
- UNICODE_STRING AtomName;
- NTSTATUS Status;
- ATOM Atom;
+ /* Create or return the local table */
+ if (!BaseLocalAtomTable) RtlCreateAtomTable(0,
&BaseLocalAtomTable);
+ return BaseLocalAtomTable;
+}
- if (HIWORD((ULONG)lpString) == 0)
- {
- if ((ULONG)lpString >= 0xC000)
- {
- SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
- return (ATOM)0;
- }
- return (ATOM)LOWORD((ULONG)lpString);
- }
+ATOM
+WINAPI
+InternalAddAtom(BOOLEAN Local,
+ BOOLEAN Unicode,
+ LPCSTR AtomName)
+{
+ NTSTATUS Status;
+ ANSI_STRING AnsiString;
+ UNICODE_STRING UnicodeString;
+ PUNICODE_STRING AtomNameString;
+ ATOM Atom = INVALID_ATOM;
- if (lstrlenA(lpString) > 255)
- {
- /* This limit does not exist with NtAddAtom so the limit is
probably
- * added for compability. -Gunnar
- */
- SetLastError(ERROR_INVALID_PARAMETER);
- return (ATOM)0;
- }
+ /* Check if it's an integer atom */
+ if ((ULONG_PTR)AtomName <= 0xFFFF)
+ {
+ /* Convert the name to an atom */
+ Atom = (ATOM)PtrToShort((PVOID)AtomName);
+ if (Atom >= MAXINTATOM)
+ {
+ /* Fail, atom number too large */
+ SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
+ return INVALID_ATOM;
+ }
- RtlCreateUnicodeStringFromAsciiz(&AtomName,
- (LPSTR)lpString);
+ /* Return it */
+ return Atom;
+ }
+ else
+ {
+ /* Check if this is a unicode atom */
+ if (Unicode)
+ {
+ /* Use a unicode string */
+ AtomNameString = &UnicodeString;
+ RtlInitUnicodeString(AtomNameString, (LPWSTR)AtomName);
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ /* Use an ansi string */
+ RtlInitAnsiString(&AnsiString, AtomName );
- Status = NtAddAtom(AtomName.Buffer,
- AtomName.Length,
- &Atom);
- RtlFreeUnicodeString(&AtomName);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return (ATOM)0;
- }
+ /* Check if we can abuse the TEB */
+ if (AnsiString.MaximumLength > 260)
+ {
+ /* We can't, allocate a new string */
+ AtomNameString = &UnicodeString;
+ Status = RtlAnsiStringToUnicodeString(AtomNameString,
+ &AnsiString,
+ TRUE);
+ }
+ else
+ {
+ /* We can! Use the TEB */
+ AtomNameString = &NtCurrentTeb()->StaticUnicodeString;
+ Status = RtlAnsiStringToUnicodeString(AtomNameString,
+ &AnsiString,
+ FALSE);
+ }
+ }
- return Atom;
-}
+ /* Check for failure */
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return Atom;
+ }
+ }
+ /* Check if we're doing local add */
+ if (Local)
+ {
+ /* Do a local add */
+ Status = RtlAddAtomToAtomTable(InternalInitAtomTable(),
+ AtomNameString->Buffer,
+ &Atom);
+ }
+ else
+ {
+ /* Do a global add */
+ Status = NtAddAtom(AtomNameString->Buffer,
+ AtomNameString->Length,
+ &Atom);
+ }
-/*
- * @implemented
- */
-ATOM STDCALL
-GlobalAddAtomW(LPCWSTR lpString)
+ /* Check for failure */
+ if (!NT_SUCCESS(Status)) SetLastErrorByStatus(Status);
+
+ /* Check if we were non-static ANSI */
+ if (!(Unicode) && (AtomNameString == &UnicodeString))
+ {
+ /* Free the allocated buffer */
+ RtlFreeUnicodeString(AtomNameString);
+ }
+
+ /* Return the atom */
+ return Atom;
+}
+
+ATOM
+WINAPI
+InternalFindAtom(BOOLEAN Local,
+ BOOLEAN Unicode,
+ LPCSTR AtomName)
{
- ATOM Atom;
- NTSTATUS Status;
+ NTSTATUS Status;
+ ANSI_STRING AnsiString;
+ UNICODE_STRING UnicodeString;
+ PUNICODE_STRING AtomNameString;
+ ATOM Atom = INVALID_ATOM;
- if (HIWORD((ULONG)lpString) == 0)
- {
- if ((ULONG)lpString >= 0xC000)
- {
- SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
- return (ATOM)0;
- }
- return (ATOM)LOWORD((ULONG)lpString);
- }
+ /* Check if it's an integer atom */
+ if ((ULONG_PTR)AtomName <= 0xFFFF)
+ {
+ /* Convert the name to an atom */
+ Atom = (ATOM)PtrToShort((PVOID)AtomName);
+ if (Atom >= MAXINTATOM)
+ {
+ /* Fail, atom number too large */
+ SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
+ DPRINT1("Invalid atom\n");
+ }
- if (lstrlenW(lpString) > 255)
- {
- /* This limit does not exist with NtAddAtom so the limit is
probably
- * added for compability. -Gunnar
- */
- SetLastError(ERROR_INVALID_PARAMETER);
- return (ATOM)0;
- }
+ /* Return it */
+ return Atom;
+ }
+ else
+ {
+ /* Check if this is a unicode atom */
+ if (Unicode)
+ {
+ /* Use a unicode string */
+ AtomNameString = &UnicodeString;
+ RtlInitUnicodeString(AtomNameString, (LPWSTR)AtomName);
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ /* Use an ansi string */
+ RtlInitAnsiString(&AnsiString, AtomName);
- Status = NtAddAtom((LPWSTR)lpString,
- wcslen(lpString),
- &Atom);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return (ATOM)0;
- }
+ /* Check if we can abuse the TEB */
+ if (AnsiString.MaximumLength > 260)
+ {
+ /* We can't, allocate a new string */
+ AtomNameString = &UnicodeString;
+ Status = RtlAnsiStringToUnicodeString(AtomNameString,
+ &AnsiString,
+ TRUE);
+ }
+ else
+ {
+ /* We can! Use the TEB */
+ AtomNameString = &NtCurrentTeb()->StaticUnicodeString;
+ Status = RtlAnsiStringToUnicodeString(AtomNameString,
+ &AnsiString,
+ FALSE);
+ }
+ }
- return Atom;
-}
+ /* Check for failure */
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed\n");
+ SetLastErrorByStatus(Status);
+ return Atom;
+ }
+ }
+ /* Check if we're doing local lookup */
+ if (Local)
+ {
+ /* Do a local lookup */
+ Status = RtlLookupAtomInAtomTable(InternalInitAtomTable(),
+ AtomNameString->Buffer,
+ &Atom);
+ }
+ else
+ {
+ /* Do a global search */
+ if (!AtomNameString->Length)
+ {
+ /* This is illegal in win32 */
+ DPRINT1("No name given\n");
+ Status = STATUS_OBJECT_NAME_NOT_FOUND;
+ }
+ else
+ {
+ /* Call the global function */
+ Status = NtFindAtom(AtomNameString->Buffer,
+ AtomNameString->Length,
+ &Atom);
+ }
+ }
-/*
- * @implemented
- */
-ATOM STDCALL
-GlobalDeleteAtom(ATOM nAtom)
+ /* Check for failure */
+ if (!NT_SUCCESS(Status)) SetLastErrorByStatus(Status);
+
+ /* Check if we were non-static ANSI */
+ if (!(Unicode) && (AtomNameString == &UnicodeString))
+ {
+ /* Free the allocated buffer */
+ RtlFreeUnicodeString(AtomNameString);
+ }
+
+ /* Return the atom */
+ return Atom;
+}
+
+ATOM
+WINAPI
+InternalDeleteAtom(BOOLEAN Local,
+ ATOM Atom)
{
- NTSTATUS Status;
+ NTSTATUS Status;
- if (nAtom < 0xC000)
- {
- return 0;
- }
+ /* Validate it */
+ if (Atom >= MAXINTATOM)
+ {
+ /* Check if it's a local delete */
+ if (Local)
+ {
+ /* Delete it locally */
+ Status =
RtlDeleteAtomFromAtomTable(InternalInitAtomTable(), Atom);
+ }
+ else
+ {
+ /* Delete it globall */
+ Status = NtDeleteAtom(Atom);
+ }
- Status = NtDeleteAtom(nAtom);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return nAtom;
- }
+ /* Check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ /* Fail */
+ SetLastErrorByStatus(Status);
+ return INVALID_ATOM;
+ }
+ }
- return 0;
+ /* Return failure */
+ return 0;
}
-
-/*
- * @implemented
- */
-ATOM STDCALL
-GlobalFindAtomA(LPCSTR lpString)
+UINT
+WINAPI
+InternalGetAtomName(BOOLEAN Local,
+ BOOLEAN Unicode,
+ ATOM Atom,
+ LPSTR AtomName,
+ DWORD Size)
{
- UNICODE_STRING AtomName;
- NTSTATUS Status;
- ATOM Atom;
+ NTSTATUS Status;
+ DWORD RetVal = 0;
+ ANSI_STRING AnsiString;
+ UNICODE_STRING UnicodeString;
+ PVOID TempBuffer = NULL;
+ PWSTR AtomNameString;
+ ULONG AtomInfoLength;
+ ULONG AtomNameLength;
+ PATOM_BASIC_INFORMATION AtomInfo;
- if (HIWORD((ULONG)lpString) == 0)
- {
- if ((ULONG)lpString >= 0xC000)
- {
- SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
- return (ATOM)0;
- }
- return (ATOM)LOWORD((ULONG)lpString);
- }
+ /* Normalize the size as not to overflow */
+ if (!Unicode && Size > 0x7000) Size = 0x7000;
- if (lstrlenA(lpString) > 255)
- {
- /* This limit does not exist with NtAddAtom so the limit is
probably
- * added for compability. -Gunnar
- */
- SetLastError(ERROR_INVALID_PARAMETER);
- return (ATOM)0;
- }
+ /* Make sure it's valid too */
+ if (!Size)
+ {
+ SetLastErrorByStatus(STATUS_BUFFER_OVERFLOW);
+ return 0;
+ }
- RtlCreateUnicodeStringFromAsciiz(&AtomName,
- (LPSTR)lpString);
- Status = NtFindAtom(AtomName.Buffer,
- AtomName.Length,
- &Atom);
- RtlFreeUnicodeString(&AtomName);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return (ATOM)0;
- }
+ /* Check if this is a global query */
+ if (Local)
+ {
+ /* Set the query length */
+ AtomNameLength = Size * sizeof(WCHAR);
- return Atom;
-}
+ /* If it's unicode, just keep the name */
+ if (Unicode)
+ {
+ AtomNameString = (PWSTR)AtomName;
+ }
+ else
+ {
+ /* Allocate memory for the ansi buffer */
+ TempBuffer = RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ AtomNameLength);
+ AtomNameString = TempBuffer;
+ }
+ /* Query the name */
+ Status = RtlQueryAtomInAtomTable(InternalInitAtomTable(),
+ Atom,
+ NULL,
+ NULL,
+ AtomNameString,
+ &AtomNameLength);
+ }
+ else
+ {
+ /* We're going to do a global query, so allocate a buffer */
+ AtomInfoLength = sizeof(ATOM_BASIC_INFORMATION) +
+ (Size * sizeof(WCHAR));
+ AtomInfo = TempBuffer = RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ AtomInfoLength);
-/*
- * @implemented
- */
-ATOM STDCALL
-GlobalFindAtomW(LPCWSTR lpString)
-{
- ATOM Atom;
- NTSTATUS Status;
+ /* Query the name */
+ Status = NtQueryInformationAtom(Atom,
+ AtomBasicInformation,
+ AtomInfo,
+ AtomInfoLength,
+ &AtomInfoLength);
+ if (NT_SUCCESS(Status))
+ {
+ /* Success. Update the length and get the name */
+ AtomNameLength = (ULONG)AtomInfo->NameLength;
+ AtomNameString = AtomInfo->Name;
+ }
+ }
- if (HIWORD((ULONG)lpString) == 0)
- {
- if ((ULONG)lpString >= 0xC000)
- {
- SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
- return (ATOM)0;
- }
- return (ATOM)LOWORD((ULONG)lpString);
- }
+ /* Check for global success */
+ if (NT_SUCCESS(Status))
+ {
+ /* Check if it was unicode */
+ if (Unicode)
+ {
+ /* We return the length in chars */
+ RetVal = AtomNameLength / sizeof(WCHAR);
- if (lstrlenW(lpString) > 255)
- {
- /* This limit does not exist with NtAddAtom so the limit is
probably
- * added for compability. -Gunnar
- */
- SetLastError(ERROR_INVALID_PARAMETER);
- return (ATOM)0;
- }
+ /* Copy the memory if this was a global query */
+ if (AtomNameString != (PWSTR)AtomName)
+ {
+ RtlMoveMemory(AtomName, AtomNameString,
AtomNameLength);
+ }
- Status = NtFindAtom((LPWSTR)lpString,
- wcslen(lpString),
- &Atom);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return (ATOM)0;
- }
+ /* And null-terminate it if the buffer was too large */
+ if (RetVal < Size)
+ {
+ ((PWCHAR)AtomName)[RetVal] = UNICODE_NULL;
+ }
+ }
+ else
+ {
+ /* First create a unicode string with our data */
+ UnicodeString.Buffer = AtomNameString;
+ UnicodeString.Length = (USHORT)AtomNameLength;
+ UnicodeString.MaximumLength = (USHORT)(UnicodeString.Length
+
+ sizeof(WCHAR));
- return Atom;
-}
+ /* Now prepare an ansi string for conversion */
+ AnsiString.Buffer = AtomName;
+ AnsiString.Length = 0;
+ AnsiString.MaximumLength = (USHORT)Size;
+ /* Convert it */
+ Status = RtlUnicodeStringToAnsiString(&AnsiString,
+ &UnicodeString,
+ FALSE);
-UINT STDCALL
-GlobalGetAtomNameA(ATOM nAtom,
- LPSTR lpBuffer,
- int nSize)
-{
- PATOM_BASIC_INFORMATION Buffer;
- UNICODE_STRING AtomNameU;
- ANSI_STRING AtomName;
- ULONG BufferSize;
- ULONG ReturnLength;
- NTSTATUS Status;
+ /* Return the length */
+ if (NT_SUCCESS(Status)) RetVal = AnsiString.Length;
+ }
+ }
- BufferSize = sizeof(ATOM_BASIC_INFORMATION) + nSize * sizeof(WCHAR);
- Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
- HEAP_ZERO_MEMORY,
- BufferSize);
- if (Buffer == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return 0;
- }
+ /* Free the temporary buffer if we have one */
+ if (TempBuffer) RtlFreeHeap(RtlGetProcessHeap(), 0, TempBuffer);
- Status = NtQueryInformationAtom(nAtom,
- AtomBasicInformation,
- Buffer,
- BufferSize,
- &ReturnLength);
- if (!NT_SUCCESS(Status))
- {
- RtlFreeHeap(RtlGetProcessHeap(),
- 0,
- Buffer);
+ /* Check for failure */
+ if (!NT_SUCCESS(Status))
+ {
+ /* Fail */
+ DPRINT1("Failed: %lx\n", Status);
SetLastErrorByStatus(Status);
- return 0;
- }
+ }
- RtlInitUnicodeString(&AtomNameU,
- Buffer->Name);
- AtomName.Buffer = lpBuffer;
- AtomName.Length = 0;
- AtomName.MaximumLength = nSize;
- RtlUnicodeStringToAnsiString(&AtomName,
- &AtomNameU,
- FALSE);
+ /* Return length */
+ return RetVal;
+}
- ReturnLength = AtomName.Length;
- RtlFreeHeap(RtlGetProcessHeap(),
- 0,
- Buffer);
+/* FUNCTIONS
*****************************************************************/
- return ReturnLength;
+/*
+ * @implemented
+ */
+ATOM
+WINAPI
+GlobalAddAtomA(LPCSTR lpString)
+{
+ return InternalAddAtom(FALSE, FALSE, lpString);
}
+/*
+ * @implemented
+ */
+ATOM
+WINAPI
+GlobalAddAtomW(LPCWSTR lpString)
+{
+ return InternalAddAtom(FALSE, TRUE, (LPSTR)lpString);
+}
/*
* @implemented
*/
-UINT STDCALL
-GlobalGetAtomNameW(ATOM nAtom,
- LPWSTR lpBuffer,
- int nSize)
+ATOM
+WINAPI
+GlobalDeleteAtom(ATOM nAtom)
{
- PATOM_BASIC_INFORMATION Buffer;
- ULONG BufferSize;
- ULONG ReturnLength;
- NTSTATUS Status;
+ return InternalDeleteAtom(FALSE, nAtom);
+}
- BufferSize = sizeof(ATOM_BASIC_INFORMATION) + nSize * sizeof(WCHAR);
- Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
- HEAP_ZERO_MEMORY,
- BufferSize);
- if (Buffer == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return 0;
- }
+/*
+ * @implemented
+ */
+ATOM
+WINAPI
+GlobalFindAtomA(LPCSTR lpString)
+{
+ return InternalFindAtom(FALSE, FALSE, lpString);
+}
- Status = NtQueryInformationAtom(nAtom,
- AtomBasicInformation,
- Buffer,
- BufferSize,
- &ReturnLength);
- if (!NT_SUCCESS(Status))
- {
- RtlFreeHeap(RtlGetProcessHeap(),
- 0,
- Buffer);
- SetLastErrorByStatus(Status);
- return 0;
- }
+/*
+ * @implemented
+ */
+ATOM
+WINAPI
+GlobalFindAtomW(LPCWSTR lpString)
+{
+ return InternalFindAtom(FALSE, TRUE, (LPSTR)lpString);
+}
- memcpy(lpBuffer, Buffer->Name, Buffer->NameLength);
- ReturnLength = Buffer->NameLength / sizeof(WCHAR);
- *(lpBuffer + ReturnLength) = 0;
- RtlFreeHeap(RtlGetProcessHeap(),
- 0,
- Buffer);
-
- return ReturnLength;
+/*
+ * @implemented
+ */
+UINT
+WINAPI
+GlobalGetAtomNameA(ATOM nAtom,
+ LPSTR lpBuffer,
+ int nSize)
+{
+ return InternalGetAtomName(FALSE, FALSE, nAtom, lpBuffer,
(DWORD)nSize);
}
-
-static PRTL_ATOM_TABLE
-GetLocalAtomTable(VOID)
+/*
+ * @implemented
+ */
+UINT
+WINAPI
+GlobalGetAtomNameW(ATOM nAtom,
+ LPWSTR lpBuffer,
+ int nSize)
{
- if (LocalAtomTable != NULL)
- {
- return LocalAtomTable;
- }
- RtlCreateAtomTable(37,
- &LocalAtomTable);
- return LocalAtomTable;
+ return InternalGetAtomName(FALSE,
+ TRUE,
+ nAtom,
+ (LPSTR)lpBuffer,
+ (DWORD)nSize);
}
-
/*
* @implemented
*/
-BOOL STDCALL
+BOOL
+WINAPI
InitAtomTable(DWORD nSize)
{
- NTSTATUS Status;
+ /* Normalize size */
+ if (nSize < 4 || nSize > 511) nSize = 37;
- /* nSize should be a prime number */
-
- if ( nSize < 4 || nSize >= 512 )
- {
- nSize = 37;
- }
-
- if (LocalAtomTable == NULL)
- {
- Status = RtlCreateAtomTable(nSize,
- &LocalAtomTable);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return FALSE;
- }
- }
-
- return TRUE;
+ DPRINT("Here\n");
+ return NT_SUCCESS(RtlCreateAtomTable(nSize, &BaseLocalAtomTable));
}
-
/*
* @implemented
*/
-ATOM STDCALL
+ATOM
+WINAPI
AddAtomA(LPCSTR lpString)
{
- PRTL_ATOM_TABLE AtomTable;
- UNICODE_STRING AtomName;
- NTSTATUS Status;
- ATOM Atom;
-
- if (HIWORD((ULONG)lpString) == 0)
- {
- if ((ULONG)lpString >= 0xC000)
- {
- SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
- return (ATOM)0;
- }
- return (ATOM)LOWORD((ULONG)lpString);
- }
-
- AtomTable = GetLocalAtomTable();
-
- RtlCreateUnicodeStringFromAsciiz(&AtomName,
- (LPSTR)lpString);
-
- Status = RtlAddAtomToAtomTable(AtomTable,
- AtomName.Buffer,
- &Atom);
- RtlFreeUnicodeString(&AtomName);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return (ATOM)0;
- }
-
- return Atom;
+ return InternalAddAtom(TRUE, FALSE, lpString);
}
-
/*
* @implemented
*/
-ATOM STDCALL
+ATOM
+WINAPI
AddAtomW(LPCWSTR lpString)
{
- PRTL_ATOM_TABLE AtomTable;
- ATOM Atom;
- NTSTATUS Status;
-
- if (HIWORD((ULONG)lpString) == 0)
- {
- if ((ULONG)lpString >= 0xC000)
- {
- SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
- return (ATOM)0;
- }
- return (ATOM)LOWORD((ULONG)lpString);
- }
-
- AtomTable = GetLocalAtomTable();
-
- Status = RtlAddAtomToAtomTable(AtomTable,
- (LPWSTR)lpString,
- &Atom);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return (ATOM)0;
- }
-
- return Atom;
+ return InternalAddAtom(TRUE, TRUE, (LPSTR)lpString);
}
-
/*
* @implemented
*/
-ATOM STDCALL
+ATOM
+WINAPI
DeleteAtom(ATOM nAtom)
{
- PRTL_ATOM_TABLE AtomTable;
- NTSTATUS Status;
-
- if (nAtom < 0xC000)
- {
- return 0;
- }
-
- AtomTable = GetLocalAtomTable();
-
- Status = RtlDeleteAtomFromAtomTable(AtomTable,
- nAtom);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return nAtom;
- }
-
- return 0;
+ return InternalDeleteAtom(TRUE, nAtom);
}
-
/*
* @implemented
*/
-ATOM STDCALL
+ATOM
+WINAPI
FindAtomA(LPCSTR lpString)
{
- PRTL_ATOM_TABLE AtomTable;
- UNICODE_STRING AtomName;
- NTSTATUS Status;
- ATOM Atom;
-
- if (HIWORD((ULONG)lpString) == 0)
- {
- if ((ULONG)lpString >= 0xC000)
- {
- SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
- return (ATOM)0;
- }
- return (ATOM)LOWORD((ULONG)lpString);
- }
-
- AtomTable = GetLocalAtomTable();
- RtlCreateUnicodeStringFromAsciiz(&AtomName,
- (LPSTR)lpString);
- Status = RtlLookupAtomInAtomTable(AtomTable,
- AtomName.Buffer,
- &Atom);
- RtlFreeUnicodeString(&AtomName);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return (ATOM)0;
- }
-
- return Atom;
+ return InternalFindAtom(TRUE, FALSE, lpString);
}
-
/*
* @implemented
*/
-ATOM STDCALL
+ATOM
+WINAPI
FindAtomW(LPCWSTR lpString)
{
- PRTL_ATOM_TABLE AtomTable;
- ATOM Atom;
- NTSTATUS Status;
+ return InternalFindAtom(TRUE, TRUE, (LPSTR)lpString);
- if (HIWORD((ULONG)lpString) == 0)
- {
- if ((ULONG)lpString >= 0xC000)
- {
- SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
- return (ATOM)0;
- }
- return (ATOM)LOWORD((ULONG)lpString);
- }
-
- AtomTable = GetLocalAtomTable();
-
- Status = RtlLookupAtomInAtomTable(AtomTable,
- (LPWSTR)lpString,
- &Atom);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return (ATOM)0;
- }
-
- return Atom;
}
-
/*
* @implemented
*/
-UINT STDCALL
+UINT
+WINAPI
GetAtomNameA(ATOM nAtom,
- LPSTR lpBuffer,
- int nSize)
[truncated at 1000 lines; 539 more skipped]