diff --git a/win32ss/user/ntuser/message.c b/win32ss/user/ntuser/message.c index c86754abc56..d28f35e3c79 100644 --- a/win32ss/user/ntuser/message.c +++ b/win32ss/user/ntuser/message.c @@ -453,7 +453,7 @@ CopyMsgToKernelMem(MSG *KernelModeMsg, MSG *UserModeMsg, PMSGMEMORY MsgMemoryEnt NTSTATUS Status; PVOID KernelMem; - UINT Size, i; + UINT Size; *KernelModeMsg = *UserModeMsg; @@ -483,23 +483,15 @@ CopyMsgToKernelMem(MSG *KernelModeMsg, MSG *UserModeMsg, PMSGMEMORY MsgMemoryEnt { TRACE("Copy Message %u from usermode buffer\n", KernelModeMsg->message); /* Don't do extra testing for 1 word messages. For examples see - * https://wiki.winehq.org/List_Of_Windows_Messages. */ - if (Size > 1) + * https://wiki.winehq.org/List_Of_Windows_Messages and + * we are just handling WM_WININICHANGE here. */ + if (Size > 1 && UserModeMsg->lParam && + KernelModeMsg->message == WM_WININICHANGE) { WCHAR lParamMsg[_countof(StrUserKernel[0]) + 1] = { 0 }; _SEH2_TRY { - if (UserModeMsg->lParam) - RtlCopyMemory(lParamMsg, (WCHAR*)UserModeMsg->lParam, sizeof(lParamMsg)); - /* Make sure that the last WCHAR is a UNICODE_NULL */ - for (i = 0; i < ARRAYSIZE(lParamMsg); ++i) - { - if (lParamMsg[i] == 0) - break; - } - /* If we did not find a UNICODE_NULL, then set last WCHAR to one */ - if (i == ARRAYSIZE(lParamMsg)) - lParamMsg[_countof(StrUserKernel[0])] = UNICODE_NULL; + RtlCopyMemory(lParamMsg, (WCHAR*)UserModeMsg->lParam, sizeof(lParamMsg)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -507,8 +499,10 @@ CopyMsgToKernelMem(MSG *KernelModeMsg, MSG *UserModeMsg, PMSGMEMORY MsgMemoryEnt } _SEH2_END; - if (UserModeMsg->lParam && !UserModeMsg->wParam && - PosInArray(lParamMsg) >= 0) + /* Make sure that we have a UNICODE_NULL within lParamMsg */ + lParamMsg[ARRAYSIZE(lParamMsg) - 1] = UNICODE_NULL; + + if (!UserModeMsg->wParam && PosInArray(lParamMsg) >= 0) { TRACE("Copy String '%S' from usermode buffer\n", lParamMsg); wcscpy(KernelMem, lParamMsg);