1 /* $Id: class.c,v 1.4 2002/01/27 01:11:24 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>
24 /* FUNCTIONS *****************************************************************/
29 return(STATUS_SUCCESS
);
33 CleanupClassImpl(VOID
)
35 return(STATUS_SUCCESS
);
40 ClassReferenceClassByName(PW32PROCESS Process
,
41 PWNDCLASS_OBJECT
* Class
,
44 PWNDCLASS_OBJECT Current
;
45 PLIST_ENTRY CurrentEntry
;
47 ExAcquireFastMutexUnsafe (&Process
->ClassListLock
);
48 CurrentEntry
= Process
->ClassListHead
.Flink
;
49 while (CurrentEntry
!= &Process
->ClassListHead
)
51 Current
= CONTAINING_RECORD(CurrentEntry
, WNDCLASS_OBJECT
, ListEntry
);
53 if (_wcsicmp(ClassName
, Current
->Class
.lpszClassName
) == 0)
56 ObmReferenceObject(Current
);
57 ExReleaseFastMutexUnsafe (&Process
->ClassListLock
);
58 return(STATUS_SUCCESS
);
61 CurrentEntry
= CurrentEntry
->Flink
;
63 ExReleaseFastMutexUnsafe (&Process
->ClassListLock
);
65 return(STATUS_NOT_FOUND
);
69 ClassReferenceClassByAtom(PWNDCLASS_OBJECT
*Class
,
72 PWINSTATION_OBJECT WinStaObject
;
73 ULONG ClassNameLength
;
79 return(STATUS_INVALID_PARAMETER
);
82 Status
= ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
86 if (!NT_SUCCESS(Status
))
88 DPRINT("Validation of window station handle (0x%X) failed\n",
89 PROCESS_WINDOW_STATION());
90 return(STATUS_UNSUCCESSFUL
);
93 ClassNameLength
= sizeof(ClassName
);
94 Status
= RtlQueryAtomInAtomTable(WinStaObject
->AtomTable
,
101 Status
= ClassReferenceClassByName(PsGetWin32Process(),
105 ObDereferenceObject(WinStaObject
);
111 ClassReferenceClassByNameOrAtom(PWNDCLASS_OBJECT
*Class
,
112 LPWSTR ClassNameOrAtom
)
116 if (IS_ATOM(ClassNameOrAtom
))
118 Status
= ClassReferenceClassByAtom(Class
,
119 (RTL_ATOM
)((ULONG_PTR
)ClassNameOrAtom
));
123 Status
= ClassReferenceClassByName(PsGetWin32Process(), Class
,
127 if (!NT_SUCCESS(Status
))
129 SetLastNtError(Status
);
136 NtUserGetClassInfo(IN LPWSTR ClassName
,
140 OUT PULONG ReturnedLength
)
148 NtUserGetClassName(DWORD Unknown0
,
158 NtUserGetWOWClass(DWORD Unknown0
,
167 NtUserRegisterClassExWOW(LPWNDCLASSEX lpwcx
,
175 * Registers a new class with the window manager
177 * lpcx = Win32 extended window class structure
178 * bUnicodeClass = Wether to send ANSI or unicode strings
179 * to window procedures
181 * Atom identifying the new class
184 PWINSTATION_OBJECT WinStaObject
;
185 PWNDCLASS_OBJECT ClassObject
;
191 DPRINT("About to open window station handle (0x%X)\n",
192 PROCESS_WINDOW_STATION());
194 Status
= ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
198 if (!NT_SUCCESS(Status
))
200 DPRINT("Validation of window station handle (0x%X) failed\n",
201 PROCESS_WINDOW_STATION());
205 Status
= RtlAddAtomToAtomTable(WinStaObject
->AtomTable
,
206 (LPWSTR
)lpwcx
->lpszClassName
,
208 if (!NT_SUCCESS(Status
))
210 ObDereferenceObject(WinStaObject
);
211 DPRINT("Failed adding class name (%wS) to atom table\n",
212 lpwcx
->lpszClassName
);
213 SetLastNtError(Status
);
218 objectSize
= sizeof(WNDCLASS_OBJECT
) +
219 (lpwcx
->lpszMenuName
!= 0 ? wcslen (lpwcx
->lpszMenuName
) + 1 : 0) +
220 wcslen (lpwcx
->lpszClassName
) + 1;
221 ClassObject
= ObmCreateObject(NULL
, NULL
, otClass
, objectSize
);
222 if (ClassObject
== 0)
224 RtlDeleteAtomFromAtomTable(WinStaObject
->AtomTable
, Atom
);
225 ObDereferenceObject(WinStaObject
);
226 DPRINT("Failed creating window class object\n");
227 SetLastNtError(STATUS_INSUFFICIENT_RESOURCES
);
232 ClassObject
->Class
= *lpwcx
;
233 ClassObject
->Unicode
= bUnicodeClass
;
234 namePtr
= (LPTSTR
)(((PCHAR
)ClassObject
) + sizeof (WNDCLASS_OBJECT
));
235 if (lpwcx
->lpszMenuName
!= 0)
237 ClassObject
->Class
.lpszMenuName
= namePtr
;
238 wcscpy (namePtr
, lpwcx
->lpszMenuName
);
239 namePtr
+= wcslen (lpwcx
->lpszMenuName
+ 1);
241 ClassObject
->Class
.lpszClassName
= namePtr
;
242 wcscpy (namePtr
, lpwcx
->lpszClassName
);
243 ExAcquireFastMutex(&PsGetWin32Process()->ClassListLock
);
244 InsertTailList(&PsGetWin32Process()->ClassListHead
, &ClassObject
->ListEntry
);
245 ExReleaseFastMutex(&PsGetWin32Process()->ClassListLock
);
247 ObDereferenceObject(WinStaObject
);
253 NtUserSetClassLong(DWORD Unknown0
,
264 NtUserSetClassWord(DWORD Unknown0
,
274 NtUserUnregisterClass(DWORD Unknown0
,