[WIN32K:NTUSER]

- Probe parameters in NtUserGetLayeredWindowAttributes
- Don't call UserGetWindowObject without holding the user lock

svn path=/trunk/; revision=69182
This commit is contained in:
Thomas Faber 2015-09-11 07:31:06 +00:00
parent e88843426b
commit 953771f506

View file

@ -224,15 +224,15 @@ NtUserGetLayeredWindowAttributes(
BOOL Ret = FALSE; BOOL Ret = FALSE;
TRACE("Enter NtUserGetLayeredWindowAttributes\n"); TRACE("Enter NtUserGetLayeredWindowAttributes\n");
UserEnterExclusive();
if (!(pWnd = UserGetWindowObject(hwnd)) || if (!(pWnd = UserGetWindowObject(hwnd)) ||
!(pWnd->ExStyle & WS_EX_LAYERED) ) !(pWnd->ExStyle & WS_EX_LAYERED) )
{ {
return FALSE; ERR("Not a Layered Window!\n");
goto Exit;
} }
UserEnterExclusive();
pLrdProp = UserGetProp(pWnd, AtomLayer); pLrdProp = UserGetProp(pWnd, AtomLayer);
if (!pLrdProp) if (!pLrdProp)
@ -248,9 +248,21 @@ NtUserGetLayeredWindowAttributes(
_SEH2_TRY _SEH2_TRY
{ {
if (pcrKey) *pcrKey = pLrdProp->Key; if (pcrKey)
if (pbAlpha) *pbAlpha = pLrdProp->Alpha; {
if (pdwFlags) *pdwFlags = pLrdProp->Flags; ProbeForWrite(pcrKey, sizeof(*pcrKey), 1);
*pcrKey = pLrdProp->Key;
}
if (pbAlpha)
{
ProbeForWrite(pbAlpha, sizeof(*pbAlpha), 1);
*pbAlpha = pLrdProp->Alpha;
}
if (pdwFlags)
{
ProbeForWrite(pdwFlags, sizeof(*pdwFlags), 1);
*pdwFlags = pLrdProp->Flags;
}
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
@ -322,10 +334,11 @@ NtUserUpdateLayeredWindow(
BOOL Ret = FALSE; BOOL Ret = FALSE;
TRACE("Enter NtUserUpdateLayeredWindow\n"); TRACE("Enter NtUserUpdateLayeredWindow\n");
UserEnterExclusive();
if (!(pWnd = UserGetWindowObject(hwnd))) if (!(pWnd = UserGetWindowObject(hwnd)))
{ {
return FALSE; goto Exit;
} }
_SEH2_TRY _SEH2_TRY
@ -356,12 +369,10 @@ NtUserUpdateLayeredWindow(
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
EngSetLastError( ERROR_INVALID_PARAMETER ); EngSetLastError( ERROR_INVALID_PARAMETER );
_SEH2_YIELD(return FALSE); _SEH2_YIELD(goto Exit);
} }
_SEH2_END; _SEH2_END;
UserEnterExclusive();
if ( GetLayeredStatus(pWnd) || if ( GetLayeredStatus(pWnd) ||
dwFlags & ~(ULW_COLORKEY | ULW_ALPHA | ULW_OPAQUE | ULW_EX_NORESIZE) || dwFlags & ~(ULW_COLORKEY | ULW_ALPHA | ULW_OPAQUE | ULW_EX_NORESIZE) ||
!(pWnd->ExStyle & WS_EX_LAYERED) ) !(pWnd->ExStyle & WS_EX_LAYERED) )
@ -373,14 +384,14 @@ NtUserUpdateLayeredWindow(
info.cbSize = sizeof(info); info.cbSize = sizeof(info);
info.hdcDst = hdcDst; info.hdcDst = hdcDst;
info.pptDst = pptDst? &Dst : 0; info.pptDst = pptDst? &Dst : NULL;
info.psize = &Size; info.psize = &Size;
info.hdcSrc = hdcSrc; info.hdcSrc = hdcSrc;
info.pptSrc = pptSrc ? &Src : 0; info.pptSrc = pptSrc ? &Src : NULL;
info.crKey = crKey; info.crKey = crKey;
info.pblend = &blend; info.pblend = &blend;
info.dwFlags = dwFlags; info.dwFlags = dwFlags;
info.prcDirty = prcDirty ? &Dirty : 0; info.prcDirty = prcDirty ? &Dirty : NULL;
Ret = IntUpdateLayeredWindowI( pWnd, &info ); Ret = IntUpdateLayeredWindowI( pWnd, &info );
Exit: Exit:
TRACE("Leave NtUserUpdateLayeredWindow, ret=%i\n", Ret); TRACE("Leave NtUserUpdateLayeredWindow, ret=%i\n", Ret);