From ef86011ba40ef90eefb5e54059d907753ec8d694 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 9 Nov 2018 14:50:34 +0100 Subject: [PATCH] msi: Support substorage transforms in MsiDatabaseApplyTransform. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=40206 Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/msi/msiquery.c | 68 +++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/dlls/msi/msiquery.c b/dlls/msi/msiquery.c index 701a347a8c3..db5660a6473 100644 --- a/dlls/msi/msiquery.c +++ b/dlls/msi/msiquery.c @@ -824,50 +824,55 @@ MSIHANDLE WINAPI MsiGetLastErrorRecord( void ) return 0; } -UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db, - LPCWSTR szTransformFile, int iErrorCond ) +UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db, const WCHAR *transform, int error_cond ) { - HRESULT r; + HRESULT hr; UINT ret = ERROR_FUNCTION_FAILED; - IStorage *stg = NULL; + IStorage *stg; STATSTG stat; - TRACE("%p %s %d\n", db, debugstr_w(szTransformFile), iErrorCond); + TRACE( "%p %s %08x\n", db, debugstr_w(transform), error_cond ); - r = StgOpenStorage( szTransformFile, NULL, - STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE, NULL, 0, &stg); - if ( FAILED(r) ) + if (*transform == ':') { - WARN("failed to open transform 0x%08x\n", r); - return ret; + hr = IStorage_OpenStorage( db->storage, transform + 1, NULL, STGM_SHARE_EXCLUSIVE, NULL, 0, &stg ); + if (FAILED( hr )) + { + WARN( "failed to open substorage transform 0x%08x\n", hr ); + return ERROR_FUNCTION_FAILED; + } + } + else + { + hr = StgOpenStorage( transform, NULL, STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE, NULL, 0, &stg ); + if (FAILED( hr )) + { + WARN( "failed to open file transform 0x%08x\n", hr ); + return ERROR_FUNCTION_FAILED; + } } - r = IStorage_Stat( stg, &stat, STATFLAG_NONAME ); - if ( FAILED( r ) ) - goto end; - - if ( !IsEqualGUID( &stat.clsid, &CLSID_MsiTransform ) ) - goto end; - - if( TRACE_ON( msi ) ) - enum_stream_names( stg ); + hr = IStorage_Stat( stg, &stat, STATFLAG_NONAME ); + if (FAILED( hr )) goto end; + if (!IsEqualGUID( &stat.clsid, &CLSID_MsiTransform )) goto end; + if (TRACE_ON( msi )) enum_stream_names( stg ); ret = msi_table_apply_transform( db, stg ); end: IStorage_Release( stg ); - return ret; } -UINT WINAPI MsiDatabaseApplyTransformW( MSIHANDLE hdb, - LPCWSTR szTransformFile, int iErrorCond) +UINT WINAPI MsiDatabaseApplyTransformW( MSIHANDLE hdb, const WCHAR *transform, int error_cond ) { MSIDATABASE *db; UINT r; + if (error_cond) FIXME( "ignoring error conditions\n" ); + db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE ); - if( !db ) + if (!db) { MSIHANDLE remote; @@ -879,27 +884,24 @@ UINT WINAPI MsiDatabaseApplyTransformW( MSIHANDLE hdb, return ERROR_SUCCESS; } - r = MSI_DatabaseApplyTransformW( db, szTransformFile, iErrorCond ); + r = MSI_DatabaseApplyTransformW( db, transform, error_cond ); msiobj_release( &db->hdr ); return r; } -UINT WINAPI MsiDatabaseApplyTransformA( MSIHANDLE hdb, - LPCSTR szTransformFile, int iErrorCond) +UINT WINAPI MsiDatabaseApplyTransformA( MSIHANDLE hdb, const char *transform, int error_cond ) { - LPWSTR wstr; + WCHAR *wstr; UINT ret; - TRACE("%d %s %d\n", hdb, debugstr_a(szTransformFile), iErrorCond); + TRACE( "%d %s %08x\n", hdb, debugstr_a(transform), error_cond ); - wstr = strdupAtoW( szTransformFile ); - if( szTransformFile && !wstr ) + wstr = strdupAtoW( transform ); + if (transform && !wstr) return ERROR_NOT_ENOUGH_MEMORY; - ret = MsiDatabaseApplyTransformW( hdb, wstr, iErrorCond); - + ret = MsiDatabaseApplyTransformW( hdb, wstr, error_cond ); msi_free( wstr ); - return ret; }