Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46833 --- dlls/msi/custom.c | 14 ++++++++++---- dlls/msi/msi.spec | 2 +- programs/msiexec/msiexec.c | 9 +++++---- 3 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c index 8bf0902914..facb1d81e1 100644 --- a/dlls/msi/custom.c +++ b/dlls/msi/custom.c @@ -477,7 +477,7 @@ static void handle_msi_break(LPCSTR target) }
static WCHAR ncalrpcW[] = {'n','c','a','l','r','p','c',0}; -static WCHAR endpoint_lrpcW[] = {'m','s','i',0}; +static WCHAR endpoint_fmtW[] = {'m','s','i','%','x',0};
#ifdef __i386__ /* wrapper for apps that don't declare the thread function correctly */ @@ -502,7 +502,7 @@ static UINT custom_proc_wrapper( MsiCustomActionEntryPoint entry, MSIHANDLE hins } #endif
-UINT CDECL __wine_msi_call_dll_function(const GUID *guid) +UINT CDECL __wine_msi_call_dll_function(DWORD client_pid, const GUID *guid) { MsiCustomActionEntryPoint fn; MSIHANDLE remote_package = 0; @@ -519,7 +519,10 @@ UINT CDECL __wine_msi_call_dll_function(const GUID *guid)
if (!rpc_handle) { - status = RpcStringBindingComposeW(NULL, ncalrpcW, NULL, endpoint_lrpcW, NULL, &binding_str); + WCHAR endpoint[12]; + + sprintfW(endpoint, endpoint_fmtW, client_pid); + status = RpcStringBindingComposeW(NULL, ncalrpcW, NULL, endpoint, NULL, &binding_str); if (status != RPC_S_OK) { ERR("RpcStringBindingCompose failed: %#x\n", status); @@ -740,8 +743,11 @@ static msi_custom_action_info *do_msidbCustomActionTypeDll(
if (!package->rpc_server_started) { + WCHAR endpoint[12]; + + sprintfW(endpoint, endpoint_fmtW, GetCurrentProcessId()); status = RpcServerUseProtseqEpW(ncalrpcW, RPC_C_PROTSEQ_MAX_REQS_DEFAULT, - endpoint_lrpcW, NULL); + endpoint, NULL); if (status != RPC_S_OK) { ERR("RpcServerUseProtseqEp failed: %#x\n", status); diff --git a/dlls/msi/msi.spec b/dlls/msi/msi.spec index aecba1b1b3..eeb9ea757c 100644 --- a/dlls/msi/msi.spec +++ b/dlls/msi/msi.spec @@ -295,4 +295,4 @@ @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer()
-@ cdecl __wine_msi_call_dll_function(ptr) +@ cdecl __wine_msi_call_dll_function(long ptr) diff --git a/programs/msiexec/msiexec.c b/programs/msiexec/msiexec.c index efbcb5c7f4..3340ade776 100644 --- a/programs/msiexec/msiexec.c +++ b/programs/msiexec/msiexec.c @@ -397,19 +397,20 @@ static DWORD DoUnregServer(void) return ret; }
-extern UINT CDECL __wine_msi_call_dll_function(GUID *guid); +extern UINT CDECL __wine_msi_call_dll_function(DWORD client_pid, const GUID *guid); + +static DWORD client_pid;
static DWORD CALLBACK custom_action_thread(void *arg) { GUID guid = *(GUID *)arg; heap_free(arg); - return __wine_msi_call_dll_function(&guid); + return __wine_msi_call_dll_function(client_pid, &guid); }
static int custom_action_server(const WCHAR *arg) { static const WCHAR pipe_name[] = {'\','\','.','\','p','i','p','e','\','m','s','i','c','a','_','%','x','_','%','d',0}; - DWORD client_pid = atoiW(arg); GUID guid, *thread_guid; DWORD64 thread64; WCHAR buffer[24]; @@ -419,7 +420,7 @@ static int custom_action_server(const WCHAR *arg)
TRACE("%s\n", debugstr_w(arg));
- if (!client_pid) + if (!(client_pid = atoiW(arg))) { ERR("Invalid parameter %s\n", debugstr_w(arg)); return 1;
Signed-off-by: Zebediah Figura z.figura12@gmail.com
On Fri, Mar 22, 2019 at 9:17 PM Zebediah Figura z.figura12@gmail.com wrote:
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46833
dlls/msi/custom.c | 14 ++++++++++---- dlls/msi/msi.spec | 2 +- programs/msiexec/msiexec.c | 9 +++++---- 3 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c index 8bf0902914..facb1d81e1 100644 --- a/dlls/msi/custom.c +++ b/dlls/msi/custom.c @@ -477,7 +477,7 @@ static void handle_msi_break(LPCSTR target) }
static WCHAR ncalrpcW[] = {'n','c','a','l','r','p','c',0}; -static WCHAR endpoint_lrpcW[] = {'m','s','i',0}; +static WCHAR endpoint_fmtW[] = {'m','s','i','%','x',0};
#ifdef __i386__ /* wrapper for apps that don't declare the thread function correctly */ @@ -502,7 +502,7 @@ static UINT custom_proc_wrapper( MsiCustomActionEntryPoint entry, MSIHANDLE hins } #endif
-UINT CDECL __wine_msi_call_dll_function(const GUID *guid) +UINT CDECL __wine_msi_call_dll_function(DWORD client_pid, const GUID *guid) { MsiCustomActionEntryPoint fn; MSIHANDLE remote_package = 0; @@ -519,7 +519,10 @@ UINT CDECL __wine_msi_call_dll_function(const GUID *guid)
if (!rpc_handle) {
status = RpcStringBindingComposeW(NULL, ncalrpcW, NULL, endpoint_lrpcW, NULL, &binding_str);
WCHAR endpoint[12];
sprintfW(endpoint, endpoint_fmtW, client_pid);
status = RpcStringBindingComposeW(NULL, ncalrpcW, NULL, endpoint, NULL, &binding_str); if (status != RPC_S_OK) { ERR("RpcStringBindingCompose failed: %#x\n", status);
@@ -740,8 +743,11 @@ static msi_custom_action_info *do_msidbCustomActionTypeDll(
if (!package->rpc_server_started) {
WCHAR endpoint[12];
sprintfW(endpoint, endpoint_fmtW, GetCurrentProcessId()); status = RpcServerUseProtseqEpW(ncalrpcW, RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
endpoint_lrpcW, NULL);
endpoint, NULL); if (status != RPC_S_OK) { ERR("RpcServerUseProtseqEp failed: %#x\n", status);
diff --git a/dlls/msi/msi.spec b/dlls/msi/msi.spec index aecba1b1b3..eeb9ea757c 100644 --- a/dlls/msi/msi.spec +++ b/dlls/msi/msi.spec @@ -295,4 +295,4 @@ @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer()
-@ cdecl __wine_msi_call_dll_function(ptr) +@ cdecl __wine_msi_call_dll_function(long ptr) diff --git a/programs/msiexec/msiexec.c b/programs/msiexec/msiexec.c index efbcb5c7f4..3340ade776 100644 --- a/programs/msiexec/msiexec.c +++ b/programs/msiexec/msiexec.c @@ -397,19 +397,20 @@ static DWORD DoUnregServer(void) return ret; }
-extern UINT CDECL __wine_msi_call_dll_function(GUID *guid); +extern UINT CDECL __wine_msi_call_dll_function(DWORD client_pid, const GUID *guid);
+static DWORD client_pid;
static DWORD CALLBACK custom_action_thread(void *arg) { GUID guid = *(GUID *)arg; heap_free(arg);
- return __wine_msi_call_dll_function(&guid);
- return __wine_msi_call_dll_function(client_pid, &guid);
}
static int custom_action_server(const WCHAR *arg) { static const WCHAR pipe_name[] = {'\','\','.','\','p','i','p','e','\','m','s','i','c','a','_','%','x','_','%','d',0};
- DWORD client_pid = atoiW(arg); GUID guid, *thread_guid; DWORD64 thread64; WCHAR buffer[24];
@@ -419,7 +420,7 @@ static int custom_action_server(const WCHAR *arg)
TRACE("%s\n", debugstr_w(arg));
- if (!client_pid)
- if (!(client_pid = atoiW(arg))) { ERR("Invalid parameter %s\n", debugstr_w(arg)); return 1;
-- 2.17.1