From: Piotr Caban piotr@codeweavers.com
--- dlls/advapi32/Makefile.in | 2 +- dlls/advapi32/security.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/dlls/advapi32/Makefile.in b/dlls/advapi32/Makefile.in index 1b6cce08e67..272f9764267 100644 --- a/dlls/advapi32/Makefile.in +++ b/dlls/advapi32/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -D_ADVAPI32_ MODULE = advapi32.dll IMPORTLIB = advapi32 IMPORTS = kernelbase sechost msvcrt -DELAYIMPORTS = rpcrt4 user32 +DELAYIMPORTS = rpcrt4 user32 userenv
SOURCES = \ advapi.c \ diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index 92726643d61..fe6ba62d228 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -39,6 +39,7 @@ #include "iads.h" #include "advapi32_misc.h" #include "lmcons.h" +#include "userenv.h"
#include "wine/debug.h"
@@ -2686,8 +2687,22 @@ BOOL WINAPI CreateProcessWithLogonW( LPCWSTR user_name, LPCWSTR domain, LPCWSTR
if (LogonUserW(user_name, domain, password, 0, 0, &token)) { - BOOL ret = CreateProcessAsUserW( token, application_name, command_line, NULL, NULL, FALSE, creation_flags, - environment, current_directory, startup_info, process_information ); + void *env = environment; + BOOL ret = TRUE; + + if (!environment) + { + ret = CreateEnvironmentBlock(&env, token, FALSE); + creation_flags |= CREATE_UNICODE_ENVIRONMENT; + } + + if (ret) + { + ret = CreateProcessAsUserW( token, application_name, command_line, NULL, NULL, FALSE, + creation_flags, env, current_directory, startup_info, process_information ); + } + if (env != environment) + DestroyEnvironmentBlock(env); CloseHandle(token); return ret; }