Module: wine Branch: master Commit: f2ae31000b6d6c105838fad36c17ba1fb1f5524b URL: http://source.winehq.org/git/wine.git/?a=commit;h=f2ae31000b6d6c105838fad36c...
Author: James Hawkins truiken@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;