Module: wine Branch: master Commit: 8141fb80eb4d11b31ff5b4c67449455b1512e57e URL: http://source.winehq.org/git/wine.git/?a=commit;h=8141fb80eb4d11b31ff5b4c674...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Nov 15 12:55:58 2011 +0100
services: Create service environment when first service is started.
---
programs/services/Makefile.in | 2 +- programs/services/services.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/programs/services/Makefile.in b/programs/services/Makefile.in index 96ab500..e2c8086 100644 --- a/programs/services/Makefile.in +++ b/programs/services/Makefile.in @@ -1,7 +1,7 @@ EXTRADEFS = -DWINE_NO_UNICODE_MACROS MODULE = services.exe APPMODE = -mconsole -IMPORTS = rpcrt4 advapi32 +IMPORTS = rpcrt4 advapi32 userenv
C_SRCS = \ rpc.c \ diff --git a/programs/services/services.c b/programs/services/services.c index 7134ae7..94b4747 100644 --- a/programs/services/services.c +++ b/programs/services/services.c @@ -24,6 +24,7 @@ #include <windows.h> #include <winsvc.h> #include <rpc.h> +#include <userenv.h>
#include "wine/unicode.h" #include "wine/debug.h" @@ -40,6 +41,7 @@ struct scmdatabase *active_database;
DWORD service_pipe_timeout = 10000; DWORD service_kill_timeout = 20000; +static void *env = NULL;
static const int is_win64 = (sizeof(void *) > sizeof(int));
@@ -581,6 +583,17 @@ static DWORD service_start_process(struct service_entry *service_entry, HANDLE *
service_lock_exclusive(service_entry);
+ if (!env) + { + HANDLE htok; + + if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &htok)) + CreateEnvironmentBlock(&env, htok, FALSE); + + if (!env) + WINE_ERR("failed to create services environment\n"); + } + size = ExpandEnvironmentStringsW(service_entry->config.lpBinaryPathName,NULL,0); path = HeapAlloc(GetProcessHeap(),0,size*sizeof(WCHAR)); if (!path) @@ -632,7 +645,7 @@ static DWORD service_start_process(struct service_entry *service_entry, HANDLE *
service_unlock(service_entry);
- r = CreateProcessW(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); + r = CreateProcessW(NULL, path, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, env, NULL, &si, &pi); HeapFree(GetProcessHeap(),0,path); if (!r) { @@ -867,5 +880,7 @@ int main(int argc, char *argv[]) RPC_MainLoop(); } scmdatabase_destroy(active_database); + if (env) + DestroyEnvironmentBlock(env); return err; }