https://git.reactos.org/?p=reactos.git;a=commitdiff;h=07abea90d9fecbce58a84ef16018b6603cfb272d

commit 07abea90d9fecbce58a84ef16018b6603cfb272d
Author:     Doug Lyons <dougly...@douglyons.com>
AuthorDate: Sun Sep 1 13:24:22 2024 -0500
Commit:     GitHub <nore...@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);

Reply via email to