diff --git a/dlls/msi/files.c b/dlls/msi/files.c index d2bef7c..ae7f3f0 100644 --- a/dlls/msi/files.c +++ b/dlls/msi/files.c @@ -577,7 +577,7 @@ UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi) } /* FIXME: search NETWORK and URL sources as well */ -static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi) +UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi) { WCHAR source[MAX_PATH]; WCHAR volume[MAX_PATH]; @@ -586,6 +586,7 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi) DWORD index, size, id; UINT r; + size = MAX_PATH; r = MsiSourceListGetInfoW(package->ProductCode, NULL, package->Context, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEW, source, &size); diff --git a/dlls/msi/helpers.c b/dlls/msi/helpers.c index 3ff47ed..cffc09a 100644 --- a/dlls/msi/helpers.c +++ b/dlls/msi/helpers.c @@ -1163,6 +1163,16 @@ UINT msi_extract_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR destdir) if (r != ERROR_SUCCESS) goto done; + if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES) + { + r = find_published_source(package, mi); + if (r != ERROR_SUCCESS) + { + ERR("Cabinet not found: %s\n", debugstr_w(mi->source)); + return ERROR_INSTALL_FAILURE; + } + } + data.package = package; data.mi = mi; data.file = file; diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 90eaa19..19d0b0d 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -908,6 +908,7 @@ extern UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO extern void msi_free_media_info(MSIMEDIAINFO *mi); extern BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, PFNFDINOTIFY notify, LPVOID data); extern UINT msi_extract_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR destdir); +extern UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi); /* control event stuff */ extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event, -- 1.5.4.3