http://bugs.winehq.org/show_bug.cgi?id=16956
--- Comment #15 from Anastasius Focht focht@gmx.net 2009-08-11 15:57:00 --- Hello,
something goes wrong when applying the transforms from all patches ...
List of patches looks ok but the InstallFile action fails:
--- snip --- ... 0037:trace:msi:MsiGetFileVersionW L"C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.1433_x-ww_5cf844d2\msvcr80.dll" (nil) 0 (nil) 0 0037:trace:msi:MSI_DatabaseOpenViewW L"SELECT * FROM `Media` WHERE `LastSequence` >= 1002 AND `DiskId` >= 0 ORDER BY `DiskId`" 0x33ce1c ... 0037:trace:msi:writeout_cabinet_stream wrote 2890387 bytes to L"C:\windows\temp\PCWae2f.tmp" 0037:trace:msi:msi_cabextract Extracting L"C:\windows\temp\PCWae2f.tmp" 0037:trace:msi:cabinet_notify (0) 0037:trace:msi:cabinet_notify (2) ... 0037:trace:msi:cabinet_copy_file extracting L"C:\windows\Microsoft.NET\Framework\v2.0.50727\ASP.NETWebAdminFiles\Images\yellowCORNER.gif" 0037:trace:msi:cabinet_notify (3) 0037:err:msi:ACTION_InstallFiles compressed file wasn't extracted (L"C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.1433_x-ww_5cf844d2\msvcr80.dll") 0037:err:msi:ITERATE_Actions Execution halted, action L"InstallExecute" returned 1603 --- snip ---
When installing that SxS assembly, the internal cabinet stream from "ASPNET.msp" is used. The SxS assembly it fails to extract lives in another cabinet stream - contained in "CLR.msp" (second patch package).
Looking at msi processing of first two msp's to show the problem...
(1) ASPNET.msp
"ASPNET.msp" is the first patch package to be applied and the transform inserts row with diskid = 101 key into Media table.
--- snip --- 003d:trace:msi:msi_apply_patch_package 0x16e3e0 L"c:\1f1fe15d723ca23ce97251a94afedddc\wcu\dotnetframework\dotnetfx20\ASPNET.msp" 003d:trace:msi:MSI_OpenDatabaseW L"c:\1f1fe15d723ca23ce97251a94afedddc\wcu\dotnetframework\dotnetfx20\ASPNET.msp" (null) 003d:trace:msidb:enum_stream_names stream 0 -> L"\4840\3b3f\43f2\4438\45b1" L"\4840_Columns" 003d:trace:msidb:enum_stream_names stream 1 -> L"\4840\3f7f\4164\422f\4836" L"\4840_Tables" 003d:trace:msidb:enum_stream_names stream 2 -> L"T1ToU1" L"T1ToU1" 003d:trace:msidb:enum_stream_names stream 3 -> L"#T1ToU1" L"#T1ToU1" 003d:trace:msidb:enum_stream_names stream 4 -> L"\3b19\47e0\3a8c\47cb\4217\3bf7\4821" L"PCW_CAB_NetFX" ... 003d:trace:msidb:msi_table_apply_transform transform contains stream L"\4840Media" ... 003d:trace:msidb:read_table_from_storage L"Media" 003d:trace:msidb:read_stream_data L"Media" -> L"\4840\4216\4327\4824" 003d:trace:msidb:read_table_from_storage Read 14 bytes 003d:trace:msidb:read_table_from_storage Transposing data from 1 rows 003d:trace:msidb:TABLE_CreateView table 0x177348 found with 6 columns 003d:trace:msidb:TABLE_CreateView L"Media" one row is 14 bytes ... 003d:trace:msidb:msi_table_load_transform 0x1845a8 0x207fb0 0x1583dd0 L"Media" 003d:trace:msidb:read_stream_data L"Media" -> L"\4840\4216\4327\4824" 003d:trace:msidb:TABLE_CreateView 0x1845a8 L"Media" 0x33d11c 003d:trace:msidb:TABLE_CreateView table 0x177348 found with 6 columns 003d:trace:msidb:TABLE_CreateView L"Media" one row is 14 bytes 003d:trace:msidb:TABLE_execute 0x16e968 (nil) 003d:trace:msidb:TABLE_execute There are 6 columns 003d:trace:msidb:msi_table_load_transform name = L"Media" columns = 6 row_size = 14 raw size = 16 003d:trace:msidb:MSI_CreateRecord 6 003d:trace:msidb:msi_get_transform_record row -> 003d:trace:msidb:MSI_RecordSetInteger 0x1580238 1 101 003d:trace:msidb:msi_get_transform_record field 1 [0x8065] 003d:trace:msidb:MSI_RecordSetInteger 0x1580238 2 1211 003d:trace:msidb:msi_get_transform_record field 2 [0x800004bb] 003d:trace:msidb:MSI_RecordSetStringW 0x1580238 3 L"" 003d:trace:msidb:msi_get_transform_record field 3 [L""] 003d:trace:msidb:MSI_RecordSetStringW 0x1580238 4 L"#PCW_CAB_NetFX" 003d:trace:msidb:msi_get_transform_record field 4 [L"#PCW_CAB_NetFX"] 003d:trace:msidb:MSI_RecordSetStringW 0x1580238 5 L"" 003d:trace:msidb:msi_get_transform_record field 5 [L""] 003d:trace:msidb:MSI_RecordSetStringW 0x1580238 6 L"PatchMediaSrc" 003d:trace:msidb:msi_get_transform_record field 6 [L"PatchMediaSrc"] 003d:trace:msidb:msi_table_load_transform inserting record 003d:trace:msidb:TABLE_insert_row 0x16e968 0x1580238 FALSE 003d:trace:msidb:MSI_RecordGetInteger 0x1580238 1 003d:trace:msidb:MSI_RecordGetInteger 0x1580238 2 003d:trace:msidb:MSI_RecordGetInteger 0x1580238 1 003d:trace:msidb:table_create_new_row 0x16e968 FALSE 003d:trace:msidb:TABLE_insert_row insert_row returned 00000000 --- snip ---
(2) CLR.msp
--- snip --- 003d:trace:msi:msi_apply_patch_package 0x16e3e0 L"c:\1f1fe15d723ca23ce97251a94afedddc\wcu\dotnetframework\dotnetfx20\CLR.msp" 003d:trace:msi:MSI_OpenDatabaseW L"c:\1f1fe15d723ca23ce97251a94afedddc\wcu\dotnetframework\dotnetfx20\CLR.msp" (null) 003d:trace:msidb:enum_stream_names stream 0 -> L"\4840\3b3f\43f2\4438\45b1" L"\4840_Columns" 003d:trace:msidb:enum_stream_names stream 1 -> L"\4840\3f7f\4164\422f\4836" L"\4840_Tables" 003d:trace:msidb:enum_stream_names stream 2 -> L"T1ToU1" L"T1ToU1" 003d:trace:msidb:enum_stream_names stream 3 -> L"#T1ToU1" L"#T1ToU1" 003d:trace:msidb:enum_stream_names stream 4 -> L"\3b19\47e0\3a8c\47cb\4217\3bf7\4821" L"PCW_CAB_NetFX" ... 003d:trace:msidb:msi_table_apply_transform transform contains stream L"\4840Media" 003d:trace:msidb:TABLE_CreateView 0x1845a8 L"Media" 0x33d25c 003d:trace:msidb:TABLE_CreateView table 0x177348 found with 6 columns 003d:trace:msidb:TABLE_CreateView L"Media" one row is 14 bytes 003d:trace:msidb:TABLE_execute 0x1580ea0 (nil) 003d:trace:msidb:TABLE_execute There are 6 columns 003d:trace:msidb:TABLE_delete 0x1580ea0 ... 003d:trace:msidb:msi_table_load_transform 0x1845a8 0x15800e8 0x159d270 L"Media" 003d:trace:msidb:read_stream_data L"Media" -> L"\4840\4216\4327\4824" 003d:trace:msidb:TABLE_CreateView 0x1845a8 L"Media" 0x33d11c 003d:trace:msidb:TABLE_CreateView table 0x177348 found with 6 columns 003d:trace:msidb:TABLE_CreateView L"Media" one row is 14 bytes 003d:trace:msidb:TABLE_execute 0x1580fd0 (nil) 003d:trace:msidb:TABLE_execute There are 6 columns 003d:trace:msidb:msi_table_load_transform name = L"Media" columns = 6 row_size = 14 raw size = 16 003d:trace:msidb:MSI_CreateRecord 6 003d:trace:msidb:msi_get_transform_record row -> 003d:trace:msidb:MSI_RecordSetInteger 0x1581018 1 101 003d:trace:msidb:msi_get_transform_record field 1 [0x8065] 003d:trace:msidb:MSI_RecordSetInteger 0x1581018 2 1036 003d:trace:msidb:msi_get_transform_record field 2 [0x8000040c] 003d:trace:msidb:MSI_RecordSetStringW 0x1581018 3 L"" 003d:trace:msidb:msi_get_transform_record field 3 [L""] 003d:trace:msidb:MSI_RecordSetStringW 0x1581018 4 L"#PCW_CAB_NetFX" 003d:trace:msidb:msi_get_transform_record field 4 [L"#PCW_CAB_NetFX"] 003d:trace:msidb:MSI_RecordSetStringW 0x1581018 5 L"" 003d:trace:msidb:msi_get_transform_record field 5 [L""] 003d:trace:msidb:MSI_RecordSetStringW 0x1581018 6 L"PatchMediaSrc" 003d:trace:msidb:msi_get_transform_record field 6 [L"PatchMediaSrc"] 003d:trace:msidb:msi_table_load_transform inserting record 003d:trace:msidb:TABLE_insert_row 0x1580fd0 0x1581018 FALSE 003d:trace:msidb:MSI_RecordGetInteger 0x1581018 1 003d:trace:msidb:MSI_RecordGetInteger 0x1581018 2 003d:trace:msidb:MSI_RecordGetInteger 0x1581018 1 003d:err:msidb:msi_table_load_transform insert row failed ... --- snip ---
Subsequent row insertions into Media table fail after applying first .msp transform(s).
I manually dumped the transforms from all .msp and verified with Orca - most of them use indeed the same disk id = 101 -> (dupe) key.
That means later msi package install operates on broken database with only the transform from first msp applied to the Media/PatchPackage tables (referencing ASPNET internal cabinet stream) - hence the failure.
The question arises how to apply transforms to Media table with same disk id keys coming from previous transforms (also affects PatchPackage table). A solution might be to rebase them to have the transforms from all patches succeeding in inserting rows into Media table to preserve patch source. Though such rebasing requires knowledge of patch order.
Experimenting with Orca 3.x has shown it overwrites the row with duplicate key in Media table when applying multiple patches/transforms to msi db which can't be the correct way because the previous patch source gets lost.
MSDN and even Stebner's blog (Microsoft MSI Guru) are not really helpful on this specific problem (or I missed it).
Regards