msi 3: Only call a custom action remotely if the type is
msidbCustomActionTypeInScript
James Hawkins
truiken at gmail.com
Tue Jul 17 01:07:43 CDT 2007
On 7/16/07, James Hawkins <truiken at gmail.com> wrote:
> Hi,
>
> Fixes a problem with an installer that checks the returned length
> exactly, and fails because we double it (for the bug, which is
> correct), but this happens because we run all custom actions remotely,
> whether they're supposed to be remote or not.
>
> Changelog:
> * Only call a custom action remotely if the type is
> msidbCustomActionTypeInScript.
>
patch 2 hasn't gone through moderation yet because of size, but this
patch still applies without it.
--
James Hawkins
-------------- next part --------------
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
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_CallDllFuncti
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;
--
1.4.1
More information about the wine-patches
mailing list