Zebediah Figura : msi: Make remote_GetActionInfo() RPC-compatible.

Alexandre Julliard julliard at winehq.org
Thu Apr 26 16:18:17 CDT 2018


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Wed Apr 25 20:54:39 2018 -0500

msi: Make remote_GetActionInfo() RPC-compatible.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msi/custom.c    | 74 +++++++++++++++++++---------------------------------
 dlls/msi/winemsi.idl |  4 +--
 2 files changed, 29 insertions(+), 49 deletions(-)

diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index 83b1687..f9976a0 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -24,6 +24,7 @@
 #define COBJMACROS
 
 #include <stdarg.h>
+#include <stdio.h>
 #include "windef.h"
 #include "winbase.h"
 #include "winerror.h"
@@ -467,37 +468,21 @@ static msi_custom_action_info *find_action_by_guid( const GUID *guid )
     return info;
 }
 
-static void handle_msi_break( LPCWSTR target )
+static void handle_msi_break(LPCSTR target)
 {
-    LPWSTR msg;
-    WCHAR val[MAX_PATH];
+    char format[] = "To debug your custom action, attach your debugger to "
+                    "process %i (0x%X) and press OK";
+    char val[MAX_PATH];
+    char msg[100];
 
-    static const WCHAR MsiBreak[] = { 'M','s','i','B','r','e','a','k',0 };
-    static const WCHAR WindowsInstaller[] = {
-        'W','i','n','d','o','w','s',' ','I','n','s','t','a','l','l','e','r',0
-    };
-
-    static const WCHAR format[] = {
-        'T','o',' ','d','e','b','u','g',' ','y','o','u','r',' ',
-        'c','u','s','t','o','m',' ','a','c','t','i','o','n',',',' ',
-        'a','t','t','a','c','h',' ','y','o','u','r',' ','d','e','b','u','g','g','e','r',' ',
-        't','o',' ','p','r','o','c','e','s','s',' ','%','i',' ','(','0','x','%','X',')',' ',
-        'a','n','d',' ','p','r','e','s','s',' ','O','K',0
-    };
-
-    if( !GetEnvironmentVariableW( MsiBreak, val, MAX_PATH ))
+    if (!GetEnvironmentVariableA("MsiBreak", val, MAX_PATH))
         return;
 
-    if( strcmpiW( val, target ))
+    if (strcasecmp(val, target))
         return;
 
-    msg = msi_alloc( (lstrlenW(format) + 10) * sizeof(WCHAR) );
-    if (!msg)
-        return;
-
-    wsprintfW( msg, format, GetCurrentProcessId(), GetCurrentProcessId());
-    MessageBoxW( NULL, msg, WindowsInstaller, MB_OK);
-    msi_free(msg);
+    sprintf(msg, format, GetCurrentProcessId(), GetCurrentProcessId());
+    MessageBoxA(NULL, msg, "Windows Installer", MB_OK);
     DebugBreak();
 }
 
@@ -530,14 +515,14 @@ static DWORD ACTION_CallDllFunction( const GUID *guid )
     MSIHANDLE remote_package = 0;
     MSIHANDLE hPackage;
     HANDLE hModule;
+    LPWSTR dll;
     LPSTR proc;
-    UINT r = ERROR_FUNCTION_FAILED;
-    BSTR dll = NULL, function = NULL;
     INT type;
+    UINT r;
 
     TRACE("%s\n", debugstr_guid( guid ));
 
-    r = remote_GetActionInfo( guid, &type, &dll, &function, &remote_package );
+    r = remote_GetActionInfo(guid, &type, &dll, &proc, &remote_package);
     if (r != ERROR_SUCCESS)
         return r;
 
@@ -548,16 +533,14 @@ static DWORD ACTION_CallDllFunction( const GUID *guid )
         return ERROR_SUCCESS;
     }
 
-    proc = strdupWtoA( function );
     fn = (MsiCustomActionEntryPoint) GetProcAddress( hModule, proc );
-    msi_free( proc );
     if (fn)
     {
         hPackage = alloc_msi_remote_handle( remote_package );
         if (hPackage)
         {
-            TRACE("calling %s\n", debugstr_w( function ) );
-            handle_msi_break( function );
+            TRACE("calling %s\n", debugstr_a(proc));
+            handle_msi_break(proc);
 
             __TRY
             {
@@ -566,7 +549,7 @@ static DWORD ACTION_CallDllFunction( const GUID *guid )
             __EXCEPT_PAGE_FAULT
             {
                 ERR("Custom action (%s:%s) caused a page fault: %08x\n",
-                    debugstr_w(dll), debugstr_w(function), GetExceptionCode());
+                    debugstr_w(dll), debugstr_a(proc), GetExceptionCode());
                 r = ERROR_SUCCESS;
             }
             __ENDTRY;
@@ -577,13 +560,13 @@ static DWORD ACTION_CallDllFunction( const GUID *guid )
             ERR("failed to create handle for %x\n", remote_package );
     }
     else
-        ERR("GetProcAddress(%s) failed\n", debugstr_w( function ) );
+        ERR("GetProcAddress(%s) failed\n", debugstr_a(proc));
 
     FreeLibrary(hModule);
 
     MsiCloseHandle(hPackage);
-    SysFreeString( dll );
-    SysFreeString( function );
+    midl_user_free(dll);
+    midl_user_free(proc);
 
     return r;
 }
@@ -1360,22 +1343,19 @@ void ACTION_FinishCustomActions(const MSIPACKAGE* package)
     LeaveCriticalSection( &msi_custom_action_cs );
 }
 
-HRESULT __cdecl remote_GetActionInfo( const GUID *custom_action_guid,
-         INT *type, BSTR *dll, BSTR *func, MSIHANDLE *remote_package )
+UINT __cdecl remote_GetActionInfo(const GUID *guid, int *type, LPWSTR *dll, LPSTR *func, MSIHANDLE *hinst)
 {
     msi_custom_action_info *info;
-    MSIHANDLE handle;
 
-    info = find_action_by_guid( custom_action_guid );
+    info = find_action_by_guid(guid);
     if (!info)
-        return E_FAIL;
+        return ERROR_INVALID_DATA;
 
     *type = info->type;
-    handle = alloc_msihandle( &info->package->hdr );
-    *dll = SysAllocString( info->source );
-    *func = SysAllocString( info->target );
+    *hinst = alloc_msihandle(&info->package->hdr);
+    *dll = strdupW(info->source);
+    *func = strdupWtoA(info->target);
 
-    release_custom_action_data( info );
-    *remote_package = handle;
-    return S_OK;
+    release_custom_action_data(info);
+    return ERROR_SUCCESS;
 }
diff --git a/dlls/msi/winemsi.idl b/dlls/msi/winemsi.idl
index 3884500..8af1759 100644
--- a/dlls/msi/winemsi.idl
+++ b/dlls/msi/winemsi.idl
@@ -94,7 +94,7 @@ interface IWineMsiRemote
     UINT remote_EnumComponentCosts( [in] MSIHANDLE hinst, [in, string, unique] LPCWSTR component, [in] DWORD index, [in] INSTALLSTATE state,
                                     [out, string, size_is(3)] LPWSTR drive, [out] INT *cost, [out] INT *temp );
 
-    HRESULT remote_GetActionInfo( [in] LPCGUID guid, [out] INT *type, [out] BSTR *dllname,
-                                  [out] BSTR *function, [out] MSIHANDLE *package );
+    UINT remote_GetActionInfo( [in] const GUID *guid, [out] int *type, [out, string] LPWSTR *dllname,
+                               [out, string] LPSTR *function, [out] MSIHANDLE *hinst );
     UINT remote_CloseHandle( [in] MSIHANDLE handle );
 }




More information about the wine-cvs mailing list