3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Window classes
6 * FILE: subsys/win32k/ntuser/class.c
7 * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
9 * 06-06-2001 CSH Created
11 /* INCLUDES ******************************************************************/
13 #include <ddk/ntddk.h>
14 #include <win32k/win32k.h>
15 #include <napi/win32.h>
16 #include <include/class.h>
17 #include <include/error.h>
18 #include <include/winsta.h>
19 #include <include/object.h>
20 #include <include/guicheck.h>
21 #include <include/window.h>
26 /* FUNCTIONS *****************************************************************/
31 return(STATUS_SUCCESS);
35 CleanupClassImpl(VOID)
37 return(STATUS_SUCCESS);
42 ClassReferenceClassByName(PW32PROCESS Process,
43 PWNDCLASS_OBJECT* Class,
46 PWNDCLASS_OBJECT Current;
47 PLIST_ENTRY CurrentEntry;
49 ExAcquireFastMutexUnsafe (&Process->ClassListLock);
50 CurrentEntry = Process->ClassListHead.Flink;
51 while (CurrentEntry != &Process->ClassListHead)
53 Current = CONTAINING_RECORD(CurrentEntry, WNDCLASS_OBJECT, ListEntry);
55 if (_wcsicmp(ClassName, Current->Class.lpszClassName) == 0)
58 ObmReferenceObject(Current);
59 ExReleaseFastMutexUnsafe (&Process->ClassListLock);
60 return(STATUS_SUCCESS);
63 CurrentEntry = CurrentEntry->Flink;
65 ExReleaseFastMutexUnsafe (&Process->ClassListLock);
67 return(STATUS_NOT_FOUND);
71 ClassReferenceClassByAtom(PWNDCLASS_OBJECT *Class,
74 PWINSTATION_OBJECT WinStaObject;
75 ULONG ClassNameLength;
81 return(STATUS_INVALID_PARAMETER);
84 Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
88 if (!NT_SUCCESS(Status))
90 DPRINT("Validation of window station handle (0x%X) failed\n",
91 PROCESS_WINDOW_STATION());
92 return(STATUS_UNSUCCESSFUL);
95 ClassNameLength = sizeof(ClassName);
96 Status = RtlQueryAtomInAtomTable(WinStaObject->AtomTable,
103 Status = ClassReferenceClassByName(PsGetWin32Process(),
107 ObDereferenceObject(WinStaObject);
113 ClassReferenceClassByNameOrAtom(PWNDCLASS_OBJECT *Class,
114 LPWSTR ClassNameOrAtom)
118 if (IS_ATOM(ClassNameOrAtom))
120 Status = ClassReferenceClassByAtom(Class,
121 (RTL_ATOM)((ULONG_PTR)ClassNameOrAtom));
125 Status = ClassReferenceClassByName(PsGetWin32Process(), Class,
129 if (!NT_SUCCESS(Status))
131 SetLastNtError(Status);
138 NtUserGetClassInfo(IN LPWSTR ClassName,
142 OUT PULONG ReturnedLength)
150 NtUserGetClassName(DWORD Unknown0,
160 NtUserGetWOWClass(DWORD Unknown0,
169 W32kCreateClass(LPWNDCLASSEX lpwcx,
172 PWNDCLASS_OBJECT ClassObject;
176 objectSize = sizeof(WNDCLASS_OBJECT) +
177 (lpwcx->lpszMenuName != 0 ? ((wcslen (lpwcx->lpszMenuName) + 1) * 2) : 0) +
178 ((wcslen (lpwcx->lpszClassName) + 1) * 2);
179 ClassObject = ObmCreateObject(NULL, NULL, otClass, objectSize);
180 if (ClassObject == 0)
185 ClassObject->Class = *lpwcx;
186 ClassObject->Unicode = bUnicodeClass;
187 namePtr = (LPTSTR)(((PCHAR)ClassObject) + sizeof (WNDCLASS_OBJECT));
188 if (lpwcx->lpszMenuName != 0)
190 ClassObject->Class.lpszMenuName = namePtr;
191 wcscpy (namePtr, lpwcx->lpszMenuName);
192 namePtr += wcslen (lpwcx->lpszMenuName) + 1;
194 ClassObject->Class.lpszClassName = namePtr;
195 wcscpy (namePtr, lpwcx->lpszClassName);
200 NtUserRegisterClassExWOW(LPWNDCLASSEX lpwcx,
208 * Registers a new class with the window manager
210 * lpcx = Win32 extended window class structure
211 * bUnicodeClass = Wether to send ANSI or unicode strings
212 * to window procedures
214 * Atom identifying the new class
217 PWINSTATION_OBJECT WinStaObject;
218 PWNDCLASS_OBJECT ClassObject;
224 DPRINT("About to open window station handle (0x%X)\n",
225 PROCESS_WINDOW_STATION());
227 Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
231 if (!NT_SUCCESS(Status))
233 DPRINT("Validation of window station handle (0x%X) failed\n",
234 PROCESS_WINDOW_STATION());
238 Status = RtlAddAtomToAtomTable(WinStaObject->AtomTable,
239 (LPWSTR)lpwcx->lpszClassName,
241 if (!NT_SUCCESS(Status))
243 ObDereferenceObject(WinStaObject);
244 DPRINT("Failed adding class name (%wS) to atom table\n",
245 lpwcx->lpszClassName);
246 SetLastNtError(Status);
250 ClassObject = W32kCreateClass(lpwcx, bUnicodeClass);
251 if (ClassObject == NULL)
253 RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Atom);
254 ObDereferenceObject(WinStaObject);
255 DPRINT("Failed creating window class object\n");
256 SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
259 ExAcquireFastMutex(&PsGetWin32Process()->ClassListLock);
260 InsertTailList(&PsGetWin32Process()->ClassListHead, &ClassObject->ListEntry);
261 ExReleaseFastMutex(&PsGetWin32Process()->ClassListLock);
263 ObDereferenceObject(WinStaObject);
269 W32kGetClassLong(PWINDOW_OBJECT WindowObject, ULONG Offset)
275 Ret = WindowObject->Class->Class.style;
278 Ret = WindowObject->Class->Class.cbWndExtra;
281 Ret = WindowObject->Class->Class.cbClsExtra;
284 Ret = (ULONG)WindowObject->Class->Class.hInstance;
286 case GCL_HBRBACKGROUND:
287 Ret = (ULONG)WindowObject->Class->Class.hbrBackground;
297 NtUserGetClassLong(HWND hWnd, DWORD Offset)
299 PWINDOW_OBJECT WindowObject;
302 WindowObject = W32kGetWindowObject(hWnd);
303 if (WindowObject == NULL)
307 Ret = W32kGetClassLong(WindowObject, Offset);
308 W32kReleaseWindowObject(WindowObject);
313 NtUserSetClassLong(DWORD Unknown0,
324 NtUserSetClassWord(DWORD Unknown0,
334 NtUserUnregisterClass(DWORD Unknown0,