diff --git a/programs/services/rpc.c b/programs/services/rpc.c index 43eb3cdca5b..9ecc09ce740 100644 --- a/programs/services/rpc.c +++ b/programs/services/rpc.c @@ -510,6 +510,7 @@ static DWORD create_serviceW( } entry->ref_count = 1; + entry->is_wow64 = is_wow64; entry->config.dwServiceType = entry->status.dwServiceType = dwServiceType; entry->config.dwStartType = dwStartType; entry->config.dwErrorControl = dwErrorControl; diff --git a/programs/services/services.c b/programs/services/services.c index 54d9e89c69e..dd7977028df 100644 --- a/programs/services/services.c +++ b/programs/services/services.c @@ -66,7 +66,7 @@ static const WCHAR SZ_OBJECT_NAME[] = {'O','b','j','e','c','t','N','a','m' static const WCHAR SZ_TAG[] = {'T','a','g',0}; static const WCHAR SZ_DESCRIPTION[] = {'D','e','s','c','r','i','p','t','i','o','n',0}; static const WCHAR SZ_PRESHUTDOWN[] = {'P','r','e','s','h','u','t','d','o','w','n','T','i','m','e','o','u','t',0}; - +static const WCHAR SZ_WOW64[] = {'W','O','W','6','4',0}; DWORD service_create(LPCWSTR name, struct service_entry **entry) { @@ -108,7 +108,7 @@ void free_service_entry(struct service_entry *entry) static DWORD load_service_config(HKEY hKey, struct service_entry *entry) { - DWORD err; + DWORD err, value = 0; WCHAR *wptr; if ((err = load_reg_string(hKey, SZ_IMAGE_PATH, TRUE, &entry->config.lpBinaryPathName)) != 0) @@ -137,6 +137,9 @@ static DWORD load_service_config(HKEY hKey, struct service_entry *entry) if ((err = load_reg_dword(hKey, SZ_PRESHUTDOWN, &entry->preshutdown_timeout)) != 0) return err; + if (load_reg_dword(hKey, SZ_WOW64, &value) == 0 && value == 1) + entry->is_wow64 = TRUE; + WINE_TRACE("Image path = %s\n", wine_dbgstr_w(entry->config.lpBinaryPathName) ); WINE_TRACE("Group = %s\n", wine_dbgstr_w(entry->config.lpLoadOrderGroup) ); WINE_TRACE("Service account name = %s\n", wine_dbgstr_w(entry->config.lpServiceStartName) ); @@ -216,6 +219,14 @@ DWORD save_service_config(struct service_entry *entry) goto cleanup; if ((err = RegSetValueExW(hKey, SZ_PRESHUTDOWN, 0, REG_DWORD, (LPBYTE)&entry->preshutdown_timeout, sizeof(DWORD))) != 0) goto cleanup; + if ((err = RegSetValueExW(hKey, SZ_PRESHUTDOWN, 0, REG_DWORD, (LPBYTE)&entry->preshutdown_timeout, sizeof(DWORD))) != 0) + goto cleanup; + if (entry->is_wow64) + { + const DWORD is_wow64 = 1; + if ((err = RegSetValueExW(hKey, SZ_WOW64, 0, REG_DWORD, (LPBYTE)&is_wow64, sizeof(DWORD))) != 0) + goto cleanup; + } if (entry->config.dwTagId) err = RegSetValueExW(hKey, SZ_TAG, 0, REG_DWORD, (LPBYTE)&entry->config.dwTagId, sizeof(DWORD)); diff --git a/programs/services/services.h b/programs/services/services.h index 88a84adeb48..909054254b0 100644 --- a/programs/services/services.h +++ b/programs/services/services.h @@ -49,6 +49,7 @@ struct service_entry HANDLE overlapped_event; HANDLE status_changed_event; BOOL marked_for_delete; + BOOL is_wow64; }; extern struct scmdatabase *active_database;