Alexandre Julliard : ntdll: Store a copy of the environment in RtlCreateProcessParametersEx().

Alexandre Julliard julliard at winehq.org
Tue Oct 16 15:53:07 CDT 2018


Module: wine
Branch: master
Commit: fce198cc5e797679f904c0ec58ed715fd0e8c481
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=fce198cc5e797679f904c0ec58ed715fd0e8c481

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Oct 16 15:15:27 2018 +0200

ntdll: Store a copy of the environment in RtlCreateProcessParametersEx().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/env.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/dlls/ntdll/env.c b/dlls/ntdll/env.c
index 9288713..fdd5d4f 100644
--- a/dlls/ntdll/env.c
+++ b/dlls/ntdll/env.c
@@ -453,8 +453,9 @@ NTSTATUS WINAPI RtlCreateProcessParametersEx( RTL_USER_PROCESS_PARAMETERS **resu
     static const UNICODE_STRING null_str = { 0, 0, NULL };
 
     const RTL_USER_PROCESS_PARAMETERS *cur_params;
-    SIZE_T size, total_size;
+    SIZE_T size, env_size, total_size;
     void *ptr;
+    const WCHAR *env;
     NTSTATUS status;
 
     RtlAcquirePebLock();
@@ -474,6 +475,11 @@ NTSTATUS WINAPI RtlCreateProcessParametersEx( RTL_USER_PROCESS_PARAMETERS **resu
     if (!ShellInfo) ShellInfo = &empty_str;
     if (!RuntimeInfo) RuntimeInfo = &null_str;
 
+    env = Environment;
+    while (*env) env += strlenW(env) + 1;
+    env++;
+    env_size = (env - Environment) * sizeof(WCHAR);
+
     size = (sizeof(RTL_USER_PROCESS_PARAMETERS)
             + ImagePathName->MaximumLength
             + DllPath->MaximumLength
@@ -484,7 +490,7 @@ NTSTATUS WINAPI RtlCreateProcessParametersEx( RTL_USER_PROCESS_PARAMETERS **resu
             + ShellInfo->MaximumLength
             + RuntimeInfo->MaximumLength);
 
-    total_size = size;
+    total_size = size + env_size;
     ptr = NULL;
     if ((status = NtAllocateVirtualMemory( NtCurrentProcess(), &ptr, 0, &total_size,
                                            MEM_COMMIT, PAGE_READWRITE )) == STATUS_SUCCESS)
@@ -494,7 +500,6 @@ NTSTATUS WINAPI RtlCreateProcessParametersEx( RTL_USER_PROCESS_PARAMETERS **resu
         params->Size           = size;
         params->Flags          = PROCESS_PARAMS_FLAG_NORMALIZED;
         params->ConsoleFlags   = cur_params->ConsoleFlags;
-        params->Environment    = Environment;
         /* all other fields are zero */
 
         ptr = params + 1;
@@ -506,6 +511,8 @@ NTSTATUS WINAPI RtlCreateProcessParametersEx( RTL_USER_PROCESS_PARAMETERS **resu
         append_unicode_string( &ptr, Desktop, &params->Desktop );
         append_unicode_string( &ptr, ShellInfo, &params->ShellInfo );
         append_unicode_string( &ptr, RuntimeInfo, &params->RuntimeInfo );
+        params->Environment = ptr;
+        memcpy( ptr, Environment, (env - Environment) * sizeof(WCHAR) );
         *result = params;
         if (!(flags & PROCESS_PARAMS_FLAG_NORMALIZED)) RtlDeNormalizeProcessParams( params );
     }




More information about the wine-cvs mailing list