Currently the MSI Installer is working backwards, In the file files.c it reads the files from the msi package and iterates through them and queries the Media table in order by LastSequence. The sort order for the media table should be DiskId according to MSDN. Just changing the sort order wont work unless the msi installer is revamped to work the right way. The code is written wrong for this. Currently its using LIST_FOR_EACH_ENTRY in the Install Files function for the files and then trying to ready the media per file using the sequence number of the file in the query on the media table using the file sequence as last sequence and returning the results order by LastSequence.

It should first be reading the Media table first and sorting by DiskId. The installer then iterates through each row returned by the query from the media table and then for each file in the file table that falls within that disk id it should ready the media. Currently wine is doing it backwards which ends up trying to ready the wrong media if the last sequence.

It needs to read the media table, then starting with DiskId 1, iterate through all of disk Id 1 and read from the file table order by sequence until it reaches the last sequence as indicated in the media table for the working DiskId, then it jumps to the next DiskId 2, 3, and so on. The lastsequence of the working DiskId should always be greater than that of the last sequence of the previous DiskId, if not the results should be skipped, currently it is trying to read from DiskId's that have zero as the LastSequence but 22 as the DiskId. Zero indicates the first entry in the media table(if your in DiskId 1). as you increment through the DiskId's the LastSequence should increment as well, if it doesnt you skip that install media.

This is what causes the cabinet bugs in bugs #4533 and #5139.

A quick fix , but not the solution would be to change the query so it doesn't return the results from the media table if the LastSequence is 0 and the DiskId is greater than 1.

The solution would be to rewrite the installer to do things the right way querying the Media table first, and then installing the files in order from the media table.

If someone could help me work on this it would be much appreciated as I'm kind of rusty in C, I'm a perl monger by trade and not very familiar with wine's msi innerworkings.


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/media_table.
http://msdn.microsoft.com/library/en-us/msi/setup/ordering_file_sequence_numbers_in_a_cabinet_file_table_and_media_table.asp
http://msdn.microsoft.com/library/en-us/msi/setup/file_table.asp?frame=true

As you'll see in MSDN the file and media table sequence and LastSequence correspond with one another. Each has checks upon the other to determine the proper install order.




Reply via email to