msi: Create the local copy before opening the database.
This commit is contained in:
parent
33d9f37f4a
commit
8dd3d389b0
|
@ -3802,63 +3802,6 @@ static UINT ACTION_UnpublishFeatures(MSIPACKAGE *package)
|
|||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static UINT msi_get_local_package_name( LPWSTR path )
|
||||
{
|
||||
static const WCHAR szInstaller[] = {
|
||||
'\\','I','n','s','t','a','l','l','e','r','\\',0};
|
||||
static const WCHAR fmt[] = { '%','x','.','m','s','i',0};
|
||||
DWORD time, len, i;
|
||||
HANDLE handle;
|
||||
|
||||
time = GetTickCount();
|
||||
GetWindowsDirectoryW( path, MAX_PATH );
|
||||
lstrcatW( path, szInstaller );
|
||||
CreateDirectoryW( path, NULL );
|
||||
|
||||
len = lstrlenW(path);
|
||||
for (i=0; i<0x10000; i++)
|
||||
{
|
||||
snprintfW( &path[len], MAX_PATH - len, fmt, (time+i)&0xffff );
|
||||
handle = CreateFileW( path, GENERIC_WRITE, 0, NULL,
|
||||
CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0 );
|
||||
if (handle != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
CloseHandle(handle);
|
||||
break;
|
||||
}
|
||||
if (GetLastError() != ERROR_FILE_EXISTS &&
|
||||
GetLastError() != ERROR_SHARING_VIOLATION)
|
||||
return ERROR_FUNCTION_FAILED;
|
||||
}
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static UINT msi_make_package_local( MSIPACKAGE *package, HKEY hkey )
|
||||
{
|
||||
WCHAR packagefile[MAX_PATH];
|
||||
UINT r;
|
||||
|
||||
r = msi_get_local_package_name( packagefile );
|
||||
if (r != ERROR_SUCCESS)
|
||||
return r;
|
||||
|
||||
TRACE("Copying to local package %s\n",debugstr_w(packagefile));
|
||||
|
||||
r = CopyFileW( package->db->path, packagefile, FALSE);
|
||||
|
||||
if (!r)
|
||||
{
|
||||
ERR("Unable to copy package (%s -> %s) (error %d)\n",
|
||||
debugstr_w(package->db->path), debugstr_w(packagefile), GetLastError());
|
||||
return ERROR_FUNCTION_FAILED;
|
||||
}
|
||||
|
||||
msi_reg_set_val_str( hkey, INSTALLPROPERTY_LOCALPACKAGEW, packagefile );
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
|
||||
{
|
||||
LPWSTR prop, val, key;
|
||||
|
@ -3990,7 +3933,9 @@ static UINT ACTION_RegisterProduct(MSIPACKAGE *package)
|
|||
if (rc != ERROR_SUCCESS)
|
||||
goto done;
|
||||
|
||||
msi_make_package_local(package, props);
|
||||
msi_reg_set_val_str( props, INSTALLPROPERTY_LOCALPACKAGEW, package->db->localfile );
|
||||
msi_free( package->db->localfile );
|
||||
package->db->localfile = NULL;
|
||||
|
||||
rc = msi_publish_install_properties(package, hkey);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
|
|
|
@ -65,6 +65,11 @@ static VOID MSI_CloseDatabase( MSIOBJECTHDR *arg )
|
|||
DeleteFileW( db->deletefile );
|
||||
msi_free( db->deletefile );
|
||||
}
|
||||
if (db->localfile)
|
||||
{
|
||||
DeleteFileW( db->localfile );
|
||||
msi_free( db->localfile );
|
||||
}
|
||||
}
|
||||
|
||||
UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
|
||||
|
|
|
@ -76,6 +76,7 @@ typedef struct tagMSIDATABASE
|
|||
UINT bytes_per_strref;
|
||||
LPWSTR path;
|
||||
LPWSTR deletefile;
|
||||
LPWSTR localfile;
|
||||
LPCWSTR mode;
|
||||
struct list tables;
|
||||
struct list transforms;
|
||||
|
|
|
@ -870,6 +870,38 @@ LPCWSTR msi_download_file( LPCWSTR szUrl, LPWSTR filename )
|
|||
return filename;
|
||||
}
|
||||
|
||||
static UINT msi_get_local_package_name( LPWSTR path )
|
||||
{
|
||||
static const WCHAR szInstaller[] = {
|
||||
'\\','I','n','s','t','a','l','l','e','r','\\',0};
|
||||
static const WCHAR fmt[] = { '%','x','.','m','s','i',0};
|
||||
DWORD time, len, i;
|
||||
HANDLE handle;
|
||||
|
||||
time = GetTickCount();
|
||||
GetWindowsDirectoryW( path, MAX_PATH );
|
||||
strcatW( path, szInstaller );
|
||||
CreateDirectoryW( path, NULL );
|
||||
|
||||
len = strlenW(path);
|
||||
for (i = 0; i < 0x10000; i++)
|
||||
{
|
||||
snprintfW( &path[len], MAX_PATH - len, fmt, (time + i)&0xffff );
|
||||
handle = CreateFileW( path, GENERIC_WRITE, 0, NULL,
|
||||
CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0 );
|
||||
if (handle != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
CloseHandle(handle);
|
||||
break;
|
||||
}
|
||||
if (GetLastError() != ERROR_FILE_EXISTS &&
|
||||
GetLastError() != ERROR_SHARING_VIOLATION)
|
||||
return ERROR_FUNCTION_FAILED;
|
||||
}
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
|
||||
{
|
||||
static const WCHAR OriginalDatabase[] =
|
||||
|
@ -880,7 +912,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
|
|||
MSIHANDLE handle;
|
||||
LPWSTR ptr, base_url = NULL;
|
||||
UINT r;
|
||||
WCHAR temppath[MAX_PATH];
|
||||
WCHAR temppath[MAX_PATH], localfile[MAX_PATH];
|
||||
LPCWSTR file = szPackage;
|
||||
|
||||
TRACE("%s %p\n", debugstr_w(szPackage), pPackage);
|
||||
|
@ -921,6 +953,19 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
|
|||
else
|
||||
file = copy_package_to_temp( szPackage, temppath );
|
||||
|
||||
r = msi_get_local_package_name( localfile );
|
||||
if (r != ERROR_SUCCESS)
|
||||
return r;
|
||||
|
||||
TRACE("Copying to local package %s\n", debugstr_w(localfile));
|
||||
|
||||
if (!CopyFileW( file, localfile, FALSE ))
|
||||
{
|
||||
ERR("Unable to copy package (%s -> %s) (error %u)\n",
|
||||
debugstr_w(file), debugstr_w(localfile), GetLastError());
|
||||
return GetLastError();
|
||||
}
|
||||
|
||||
r = MSI_OpenDatabaseW( file, MSIDBOPEN_READONLY, &db );
|
||||
if( r != ERROR_SUCCESS )
|
||||
{
|
||||
|
@ -932,6 +977,8 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
|
|||
|
||||
return r;
|
||||
}
|
||||
|
||||
db->localfile = strdupW( localfile );
|
||||
}
|
||||
|
||||
package = MSI_CreatePackage( db, base_url );
|
||||
|
|
Loading…
Reference in New Issue