James Hawkins : msi: Only call a custom action remotely if the type is msidbCustomActionTypeInScript .

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 17 07:36:49 CDT 2007


Module: wine
Branch: master
Commit: f2ae31000b6d6c105838fad36c17ba1fb1f5524b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f2ae31000b6d6c105838fad36c17ba1fb1f5524b

Author: James Hawkins <truiken at gmail.com>
Date:   Mon Jul 16 19:21:45 2007 -0700

msi: Only call a custom action remotely if the type is msidbCustomActionTypeInScript.

---

 dlls/msi/custom.c |   78 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 77 insertions(+), 1 deletions(-)

diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index 06699d2..86d4ccb 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -647,7 +647,7 @@ static UINT get_action_info( const GUID *guid, INT *type, MSIHANDLE *handle,
     return ERROR_SUCCESS;
 }
 
-static DWORD WINAPI ACTION_CallDllFunction( const GUID *guid )
+static DWORD WINAPI ACTION_CallRemoteDllFunction( const GUID *guid )
 {
     MsiCustomActionEntryPoint fn;
     MSIHANDLE hPackage, handle;
@@ -713,6 +713,82 @@ static DWORD WINAPI ACTION_CallDllFunction( const GUID *guid )
     return r;
 }
 
+static DWORD WINAPI ACTION_CallLocalDllFunction( msi_custom_action_info *info )
+{
+    MsiCustomActionEntryPoint fn;
+    MSIHANDLE hPackage;
+    HANDLE hModule;
+    LPSTR proc;
+    UINT r = ERROR_FUNCTION_FAILED;
+
+    TRACE("%s %s\n", debugstr_w( info->source ), debugstr_w( info->target ) );
+
+    hModule = LoadLibraryW( info->source );
+    if (!hModule)
+    {
+        ERR("failed to load dll %s\n", debugstr_w( info->source ) );
+        return r;
+    }
+
+    proc = strdupWtoA( info->target );
+    fn = (MsiCustomActionEntryPoint) GetProcAddress( hModule, proc );
+    msi_free( proc );
+    if (fn)
+    {
+        hPackage = alloc_msihandle( &info->package->hdr );
+        if (hPackage)
+        {
+            TRACE("calling %s\n", debugstr_w( info->target ) );
+            handle_msi_break( info->target );
+
+            __TRY
+            {
+                r = fn( hPackage );
+            }
+            __EXCEPT_PAGE_FAULT
+            {
+                ERR("Custom action (%s:%s) caused a page fault: %08x\n",
+                    debugstr_w(info->source), debugstr_w(info->target), GetExceptionCode());
+                r = ERROR_SUCCESS;
+            }
+            __ENDTRY;
+
+            MsiCloseHandle( hPackage );
+        }
+        else
+            ERR("failed to create handle for %p\n", info->package );
+    }
+    else
+        ERR("GetProcAddress(%s) failed\n", debugstr_w( info->target ) );
+
+    FreeLibrary(hModule);
+
+    return r;
+}
+
+static DWORD WINAPI ACTION_CallDllFunction(const GUID *guid)
+{
+    msi_custom_action_info *info;
+    UINT r;
+
+    info = find_action_by_guid(guid);
+    if (!info)
+    {
+        ERR("failed to find action %s\n", debugstr_guid(guid));
+        return ERROR_FUNCTION_FAILED;
+    }
+
+    TRACE("%s %s\n", debugstr_w(info->source), debugstr_w(info->target));
+
+    if (info->type & msidbCustomActionTypeInScript)
+        r = ACTION_CallRemoteDllFunction(guid);
+    else
+        r = ACTION_CallLocalDllFunction(info);
+
+    release_custom_action_data(info);
+    return r;
+}
+
 static DWORD WINAPI DllThread( LPVOID arg )
 {
     LPGUID guid = arg;




More information about the wine-cvs mailing list