Author: tfaber
Date: Fri Sep 11 07:31:06 2015
New Revision: 69182
URL:
http://svn.reactos.org/svn/reactos?rev=69182&view=rev
Log:
[WIN32K:NTUSER]
- Probe parameters in NtUserGetLayeredWindowAttributes
- Don't call UserGetWindowObject without holding the user lock
Modified:
trunk/reactos/win32ss/user/ntuser/layered.c
Modified: trunk/reactos/win32ss/user/ntuser/layered.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/layere…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/layered.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/layered.c [iso-8859-1] Fri Sep 11 07:31:06 2015
@@ -224,14 +224,14 @@
BOOL Ret = FALSE;
TRACE("Enter NtUserGetLayeredWindowAttributes\n");
+ UserEnterExclusive();
if (!(pWnd = UserGetWindowObject(hwnd)) ||
!(pWnd->ExStyle & WS_EX_LAYERED) )
{
- return FALSE;
- }
-
- UserEnterExclusive();
+ ERR("Not a Layered Window!\n");
+ goto Exit;
+ }
pLrdProp = UserGetProp(pWnd, AtomLayer);
@@ -248,9 +248,21 @@
_SEH2_TRY
{
- if (pcrKey) *pcrKey = pLrdProp->Key;
- if (pbAlpha) *pbAlpha = pLrdProp->Alpha;
- if (pdwFlags) *pdwFlags = pLrdProp->Flags;
+ if (pcrKey)
+ {
+ 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)
{
@@ -322,10 +334,11 @@
BOOL Ret = FALSE;
TRACE("Enter NtUserUpdateLayeredWindow\n");
+ UserEnterExclusive();
if (!(pWnd = UserGetWindowObject(hwnd)))
{
- return FALSE;
+ goto Exit;
}
_SEH2_TRY
@@ -356,11 +369,9 @@
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
EngSetLastError( ERROR_INVALID_PARAMETER );
- _SEH2_YIELD(return FALSE);
+ _SEH2_YIELD(goto Exit);
}
_SEH2_END;
-
- UserEnterExclusive();
if ( GetLayeredStatus(pWnd) ||
dwFlags & ~(ULW_COLORKEY | ULW_ALPHA | ULW_OPAQUE | ULW_EX_NORESIZE) ||
@@ -373,14 +384,14 @@
info.cbSize = sizeof(info);
info.hdcDst = hdcDst;
- info.pptDst = pptDst? &Dst : 0;
+ info.pptDst = pptDst? &Dst : NULL;
info.psize = &Size;
info.hdcSrc = hdcSrc;
- info.pptSrc = pptSrc ? &Src : 0;
+ info.pptSrc = pptSrc ? &Src : NULL;
info.crKey = crKey;
info.pblend = &blend;
info.dwFlags = dwFlags;
- info.prcDirty = prcDirty ? &Dirty : 0;
+ info.prcDirty = prcDirty ? &Dirty : NULL;
Ret = IntUpdateLayeredWindowI( pWnd, &info );
Exit:
TRACE("Leave NtUserUpdateLayeredWindow, ret=%i\n", Ret);