Check for double class registration and implement Get/SetClassLong with

Offset >= 0

svn path=/trunk/; revision=6448
This commit is contained in:
Gé van Geldorp 2003-10-28 20:19:45 +00:00
parent 82fc43d926
commit 40be01c894
2 changed files with 54 additions and 2 deletions

View file

@ -25,6 +25,7 @@ typedef struct _WNDCLASS_OBJECT
HICON hIconSm; HICON hIconSm;
BOOL Unicode; BOOL Unicode;
LIST_ENTRY ListEntry; LIST_ENTRY ListEntry;
PCHAR ExtraData;
} WNDCLASS_OBJECT, *PWNDCLASS_OBJECT; } WNDCLASS_OBJECT, *PWNDCLASS_OBJECT;
NTSTATUS FASTCALL NTSTATUS FASTCALL

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: class.c,v 1.37 2003/10/22 14:02:54 navaraf Exp $ /* $Id: class.c,v 1.38 2003/10/28 20:19:45 gvg Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -295,7 +295,20 @@ IntCreateClass(CONST WNDCLASSEXW *lpwcx,
{ {
PWNDCLASS_OBJECT ClassObject; PWNDCLASS_OBJECT ClassObject;
WORD objectSize; WORD objectSize;
objectSize = sizeof(WNDCLASS_OBJECT); NTSTATUS Status;
/* Check for double registration of the class. */
if (PsGetWin32Process() != NULL)
{
Status = ClassReferenceClassByAtom(&ClassObject, Atom);
if (NT_SUCCESS(Status))
{
ObmDereferenceObject(ClassObject);
return(NULL);
}
}
objectSize = sizeof(WNDCLASS_OBJECT) + lpwcx->cbClsExtra;
ClassObject = ObmCreateObject(NULL, NULL, otClass, objectSize); ClassObject = ObmCreateObject(NULL, NULL, otClass, objectSize);
if (ClassObject == 0) if (ClassObject == 0)
{ {
@ -332,6 +345,17 @@ IntCreateClass(CONST WNDCLASSEXW *lpwcx,
ClassObject->lpszMenuName = ExAllocatePool(NonPagedPool,sizeof(UNICODE_STRING)); ClassObject->lpszMenuName = ExAllocatePool(NonPagedPool,sizeof(UNICODE_STRING));
RtlCreateUnicodeString(ClassObject->lpszMenuName,(LPWSTR)lpwcx->lpszMenuName); RtlCreateUnicodeString(ClassObject->lpszMenuName,(LPWSTR)lpwcx->lpszMenuName);
} }
/* Extra class data */
if (ClassObject->cbClsExtra != 0)
{
ClassObject->ExtraData = (PCHAR)(ClassObject + 1);
RtlZeroMemory(ClassObject->ExtraData, ClassObject->cbClsExtra);
}
else
{
ClassObject->ExtraData = NULL;
}
return(ClassObject); return(ClassObject);
} }
@ -411,6 +435,20 @@ ULONG FASTCALL
IntGetClassLong(struct _WINDOW_OBJECT *WindowObject, ULONG Offset, BOOL Ansi) IntGetClassLong(struct _WINDOW_OBJECT *WindowObject, ULONG Offset, BOOL Ansi)
{ {
LONG Ret; LONG Ret;
if ((int)Offset >= 0)
{
DbgPrint("GetClassLong(%x, %d)\n", WindowObject->Self, Offset);
if (Offset > WindowObject->Class->cbClsExtra - sizeof(LONG))
{
SetLastWin32Error(ERROR_INVALID_PARAMETER);
return 0;
}
Ret = *((LONG *)(WindowObject->Class->ExtraData + Offset));
DbgPrint("Result: %x\n", Ret);
return Ret;
}
switch (Offset) switch (Offset)
{ {
case GCL_CBWNDEXTRA: case GCL_CBWNDEXTRA:
@ -482,6 +520,19 @@ void FASTCALL
IntSetClassLong(PWINDOW_OBJECT WindowObject, ULONG Offset, LONG dwNewLong, BOOL Ansi) IntSetClassLong(PWINDOW_OBJECT WindowObject, ULONG Offset, LONG dwNewLong, BOOL Ansi)
{ {
PUNICODE_STRING str; PUNICODE_STRING str;
if ((int)Offset >= 0)
{
DbgPrint("SetClassLong(%x, %d, %x)\n", WindowObject->Self, Offset, dwNewLong);
if (Offset > WindowObject->Class->cbClsExtra - sizeof(LONG))
{
SetLastWin32Error(ERROR_INVALID_PARAMETER);
return;
}
*((LONG *)(WindowObject->Class->ExtraData + Offset)) = dwNewLong;
return;
}
switch (Offset) switch (Offset)
{ {
case GCL_CBWNDEXTRA: case GCL_CBWNDEXTRA: