- Patch by Maxim Andreyanov : CreateWindowEx have to set error when menu handle is invalid.
- See CORE-7980.

svn path=/trunk/; revision=62494
This commit is contained in:
James Tabor 2014-03-14 02:39:18 +00:00
parent 5783342323
commit fa3242a619
3 changed files with 52 additions and 0 deletions

View file

@ -554,6 +554,47 @@ HANDLE FASTCALL ValidateHandleNoErr(HANDLE handle, HANDLE_TYPE type)
if (handle) return (PWND)UserGetObjectNoErr(gHandleTable, handle, type);
return NULL;
}
PVOID FASTCALL ValidateHandle(HANDLE handle, HANDLE_TYPE type)
{
PVOID pObj;
DWORD dwError = 0;
if (handle)
{
pObj = UserGetObjectNoErr(gHandleTable, handle, type);
if (!pObj)
{
switch (type)
{
case TYPE_WINDOW:
dwError = ERROR_INVALID_WINDOW_HANDLE;
break;
case TYPE_MENU:
dwError = ERROR_INVALID_MENU_HANDLE;
break;
case TYPE_CURSOR:
dwError = ERROR_INVALID_CURSOR_HANDLE;
break;
case TYPE_SETWINDOWPOS:
dwError = ERROR_INVALID_DWP_HANDLE;
break;
case TYPE_HOOK:
dwError = ERROR_INVALID_HOOK_HANDLE;
break;
case TYPE_ACCELTABLE:
dwError = ERROR_INVALID_ACCEL_HANDLE;
break;
default:
dwError = ERROR_INVALID_HANDLE;
break;
}
EngSetLastError(dwError);
return NULL;
}
return pObj;
}
return NULL;
}
/*
* NtUserValidateHandleSecure

View file

@ -19,6 +19,7 @@ BOOL FASTCALL UserObjectInDestroy(HANDLE);
void DbgUserDumpHandleTable();
VOID FASTCALL UserSetObjectOwner(PVOID obj, HANDLE_TYPE type, PVOID owner);
HANDLE FASTCALL ValidateHandleNoErr(HANDLE handle, HANDLE_TYPE type);
PVOID FASTCALL ValidateHandle(HANDLE handle, HANDLE_TYPE type);
static __inline VOID
UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)

View file

@ -2571,6 +2571,16 @@ NtUserCreateWindowEx(
ASSERT(plstrWindowName);
if ( (dwStyle & (WS_POPUP|WS_CHILD)) != WS_CHILD)
{
/* check hMenu is valid handle */
if (hMenu && !ValidateHandle(hMenu, TYPE_MENU))
{
/* error is set in ValidateHandle */
return NULL;
}
}
/* Copy the window name to kernel mode */
Status = ProbeAndCaptureLargeString(&lstrWindowName, plstrWindowName);
if (!NT_SUCCESS(Status))