https://git.reactos.org/?p=reactos.git;a=commitdiff;h=07abea90d9fecbce58a84…
commit 07abea90d9fecbce58a84ef16018b6603cfb272d
Author: Doug Lyons <douglyons(a)douglyons.com>
AuthorDate: Sun Sep 1 13:24:22 2024 -0500
Commit: GitHub <noreply(a)github.com>
CommitDate: Sun Sep 1 13:24:22 2024 -0500
[NTUSER] Optimize BroadcastSystemMessage a bit. Follow-up of #6884 (#7215)
Optimize BroadcastSystemMessage with Environment parameter.
Minimize processing when UserModeMsg->lParam is NULL and KernelModeMsg->message
!= WM_WININICHANGE
Make sure that we have a UNICODE_NULL within lParamMsg based on comment from
@whindsaks
---
win32ss/user/ntuser/message.c | 26 ++++++++++----------------
1 file changed, 10 insertions(+), 16 deletions(-)
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);