1 /* $Id: class.c,v 1.13 2002/09/08 10:23:52 chorns Exp $
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 NtUserGetClassLong(HWND hWnd
, DWORD Offset
)
271 PWINDOW_OBJECT WindowObject
;
274 WindowObject
= W32kGetWindowObject(hWnd
);
275 if (WindowObject
== NULL
)
282 Ret
= WindowObject
->Class
->Class
.style
;
285 Ret
= WindowObject
->Class
->Class
.cbWndExtra
;
288 Ret
= WindowObject
->Class
->Class
.cbClsExtra
;
291 Ret
= WindowObject
->Class
->Class
.hInstance
;
293 case GCL_HBRBACKGROUND
:
294 Ret
= WindowObject
->Class
->Class
.hbrBackground
;
300 W32kReleaseWindowObject(WindowObject
);
305 NtUserSetClassLong(DWORD Unknown0
,
316 NtUserSetClassWord(DWORD Unknown0
,
326 NtUserUnregisterClass(DWORD Unknown0
,