-/* $Id: class.c,v 1.20 2003/07/10 21:04:31 chorns Exp $
+/* $Id: class.c,v 1.21 2003/07/27 21:35:50 dwelch Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS user32.dll
WNDCLASSEXW Class;
RTL_ATOM Atom;
- if (!RtlCreateUnicodeStringFromAsciiz(&MenuName, (PCSZ)lpwcx->lpszMenuName))
- {
- RtlFreeUnicodeString(&MenuName);
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return (ATOM)0;
- }
-
- if (!RtlCreateUnicodeStringFromAsciiz(&ClassName, (PCSZ)lpwcx->lpszClassName))
+ RtlMoveMemory(&Class, lpwcx, sizeof(WNDCLASSEXA));
+ if (HIWORD((ULONG)lpwcx->lpszMenuName) != 0)
{
- RtlFreeUnicodeString(&ClassName);
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return (ATOM)0;
+ if (!RtlCreateUnicodeStringFromAsciiz(&MenuName, (PCSZ)lpwcx->lpszMenuName))
+ {
+ RtlFreeUnicodeString(&MenuName);
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return (ATOM)0;
+ }
+ Class.lpszMenuName = MenuName.Buffer;
+ }
+ if (HIWORD((ULONG)lpwcx->lpszClassName) != 0)
+ {
+ if (!RtlCreateUnicodeStringFromAsciiz(&ClassName, (PCSZ)lpwcx->lpszClassName))
+ {
+ RtlFreeUnicodeString(&ClassName);
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return (ATOM)0;
+ }
+ Class.lpszClassName = ClassName.Buffer;
}
-
- RtlMoveMemory(&Class, lpwcx, sizeof(WNDCLASSEXA));
- Class.lpszMenuName = MenuName.Buffer;
- Class.lpszClassName = ClassName.Buffer;
Atom = NtUserRegisterClassExWOW(&Class,
FALSE,
0,
0);
- RtlFreeUnicodeString(&ClassName);
- RtlFreeUnicodeString(&MenuName);
+ if (HIWORD((ULONG)lpwcx->lpszMenuName) != 0)
+ {
+ RtlFreeUnicodeString(&ClassName);
+ }
+ if (HIWORD((ULONG)lpwcx->lpszClassName )!= 0)
+ {
+ RtlFreeUnicodeString(&MenuName);
+ }
return (ATOM)Atom;
}
{
RTL_ATOM Atom;
- Atom = NtUserRegisterClassExWOW((WNDCLASSEX*)lpwcx,
+ Atom = NtUserRegisterClassExWOW((WNDCLASSEXW*)lpwcx,
TRUE,
0,
0,
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: class.c,v 1.19 2003/07/11 17:08:44 chorns Exp $
+/* $Id: class.c,v 1.20 2003/07/27 21:35:50 dwelch Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
}
-NTSTATUS STDCALL
-ClassReferenceClassByName(PW32PROCESS Process,
- PWNDCLASS_OBJECT* Class,
- LPWSTR ClassName)
+NTSTATUS FASTCALL
+ClassReferenceClassByAtom(PWNDCLASS_OBJECT* Class,
+ RTL_ATOM Atom)
{
PWNDCLASS_OBJECT Current;
PLIST_ENTRY CurrentEntry;
+ PW32PROCESS Process = PsGetWin32Process();
ExAcquireFastMutexUnsafe (&Process->ClassListLock);
CurrentEntry = Process->ClassListHead.Flink;
{
Current = CONTAINING_RECORD(CurrentEntry, WNDCLASS_OBJECT, ListEntry);
- if (_wcsicmp(ClassName, Current->Class.lpszClassName) == 0)
+ if (Current->Class.lpszClassName == (LPWSTR)(ULONG)Atom)
{
*Class = Current;
ObmReferenceObject(Current);
return(STATUS_NOT_FOUND);
}
-NTSTATUS FASTCALL
-ClassReferenceClassByAtom(PWNDCLASS_OBJECT *Class,
- RTL_ATOM ClassAtom)
+NTSTATUS STDCALL
+ClassReferenceClassByName(PWNDCLASS_OBJECT *Class,
+ PWSTR ClassName)
{
PWINSTATION_OBJECT WinStaObject;
- ULONG ClassNameLength;
- WCHAR ClassName[256];
NTSTATUS Status;
+ RTL_ATOM ClassAtom;
- if (!ClassAtom)
+ if (!ClassName)
{
return(STATUS_INVALID_PARAMETER);
}
return(STATUS_UNSUCCESSFUL);
}
- ClassNameLength = sizeof(ClassName);
- Status = RtlQueryAtomInAtomTable(WinStaObject->AtomTable,
- ClassAtom,
- NULL,
- NULL,
- &ClassName[0],
- &ClassNameLength);
-
- Status = ClassReferenceClassByName(PsGetWin32Process(),
- Class,
- &ClassName[0]);
-
- ObDereferenceObject(WinStaObject);
+ Status = RtlLookupAtomInAtomTable(WinStaObject->AtomTable,
+ ClassName,
+ &ClassAtom);
+
+ if (!NT_SUCCESS(Status))
+ {
+ ObDereferenceObject(WinStaObject);
+ return(Status);
+ }
+ Status = ClassReferenceClassByAtom(Class,
+ ClassAtom);
+ ObDereferenceObject(WinStaObject);
return(Status);
}
}
else
{
- Status = ClassReferenceClassByName(PsGetWin32Process(), Class,
+ Status = ClassReferenceClassByName(Class,
ClassNameOrAtom);
}
PWNDCLASS_OBJECT FASTCALL
W32kCreateClass(LPWNDCLASSEXW lpwcx,
- BOOL bUnicodeClass)
+ BOOL bUnicodeClass,
+ RTL_ATOM Atom)
{
PWNDCLASS_OBJECT ClassObject;
WORD objectSize;
LPTSTR namePtr;
objectSize = sizeof(WNDCLASS_OBJECT) +
- (lpwcx->lpszMenuName != 0 ? ((wcslen (lpwcx->lpszMenuName) + 1) * 2) : 0) +
- ((wcslen (lpwcx->lpszClassName) + 1) * 2);
+ (lpwcx->lpszMenuName != 0 ? ((wcslen (lpwcx->lpszMenuName) + 1) * 2) : 0);
ClassObject = ObmCreateObject(NULL, NULL, otClass, objectSize);
if (ClassObject == 0)
{
}
ClassObject->Class = *lpwcx;
- ClassObject->Unicode = bUnicodeClass;
- namePtr = (LPTSTR)(((PCHAR)ClassObject) + sizeof (WNDCLASS_OBJECT));
+ ClassObject->Unicode = bUnicodeClass;
if (lpwcx->lpszMenuName != 0)
{
+ namePtr = (LPTSTR)(((PCHAR)ClassObject) + sizeof (WNDCLASS_OBJECT));
ClassObject->Class.lpszMenuName = namePtr;
wcscpy (namePtr, lpwcx->lpszMenuName);
- namePtr += wcslen (lpwcx->lpszMenuName) + 1;
}
- ClassObject->Class.lpszClassName = namePtr;
- wcscpy (namePtr, lpwcx->lpszClassName);
+ ClassObject->Class.lpszClassName = (LPWSTR)(ULONG)Atom;
return(ClassObject);
}
PROCESS_WINDOW_STATION());
return((RTL_ATOM)0);
}
-
- Status = RtlAddAtomToAtomTable(WinStaObject->AtomTable,
- (LPWSTR)lpwcx->lpszClassName,
- &Atom);
- if (!NT_SUCCESS(Status))
+ if (!IS_ATOM(lpwcx->lpszClassName))
{
- ObDereferenceObject(WinStaObject);
- DPRINT("Failed adding class name (%wS) to atom table\n",
- lpwcx->lpszClassName);
- SetLastNtError(Status);
-
- return((RTL_ATOM)0);
+ Status = RtlAddAtomToAtomTable(WinStaObject->AtomTable,
+ (LPWSTR)lpwcx->lpszClassName,
+ &Atom);
+ if (!NT_SUCCESS(Status))
+ {
+ ObDereferenceObject(WinStaObject);
+ DPRINT("Failed adding class name (%wS) to atom table\n",
+ lpwcx->lpszClassName);
+ SetLastNtError(Status);
+ return((RTL_ATOM)0);
+ }
+ }
+ else
+ {
+ Atom = (RTL_ATOM)(ULONG)lpwcx->lpszClassName;
}
- ClassObject = W32kCreateClass(lpwcx, bUnicodeClass);
+ ClassObject = W32kCreateClass(lpwcx, bUnicodeClass, Atom);
if (ClassObject == NULL)
{
- RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Atom);
+ if (!IS_ATOM(lpwcx->lpszClassName))
+ {
+ RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Atom);
+ }
ObDereferenceObject(WinStaObject);
DPRINT("Failed creating window class object\n");
SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);