diff --git a/dlls/msi/media.c b/dlls/msi/media.c index 1357a648121..bbfdd6f4acf 100644 --- a/dlls/msi/media.c +++ b/dlls/msi/media.c @@ -109,7 +109,7 @@ static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi) { MSIHANDLE rec = MsiCreateRecord(1); MsiRecordSetStringW(rec, 0, error); - gUIHandlerRecord(gUIContext, MB_RETRYCANCEL | INSTALLMESSAGE_ERROR, rec); + gUIHandlerRecord(gUIContextRecord, MB_RETRYCANCEL | INSTALLMESSAGE_ERROR, rec); MsiCloseHandle(rec); } } diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index 8a11e8380bc..ce8a7be9d20 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -4222,8 +4222,8 @@ UINT WINAPI MsiSetExternalUIRecord( INSTALLUI_HANDLER_RECORD handler, *prev = gUIHandlerRecord; gUIHandlerRecord = handler; - gUIFilter = filter; - gUIContext = context; + gUIFilterRecord = filter; + gUIContextRecord = context; return ERROR_SUCCESS; } diff --git a/dlls/msi/msi_main.c b/dlls/msi/msi_main.c index 09558567e84..11cbf41d796 100644 --- a/dlls/msi/msi_main.c +++ b/dlls/msi/msi_main.c @@ -44,7 +44,9 @@ INSTALLUI_HANDLERA gUIHandlerA = NULL; INSTALLUI_HANDLERW gUIHandlerW = NULL; INSTALLUI_HANDLER_RECORD gUIHandlerRecord = NULL; DWORD gUIFilter = 0; +DWORD gUIFilterRecord = 0; LPVOID gUIContext = NULL; +LPVOID gUIContextRecord = NULL; WCHAR *gszLogFile = NULL; HINSTANCE msi_hInstance; diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 2e9e91e754e..cc42316eadd 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -972,7 +972,9 @@ extern INSTALLUI_HANDLERA gUIHandlerA DECLSPEC_HIDDEN; extern INSTALLUI_HANDLERW gUIHandlerW DECLSPEC_HIDDEN; extern INSTALLUI_HANDLER_RECORD gUIHandlerRecord DECLSPEC_HIDDEN; extern DWORD gUIFilter DECLSPEC_HIDDEN; +extern DWORD gUIFilterRecord DECLSPEC_HIDDEN; extern LPVOID gUIContext DECLSPEC_HIDDEN; +extern LPVOID gUIContextRecord DECLSPEC_HIDDEN; extern WCHAR *gszLogFile DECLSPEC_HIDDEN; extern HINSTANCE msi_hInstance DECLSPEC_HIDDEN; diff --git a/dlls/msi/package.c b/dlls/msi/package.c index 8f86352d91d..eae01e0a5bb 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -1811,27 +1811,30 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, MSIREC p[0] = 0; } - TRACE("%p %p %p %x %x %s\n", gUIHandlerA, gUIHandlerW, gUIHandlerRecord, - gUIFilter, log_type, debugstr_w(message)); - /* convert it to ASCII */ len = WideCharToMultiByte( CP_ACP, 0, message, -1, NULL, 0, NULL, NULL ); msg = msi_alloc( len ); WideCharToMultiByte( CP_ACP, 0, message, -1, msg, len, NULL, NULL ); - if (gUIHandlerRecord && (gUIFilter & log_type)) + if (gUIHandlerRecord && (gUIFilterRecord & log_type)) { MSIHANDLE rec = MsiCreateRecord( 1 ); MsiRecordSetStringW( rec, 0, message ); - rc = gUIHandlerRecord( gUIContext, eMessageType, rec ); + TRACE("Calling UI handler %p(pvContext=%p, iMessageType=%08x, hRecord=%u)\n", + gUIHandlerRecord, gUIContextRecord, eMessageType, rec); + rc = gUIHandlerRecord( gUIContextRecord, eMessageType, rec ); MsiCloseHandle( rec ); } if (!rc && gUIHandlerW && (gUIFilter & log_type)) { + TRACE("Calling UI handler %p(pvContext=%p, iMessageType=%08x, szMessage=%s)\n", + gUIHandlerW, gUIContext, eMessageType, debugstr_w(message)); rc = gUIHandlerW( gUIContext, eMessageType, message ); } else if (!rc && gUIHandlerA && (gUIFilter & log_type)) { + TRACE("Calling UI handler %p(pvContext=%p, iMessageType=%08x, szMessage=%s)\n", + gUIHandlerA, gUIContext, eMessageType, debugstr_a(msg)); rc = gUIHandlerA( gUIContext, eMessageType, msg ); } diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c index e18f0f0abe6..a7cec7f5737 100644 --- a/dlls/msi/tests/package.c +++ b/dlls/msi/tests/package.c @@ -9159,11 +9159,19 @@ static void test_externalui(void) retval = 1; externalui_ran = externalui_record_ran = 0; r = MsiProcessMessage(hpkg, INSTALLMESSAGE_USER, hrecord); - todo_wine ok(r == 1, "expected 1, got %u\n", r); - todo_wine ok(externalui_ran == 0, "external UI callback should not have run\n"); ok(externalui_record_ran == 1, "external UI record callback did not run\n"); + + /* filter and context should be kept separately */ + r = pMsiSetExternalUIRecord(externalui_record_callback, INSTALLLOGMODE_ERROR, &retval, &prev_record); + ok(r == ERROR_SUCCESS, "MsiSetExternalUIRecord failed %u\n", r); + + externalui_ran = externalui_record_ran = 0; + r = MsiProcessMessage(hpkg, INSTALLMESSAGE_USER, hrecord); + ok(r == 0, "expected 0, got %u\n", r); + ok(externalui_ran == 1, "external UI callback did not run\n"); + ok(externalui_record_ran == 0, "external UI record callback should not have run\n"); } else win_skip("MsiSetExternalUIRecord is not available\n");