1 /* $Id: class.c,v 1.10 2002/08/16 01:39:17 dwelch 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>
25 /* FUNCTIONS *****************************************************************/
30 return(STATUS_SUCCESS
);
34 CleanupClassImpl(VOID
)
36 return(STATUS_SUCCESS
);
41 ClassReferenceClassByName(PW32PROCESS Process
,
42 PWNDCLASS_OBJECT
* Class
,
45 PWNDCLASS_OBJECT Current
;
46 PLIST_ENTRY CurrentEntry
;
48 ExAcquireFastMutexUnsafe (&Process
->ClassListLock
);
49 CurrentEntry
= Process
->ClassListHead
.Flink
;
50 while (CurrentEntry
!= &Process
->ClassListHead
)
52 Current
= CONTAINING_RECORD(CurrentEntry
, WNDCLASS_OBJECT
, ListEntry
);
54 if (_wcsicmp(ClassName
, Current
->Class
.lpszClassName
) == 0)
57 ObmReferenceObject(Current
);
58 ExReleaseFastMutexUnsafe (&Process
->ClassListLock
);
59 return(STATUS_SUCCESS
);
62 CurrentEntry
= CurrentEntry
->Flink
;
64 ExReleaseFastMutexUnsafe (&Process
->ClassListLock
);
66 return(STATUS_NOT_FOUND
);
70 ClassReferenceClassByAtom(PWNDCLASS_OBJECT
*Class
,
73 PWINSTATION_OBJECT WinStaObject
;
74 ULONG ClassNameLength
;
80 return(STATUS_INVALID_PARAMETER
);
83 Status
= ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
87 if (!NT_SUCCESS(Status
))
89 DPRINT("Validation of window station handle (0x%X) failed\n",
90 PROCESS_WINDOW_STATION());
91 return(STATUS_UNSUCCESSFUL
);
94 ClassNameLength
= sizeof(ClassName
);
95 Status
= RtlQueryAtomInAtomTable(WinStaObject
->AtomTable
,
102 Status
= ClassReferenceClassByName(PsGetWin32Process(),
106 ObDereferenceObject(WinStaObject
);
112 ClassReferenceClassByNameOrAtom(PWNDCLASS_OBJECT
*Class
,
113 LPWSTR ClassNameOrAtom
)
117 if (IS_ATOM(ClassNameOrAtom
))
119 Status
= ClassReferenceClassByAtom(Class
,
120 (RTL_ATOM
)((ULONG_PTR
)ClassNameOrAtom
));
124 Status
= ClassReferenceClassByName(PsGetWin32Process(), Class
,
128 if (!NT_SUCCESS(Status
))
130 SetLastNtError(Status
);
137 NtUserGetClassInfo(IN LPWSTR ClassName
,
141 OUT PULONG ReturnedLength
)
149 NtUserGetClassName(DWORD Unknown0
,
159 NtUserGetWOWClass(DWORD Unknown0
,
168 W32kCreateClass(LPWNDCLASSEX lpwcx
,
171 PWNDCLASS_OBJECT ClassObject
;
175 objectSize
= sizeof(WNDCLASS_OBJECT
) +
176 (lpwcx
->lpszMenuName
!= 0 ? ((wcslen (lpwcx
->lpszMenuName
) + 1) * 2) : 0) +
177 ((wcslen (lpwcx
->lpszClassName
) + 1) * 2);
178 ClassObject
= ObmCreateObject(NULL
, NULL
, otClass
, objectSize
);
179 if (ClassObject
== 0)
184 ClassObject
->Class
= *lpwcx
;
185 ClassObject
->Unicode
= bUnicodeClass
;
186 namePtr
= (LPTSTR
)(((PCHAR
)ClassObject
) + sizeof (WNDCLASS_OBJECT
));
187 if (lpwcx
->lpszMenuName
!= 0)
189 ClassObject
->Class
.lpszMenuName
= namePtr
;
190 wcscpy (namePtr
, lpwcx
->lpszMenuName
);
191 namePtr
+= wcslen (lpwcx
->lpszMenuName
) + 1;
193 ClassObject
->Class
.lpszClassName
= namePtr
;
194 wcscpy (namePtr
, lpwcx
->lpszClassName
);
199 NtUserRegisterClassExWOW(LPWNDCLASSEX lpwcx
,
207 * Registers a new class with the window manager
209 * lpcx = Win32 extended window class structure
210 * bUnicodeClass = Wether to send ANSI or unicode strings
211 * to window procedures
213 * Atom identifying the new class
216 PWINSTATION_OBJECT WinStaObject
;
217 PWNDCLASS_OBJECT ClassObject
;
223 DPRINT("About to open window station handle (0x%X)\n",
224 PROCESS_WINDOW_STATION());
226 Status
= ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
230 if (!NT_SUCCESS(Status
))
232 DPRINT("Validation of window station handle (0x%X) failed\n",
233 PROCESS_WINDOW_STATION());
237 Status
= RtlAddAtomToAtomTable(WinStaObject
->AtomTable
,
238 (LPWSTR
)lpwcx
->lpszClassName
,
240 if (!NT_SUCCESS(Status
))
242 ObDereferenceObject(WinStaObject
);
243 DPRINT("Failed adding class name (%wS) to atom table\n",
244 lpwcx
->lpszClassName
);
245 SetLastNtError(Status
);
249 ClassObject
= W32kCreateClass(lpwcx
, bUnicodeClass
);
250 if (ClassObject
== NULL
)
252 RtlDeleteAtomFromAtomTable(WinStaObject
->AtomTable
, Atom
);
253 ObDereferenceObject(WinStaObject
);
254 DPRINT("Failed creating window class object\n");
255 SetLastNtError(STATUS_INSUFFICIENT_RESOURCES
);
258 ExAcquireFastMutex(&PsGetWin32Process()->ClassListLock
);
259 InsertTailList(&PsGetWin32Process()->ClassListHead
, &ClassObject
->ListEntry
);
260 ExReleaseFastMutex(&PsGetWin32Process()->ClassListLock
);
262 ObDereferenceObject(WinStaObject
);
268 NtUserGetClassLong(HWND hWnd
, DWORD Offset
)
273 NtUserSetClassLong(DWORD Unknown0
,
284 NtUserSetClassWord(DWORD Unknown0
,
294 NtUserUnregisterClass(DWORD Unknown0
,