}
-/* return TRUE if class became destroyed */
inline VOID FASTCALL
ClassDerefObject(PWNDCLASS_OBJECT Class)
{
VOID FASTCALL DestroyClass(PWNDCLASS_OBJECT Class)
{
- PWINSTATION_OBJECT WinSta;
- WinSta = PsGetWin32Thread()->Desktop->WindowStation;
-
ASSERT(Class->refs == 0);
+
RemoveEntryList(&Class->ListEntry);
- //FIXME: release ATOM
- RtlDeleteAtomFromAtomTable(WinSta->AtomTable, Class->Atom);
+ if (Class->hMenu)
+ UserDestroyMenu(Class->hMenu);
+ RtlDeleteAtomFromAtomTable(gAtomTable, Class->Atom);
ExFreePool(Class);
}
PWNDCLASS_OBJECT FASTCALL
ClassGetClassByName(LPCWSTR ClassName, HINSTANCE hInstance)
{
- PWINSTATION_OBJECT WinSta;
NTSTATUS Status;
RTL_ATOM Atom;
if (!ClassName || !PsGetWin32Thread()->Desktop)
return FALSE;
- WinSta = PsGetWin32Thread()->Desktop->WindowStation;
-
Status = RtlLookupAtomInAtomTable(
- WinSta->AtomTable,
+ gAtomTable,
(LPWSTR)ClassName,
&Atom);
DWORD Flags,
WNDPROC wpExtra,
PUNICODE_STRING MenuName,
- RTL_ATOM Atom)
+ RTL_ATOM Atom,
+ HMENU hMenu)
{
PWNDCLASS_OBJECT Class;
ULONG objectSize;
Class->hInstance = lpwcx->hInstance;
Class->hIcon = lpwcx->hIcon;
Class->hCursor = lpwcx->hCursor;
+ Class->hMenu = hMenu;
Class->hbrBackground = lpwcx->hbrBackground;
Class->Unicode = !(Flags & REGISTERCLASS_ANSI);
Class->Global = Global;
PUNICODE_STRING MenuName,
WNDPROC wpExtra,
DWORD Flags,
- DWORD Unknown7)
+ DWORD Unknown7,
+ HMENU hMenu)
/*
* FUNCTION:
*/
{
WNDCLASSEXW SafeClass;
- PWINSTATION_OBJECT WinSta;
NTSTATUS Status;
RTL_ATOM Atom;
DECLARE_RETURN(RTL_ATOM);
RETURN( (RTL_ATOM)0);
}
- WinSta = PsGetWin32Thread()->Desktop->WindowStation;
-
//FIXME: make ClassName ptr the atom, not buffer
if (ClassName->Length > 0)
{
DPRINT("NtUserRegisterClassExWOW(%S)\n", ClassName->Buffer);
/* FIXME - Safely copy/verify the buffer first!!! */
- Status = RtlAddAtomToAtomTable(WinSta->AtomTable,
+ Status = RtlAddAtomToAtomTable(gAtomTable,
ClassName->Buffer,
&Atom);
if (!NT_SUCCESS(Status))
RETURN(0);
}
- if (!IntRegisterClass(&SafeClass, Flags, wpExtra, MenuName, Atom))
+ if (!IntRegisterClass(&SafeClass, Flags, wpExtra, MenuName, Atom, hMenu))
{
if (ClassName->Length)
{
- RtlDeleteAtomFromAtomTable(WinSta->AtomTable, Atom);
+ RtlDeleteAtomFromAtomTable(gAtomTable, Atom);
}
DPRINT("Failed creating window class object\n");
RETURN((RTL_ATOM)0);
{
PWINDOW_OBJECT Window;
LONG Ret;
+ USER_REFERENCE_ENTRY Ref;
DECLARE_RETURN(DWORD);
DPRINT("Enter NtUserSetClassLong\n");
RETURN(0);
}
- UserRefObjectCo(Window);
+ UserRefObjectCo(Window, &Ref);
Ret = IntGetClassLong(Window, Offset, Ansi);
co_IntSetClassLong(Window, Offset, dwNewLong, Ansi);
RETURN(FALSE);
}
-/* this was probably ment to prevent sysclass dereg
-Seems wrong. Any class can have NULL hInst, not only sysclasses
-
-*/
-// if (Class->hInstance && Class->hInstance != hInstance)
-// {
-// SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST);
-// RETURN( FALSE);
-// }
-
if (Class->refs)
{
/* NOTE: the class will not be freed when its refs become 0 ie. no more
{
PWINDOW_OBJECT Window;
DECLARE_RETURN(DWORD);
- PWINSTATION_OBJECT WinSta;
NTSTATUS Status;
UserEnterShared();
RETURN(0);
}
- WinSta = PsGetWin32Thread()->Desktop->WindowStation;
-
nMaxCount *= sizeof(WCHAR);
//FIXME: wrap in SEH to protect lpClassName access
- Status = RtlQueryAtomInAtomTable(WinSta->AtomTable,
+ Status = RtlQueryAtomInAtomTable(gAtomTable,
Window->Class->Atom, NULL, NULL,
lpClassName, &nMaxCount);
if (!NT_SUCCESS(Status))