- Return more correct error codes from NtUserRegisterClassExWOW.

- Delete atom in NtUserUnregisterClass.
- Corrected DC locking in NtGdiSetDIBColorTable.
- Check region handles in NtGdiPaintRgn.

svn path=/trunk/; revision=8153
This commit is contained in:
Filip Navara 2004-02-11 17:56:29 +00:00
parent d54eeab6a3
commit ca73abde9a
3 changed files with 64 additions and 44 deletions

View file

@ -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.45 2003/12/22 15:30:21 navaraf Exp $
/* $Id: class.c,v 1.46 2004/02/11 17:56:29 navaraf Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -282,6 +282,7 @@ IntCreateClass(CONST WNDCLASSEXW *lpwcx,
if (NT_SUCCESS(Status))
{
ObmDereferenceObject(ClassObject);
SetLastWin32Error(ERROR_CLASS_ALREADY_EXISTS);
return(NULL);
}
}
@ -290,6 +291,7 @@ IntCreateClass(CONST WNDCLASSEXW *lpwcx,
ClassObject = ObmCreateObject(NULL, NULL, otClass, objectSize);
if (ClassObject == 0)
{
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
return(NULL);
}
@ -413,7 +415,6 @@ NtUserRegisterClassExWOW(
}
ObDereferenceObject(WinStaObject);
DPRINT("Failed creating window class object\n");
SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
return((RTL_ATOM)0);
}
ExAcquireFastMutex(&PsGetWin32Process()->ClassListLock);
@ -607,51 +608,65 @@ NtUserSetClassWord(DWORD Unknown0,
}
BOOL STDCALL
NtUserUnregisterClass(LPCWSTR ClassNameOrAtom,
HINSTANCE hInstance,
DWORD Unknown)
NtUserUnregisterClass(
LPCWSTR ClassNameOrAtom,
HINSTANCE hInstance,
DWORD Unknown)
{
NTSTATUS Status;
PWNDCLASS_OBJECT Class;
NTSTATUS Status;
PWNDCLASS_OBJECT Class;
PWINSTATION_OBJECT WinStaObject;
if(!ClassNameOrAtom)
{
SetLastWin32Error(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (!ClassNameOrAtom)
{
SetLastWin32Error(ERROR_INVALID_PARAMETER);
return FALSE;
}
Status = ClassReferenceClassByNameOrAtom(&Class, ClassNameOrAtom);
if(!NT_SUCCESS(Status))
{
SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST);
return FALSE;
}
Status = IntValidateWindowStationHandle(
PROCESS_WINDOW_STATION(),
KernelMode,
0,
&WinStaObject);
if (!NT_SUCCESS(Status))
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
return FALSE;
}
if(Class->hInstance && (Class->hInstance != hInstance))
{
ObmDereferenceObject(Class);
SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST);
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;
}
if (Class->hInstance && Class->hInstance != hInstance)
{
ObmDereferenceObject(Class);
SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST);
return FALSE;
}
/* Dereference the ClassReferenceClassByNameOrAtom() call */
ObmDereferenceObject(Class);
if (ObmGetReferenceCount(Class) > 2)
{
ObmDereferenceObject(Class);
SetLastWin32Error(ERROR_CLASS_HAS_WINDOWS);
return FALSE;
}
RemoveEntryList(&Class->ListEntry);
/* Dereference the ClassReferenceClassByNameOrAtom() call */
ObmDereferenceObject(Class);
/* FIXME - delete the atom? */
RemoveEntryList(&Class->ListEntry);
/* Free the object */
ObmDereferenceObject(Class);
RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Class->Atom);
ObDereferenceObject(WinStaObject);
return TRUE;
/* Free the object */
ObmDereferenceObject(Class);
return TRUE;
}
/* EOF */

View file

@ -1,5 +1,5 @@
/*
* $Id: dib.c,v 1.40 2004/01/16 19:32:00 gvg Exp $
* $Id: dib.c,v 1.41 2004/02/11 17:56:29 navaraf Exp $
*
* ReactOS W32 Subsystem
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
@ -48,11 +48,11 @@ UINT STDCALL NtGdiSetDIBColorTable(HDC hDC,
PPALGDI palette;
const RGBQUAD *end;
if (!(dc = (PDC)AccessUserObject((ULONG)hDC))) return 0;
if (!(dc = DC_LockDc(hDC))) return 0;
if (!(palette = PALETTE_LockPalette((ULONG)dc->DevInfo->hpalDefault)))
{
// GDI_ReleaseObj( hdc );
DC_UnlockDc(hDC);
return 0;
}
@ -80,7 +80,7 @@ UINT STDCALL NtGdiSetDIBColorTable(HDC hDC,
}
PALETTE_UnlockPalette(dc->DevInfo->hpalDefault);
// GDI_ReleaseObj(hdc);
DC_UnlockDc(hDC);
return Entries;
}

View file

@ -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: region.c,v 1.40 2003/12/13 11:15:06 weiden Exp $ */
/* $Id: region.c,v 1.41 2004/02/11 17:56:29 navaraf Exp $ */
#undef WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <ddk/ntddk.h>
@ -2011,6 +2011,11 @@ NtGdiPaintRgn(HDC hDC,
//visrgn = RGNDATA_LockRgn(tmpVisRgn);
visrgn = RGNDATA_LockRgn(hRgn);
if (visrgn == NULL)
{
DC_UnlockDc( hDC );
return FALSE;
}
ClipRegion = IntEngCreateClipRegion (
visrgn->rdh.nCount, (PRECTL)visrgn->Buffer, visrgn->rdh.rcBound );