- Fix user32:monitor winetest failures (ClipCursor bugs)
- Protect functions in accelerator.c with SEH

svn path=/trunk/; revision=53636
This commit is contained in:
Rafal Harabien 2011-09-08 09:55:28 +00:00
parent c7b81786fe
commit 8571e00fdc
2 changed files with 100 additions and 41 deletions

View file

@ -309,6 +309,10 @@ NtUserCopyAcceleratorTable(
Ret = 0;
_SEH2_TRY
{
ProbeForWrite(Entries, EntriesCount*sizeof(Entries[0]), 4);
while (!Done)
{
if (Entries)
@ -324,6 +328,13 @@ NtUserCopyAcceleratorTable(
Ret++;
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
SetLastNtError(_SEH2_GetExceptionCode());
Ret = 0;
}
_SEH2_END;
RETURN(Ret);
@ -342,6 +353,7 @@ NtUserCreateAcceleratorTable(
PACCELERATOR_TABLE Accel;
HACCEL hAccel;
INT Index;
NTSTATUS Status = STATUS_SUCCESS;
DECLARE_RETURN(HACCEL);
TRACE("Enter NtUserCreateAcceleratorTable(Entries %p, EntriesCount %d)\n",
@ -374,6 +386,10 @@ NtUserCreateAcceleratorTable(
RETURN( (HACCEL) NULL);
}
_SEH2_TRY
{
ProbeForRead(Entries, EntriesCount * sizeof(ACCEL), 4);
for (Index = 0; Index < EntriesCount; Index++)
{
Accel->Table[Index].fVirt = Entries[Index].fVirt&0x7f;
@ -392,6 +408,21 @@ NtUserCreateAcceleratorTable(
Accel->Table[Index].cmd = Entries[Index].cmd;
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
if (!NT_SUCCESS(Status))
{
ExFreePoolWithTag(Accel->Table, USERTAG_ACCEL);
UserDereferenceObject(Accel);
UserDeleteObject(hAccel, otAccel);
SetLastNtError(Status);
RETURN( (HACCEL) NULL);
}
/* Set the end-of-table terminator. */
Accel->Table[EntriesCount - 1].fVirt |= 0x80;
@ -450,28 +481,41 @@ APIENTRY
NtUserTranslateAccelerator(
HWND hWnd,
HACCEL hAccel,
LPMSG Message)
LPMSG pUnsafeMessage)
{
PWND Window = NULL;
PACCELERATOR_TABLE Accel = NULL;
ULONG i;
MSG Message;
USER_REFERENCE_ENTRY AccelRef, WindowRef;
DECLARE_RETURN(int);
TRACE("NtUserTranslateAccelerator(hWnd %x, Table %x, Message %p)\n",
hWnd, hAccel, Message);
hWnd, hAccel, pUnsafeMessage);
UserEnterShared();
if (Message == NULL)
if (pUnsafeMessage == NULL)
{
SetLastNtError(STATUS_INVALID_PARAMETER);
RETURN( 0);
}
if ((Message->message != WM_KEYDOWN) &&
(Message->message != WM_SYSKEYDOWN) &&
(Message->message != WM_SYSCHAR) &&
(Message->message != WM_CHAR))
_SEH2_TRY
{
ProbeForRead(pUnsafeMessage, sizeof(MSG), 4);
RtlCopyMemory(&Message, pUnsafeMessage, sizeof(MSG));
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
SetLastNtError(_SEH2_GetExceptionCode());
_SEH2_YIELD(RETURN( 0));
}
_SEH2_END;
if ((Message.message != WM_KEYDOWN) &&
(Message.message != WM_SYSKEYDOWN) &&
(Message.message != WM_SYSCHAR) &&
(Message.message != WM_CHAR))
{
RETURN( 0);
}
@ -490,17 +534,16 @@ NtUserTranslateAccelerator(
UserRefObjectCo(Window, &WindowRef);
/* FIXME: Associate AcceleratorTable with the current thread */
for (i = 0; i < Accel->Count; i++)
{
if (co_IntTranslateAccelerator(Window, Message->message, Message->wParam, Message->lParam,
if (co_IntTranslateAccelerator(Window, Message.message, Message.wParam, Message.lParam,
Accel->Table[i].fVirt, Accel->Table[i].key,
Accel->Table[i].cmd))
{
TRACE("NtUserTranslateAccelerator(hWnd %x, Table %x, Message %p) = %i end\n",
hWnd, hAccel, Message, 1);
hWnd, hAccel, pUnsafeMessage, 1);
RETURN( 1);
}
if (((Accel->Table[i].fVirt & 0x80) > 0))
@ -516,7 +559,7 @@ CLEANUP:
if (Accel) UserDerefObjectCo(Accel);
TRACE("NtUserTranslateAccelerator(hWnd %x, Table %x, Message %p) = %i end\n",
hWnd, hAccel, Message, 0);
hWnd, hAccel, pUnsafeMessage, 0);
UserLeave();
END_CLEANUP;
}

View file

@ -564,13 +564,29 @@ UserClipCursor(
DesktopWindow = UserGetDesktopWindow();
if (prcl != NULL &&
(prcl->right > prcl->left) &&
(prcl->bottom > prcl->top) &&
DesktopWindow != NULL)
if (prcl != NULL && DesktopWindow != NULL)
{
if (prcl->right < prcl->left || prcl->bottom < prcl->top)
{
EngSetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
CurInfo->bClipped = TRUE;
RECTL_bIntersectRect(&CurInfo->rcClip, prcl, &DesktopWindow->rcWindow);
/* Set nw cliping region. Note: we can't use RECTL_bIntersectRect because
it sets rect to 0 0 0 0 when it's empty. For more info see monitor winetest */
CurInfo->rcClip.left = max(prcl->left, DesktopWindow->rcWindow.left);
CurInfo->rcClip.right = min(prcl->right, DesktopWindow->rcWindow.right);
if (CurInfo->rcClip.right < CurInfo->rcClip.left)
CurInfo->rcClip.right = CurInfo->rcClip.left;
CurInfo->rcClip.top = max(prcl->top, DesktopWindow->rcWindow.top);
CurInfo->rcClip.bottom = min(prcl->bottom, DesktopWindow->rcWindow.bottom);
if (CurInfo->rcClip.bottom < CurInfo->rcClip.top)
CurInfo->rcClip.bottom = CurInfo->rcClip.top;
/* Make sure cursor is in clipping region */
UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y, 0, 0, FALSE);
}
else