diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 55843095b2e..a772ce0f54f 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -1714,12 +1714,12 @@ STDCALL NtUserUnlockWindowStation( HWINSTA hWindowStation); -DWORD +BOOL STDCALL NtUserUnregisterClass( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2); + LPCWSTR ClassNameOrAtom, + HINSTANCE hInstance, + DWORD Unknown); BOOL STDCALL diff --git a/reactos/lib/user32/windows/class.c b/reactos/lib/user32/windows/class.c index 50cf2bfabde..9f5f7eb0967 100644 --- a/reactos/lib/user32/windows/class.c +++ b/reactos/lib/user32/windows/class.c @@ -1,4 +1,4 @@ -/* $Id: class.c,v 1.40 2003/12/07 10:31:21 navaraf Exp $ +/* $Id: class.c,v 1.41 2003/12/07 22:25:34 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -731,7 +731,7 @@ SetWindowLongW( /* - * @unimplemented + * @implemented */ WINBOOL STDCALL @@ -739,13 +739,33 @@ UnregisterClassA( LPCSTR lpClassName, HINSTANCE hInstance) { - UNIMPLEMENTED; - return FALSE; + LPWSTR ClassName; + NTSTATUS Status; + WINBOOL Result; + + if(!IS_ATOM(lpClassName)) + { + Status = HEAP_strdupAtoW(&ClassName, lpClassName, NULL); + if(!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + } + else + ClassName = (LPWSTR)lpClassName; + + Result = (WINBOOL)NtUserUnregisterClass((LPCWSTR)ClassName, hInstance, 0); + + if(ClassName && !IS_ATOM(lpClassName)) + HEAP_free(ClassName); + + return Result; } /* - * @unimplemented + * @implemented */ WINBOOL STDCALL @@ -753,8 +773,7 @@ UnregisterClassW( LPCWSTR lpClassName, HINSTANCE hInstance) { - UNIMPLEMENTED; - return FALSE; + return (WINBOOL)NtUserUnregisterClass(lpClassName, hInstance, 0); } /* EOF */ diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index ac64540181d..dd1266441d2 100644 --- a/reactos/subsys/win32k/ntuser/class.c +++ b/reactos/subsys/win32k/ntuser/class.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: class.c,v 1.42 2003/12/07 10:31:21 navaraf Exp $ +/* $Id: class.c,v 1.43 2003/12/07 22:25:34 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -157,6 +157,7 @@ NtUserGetClassInfo(HINSTANCE hInstance, LPCWSTR lpClassName, { PWNDCLASS_OBJECT Class; NTSTATUS Status; + RTL_ATOM Atom; Status = ClassReferenceClassByNameOrAtom(&Class, lpClassName); if (!NT_SUCCESS(Status)) @@ -187,8 +188,11 @@ NtUserGetClassInfo(HINSTANCE hInstance, LPCWSTR lpClassName, lpWndClassEx->lpszMenuName = (LPCWSTR)NULL; lpWndClassEx->lpszClassName = lpClassName; lpWndClassEx->hIconSm = Class->hIconSm; + Atom = Class->Atom; + + ObmDereferenceObject(Class); - return Class->Atom; + return Atom; } ULONG FASTCALL @@ -288,7 +292,7 @@ IntCreateClass(CONST WNDCLASSEXW *lpwcx, { return(NULL); } - + ClassObject->cbSize = lpwcx->cbSize; ClassObject->style = lpwcx->style; ClassObject->cbClsExtra = lpwcx->cbClsExtra; @@ -606,13 +610,45 @@ NtUserSetClassWord(DWORD Unknown0, return(0); } -DWORD STDCALL -NtUserUnregisterClass(DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2) +BOOL STDCALL +NtUserUnregisterClass(LPCWSTR ClassNameOrAtom, + HINSTANCE hInstance, + DWORD Unknown) { - UNIMPLEMENTED; - return(0); + NTSTATUS Status; + PWNDCLASS_OBJECT Class; + + if(!ClassNameOrAtom) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + + Status = ClassReferenceClassByNameOrAtom(&Class, ClassNameOrAtom); + if(!NT_SUCCESS(Status)) + { + SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST); + return FALSE; + } + + if(ObmGetReferenceCount(Class) > 2) + { + ObmDereferenceObject(Class); + SetLastWin32Error(ERROR_CLASS_HAS_WINDOWS); + return FALSE; + } + + /* Dereference the ClassReferenceClassByNameOrAtom() call */ + ObmDereferenceObject(Class); + + RemoveEntryList(&Class->ListEntry); + + /* FIXME - delete the atom? */ + + /* Free the object */ + ObmDereferenceObject(Class); + + return TRUE; } /* EOF */ diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 38ab3f8ff8d..296a832b7c1 100644 --- a/reactos/subsys/win32k/ntuser/window.c +++ b/reactos/subsys/win32k/ntuser/window.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: window.c,v 1.152 2003/12/07 19:29:33 weiden Exp $ +/* $Id: window.c,v 1.153 2003/12/07 22:25:34 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -368,7 +368,8 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, IntDestroyScrollBar(Window, SB_VERT); IntDestroyScrollBar(Window, SB_HORZ); - + + ObmDereferenceObject(Window->Class); Window->Class = NULL; ObmCloseHandle(ProcessData->WindowStation->HandleTable, Window->Self); @@ -558,7 +559,12 @@ IntCreateDesktopWindow(PWINSTATION_OBJECT WindowStation, PWSTR WindowName; HWND Handle; PWINDOW_OBJECT WindowObject; - + + if(!DesktopClass) + { + return (HWND)0; + } + /* Create the window object. */ WindowObject = (PWINDOW_OBJECT)ObmCreateObject(WindowStation->HandleTable, &Handle, @@ -572,6 +578,7 @@ IntCreateDesktopWindow(PWINSTATION_OBJECT WindowStation, /* * Fill out the structure describing it. */ + ObmReferenceObject(DesktopClass); WindowObject->Class = DesktopClass; WindowObject->ExStyle = 0; WindowObject->Style = WS_VISIBLE;