{"id":2173,"date":"2006-06-14T17:31:00","date_gmt":"2006-06-14T17:31:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/heaths\/2006\/06\/14\/cumulative-service-packs-with-minorupdatetargetrtm\/"},"modified":"2006-06-14T17:31:00","modified_gmt":"2006-06-14T17:31:00","slug":"cumulative-service-packs-with-minorupdatetargetrtm","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/setup\/cumulative-service-packs-with-minorupdatetargetrtm\/","title":{"rendered":"Cumulative Service Packs with MinorUpdateTargetRTM"},"content":{"rendered":"<p>Microsoft has had a long-standing\n<a href=\"http:\/\/support.microsoft.com\/gp\/lifecycle\">policy<\/a> of providing\ncumulative service packs &#8211; service packs that can be installed for a product whether a\nprevious service pack for that product has been installed or not. Prior to the release of\n<a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/what_s_new_in_windows_installer_version_3_1.asp\">\nWindows Installer 3.1<\/a>,\n<a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/minor_upgrades.asp\">\nminor upgrades<\/a> which typically serve as service packs had to contain a pair\nof transforms for every servicing level including the original product (RTM) and all\nprevious service packs (SPs) &#8211; perhaps even beta service packs. This not only\nincreases time to create a patch since you&#8217;ll have ever-increasing numbers of\npairs of target and upgrade <i>.msi<\/i> files, but also increases the\n<a href=\"http:\/\/blogs.msdn.com\/heaths\/archive\/2005\/09\/01\/459561.aspx\">patch size<\/a>\nbecause of all data contained in the patch transforms.<\/p>\n<p>It&#8217;s not enough to have a single transform pair target the product RTM because of\n<a href=\"http:\/\/blogs.msdn.com\/heaths\/archive\/2005\/09\/12\/464047.aspx\">how\npatch sequencing works<\/a>. Whether using obsolescence or supersedence, minor\nupgrades are still considered in the applicable view of the product, namely when\ncomparing the target\n<a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/productcode.asp\">\nProductCode<\/a> and\n<a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/productversion.asp\">\nProductVersion<\/a> properties with the actual ProductCode and ProductVersion\nproperties currently installed on the machine &#8211; even when\n<a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/installing_multiple_patches.asp\">\ninstalling multiple patches<\/a> at once, which is supported starting in\n<a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/what_s_new_in_windows_installer_version_3_0.asp\">\nWindows Installer 3.0<\/a>. Consider the following abridged log from a\nmulti-patch installation scenario with SP1 and SP2, both targeting the RTM.<\/p>\n<p><font face=\"monospace\">MSI (c) (A4:84) [10:03:36:693]: SequencePatches starts. Product code: {1E37580C-4EC8-4CF1-A887-651D8AD74177}, Product version: 1.0.0, Upgrade code: {8166E0CB-2A4E-46DD-ADF0-A0DD5C0BE48D}, Product language 1033<br \/>\nMSI (c) (A4:84) [10:03:36:693]: 3.0 patch sp1.msp of type minor upgrade takes product {1E37580C-4EC8-4CF1-A887-651D8AD74177} to version 1.1.0<br \/>\nMSI (c) (A4:84) [10:03:36:693]: 3.0 patch sp2.msp of type minor upgrade takes product {1E37580C-4EC8-4CF1-A887-651D8AD74177} to version 1.2.0<br \/>\nMSI (c) (A4:84) [10:03:36:693]: PATCH SEQUENCER: verifying the applicability of minor upgrade patch sp1.msp against product code: {1E37580C-4EC8-4CF1-A887-651D8AD74177}, product version: 1.0.0, product language 1033 and upgrade code: {8166E0CB-2A4E-46DD-ADF0-A0DD5C0BE48D}<br \/>\nMSI (c) (A4:84) [10:03:36:693]: Validating transform &#8216;T1ToU1&#8217; with validation bits 0x922<br \/>\nMSI (c) (A4:84) [10:03:36:693]: Transform &#8216;T1ToU1&#8217; is valid.<br \/>\nMSI (c) (A4:84) [10:03:36:713]: PATCH SEQUENCER: minor upgrade patch sp1.msp is applicable.<br \/>\nMSI (c) (A4:84) [10:03:36:713]: PATCH SEQUENCER: verifying the applicability of minor upgrade patch sp2.msp against product code: {1E37580C-4EC8-4CF1-A887-651D8AD74177}, product version: 1.1.0, product language 1033 and upgrade code: {8166E0CB-2A4E-46DD-ADF0-A0DD5C0BE48D}<br \/>\nMSI (c) (A4:84) [10:03:36:713]: Validating transform &#8216;T1ToU1&#8217; with validation bits 0x922<br \/>\nMSI (c) (A4:84) [10:03:36:713]: Note: 1: 2749 2: T1ToU1 3: C:DOCUME~1USERLOCALS~1Temp17bad5.msp 4: 1.0.0 5: 1.1.0 <br \/>\nMSI (c) (A4:84) [10:03:36:713]: 1: 2749 2: T1ToU1 3: C:DOCUME~1USERLOCALS~1Temp17bad5.msp 4: 1.0.0 5: 1.1.0 <br \/>\nMSI (c) (A4:84) [10:03:36:713]: PATCH SEQUENCER: minor upgrade patch sp2.msp is not applicable.<br \/>\nMSI (c) (A4:84) [10:03:36:713]: SequencePatches returns success.<br \/>\nMSI (c) (A4:84) [10:03:36:713]: Final Patch Application Order:<br \/>\nMSI (c) (A4:84) [10:03:36:713]: {D34AA461-D159-48E5-908B-62F565F303E4} &#8211; sp1.msp<br \/>\nMSI (c) (A4:84) [10:03:36:713]: Other Patches:<br \/>\n<font color=\"#FF0000\">MSI (c) (A4:84) [10:03:36:713]: UnknownAbsent: {4B45E0A7-7D85-410B-9D3F-E5DF343BFF95} &#8211; sp2.msp<\/font><\/font><\/p>\n<p>Rather than fail the entire installation when installing multiple patches,\nonly applicable patches are applied. If you installed SP1 then SP2 in succession,\nWindows Installer would return <code>ERROR_PATCH_TARGET_NOT_FOUND<\/code> (1642)\nwhen attempting to install SP2. The reason is that SP1 is still applicable when\ncalculating supersedence. To remedy this situation, SP2 would require transforms\nfrom the SP1 servicing level to SP2. This can be done by either building the RTM\nup to look like the SP1, or creating what we call a &#8220;service release&#8221;, or SR,\nwhich is essentially an administrative installation with a minor upgrade\napplied.<\/p>\n<p>The advent of Windows Installer 3.1 introduced an easier way, however, that\nactually supersedes all previous patches before the final supersedence is even\ncalculated: the MinorUpdateTargetRTM property in the patch package&#8217;s\n<a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/msipatchmetadata_table.asp\">\nMsiPatchMetadata table<\/a>.<\/p>\n<p>With this property present in the MsiPatchMetadata table of SP2 in our\nexample, only a single pair of transforms are necessary to target the product RTM. This\nmeans that generating a number of transforms for every possible target is not\nnecessary, and when you consider that we elease beta SPs this number can\ngrow quite rapidly. Take a look at the difference in the abridged log\nbelow where the only change was adding the MinorUpdateTargetRTM property into the MsiPatchMetadata\ntable for SP2.<\/p>\n<p><font face=\"monospace\">MSI (s) (F0:48) [11:12:57:664]: SequencePatches starts. Product code: {1E37580C-4EC8-4CF1-A887-651D8AD74177}, Product version: 1.0.0, Upgrade code: {8166E0CB-2A4E-46DD-ADF0-A0DD5C0BE48D}, Product language 1033<br \/>\nMSI (s) (F0:48) [11:12:57:664]: 3.0 patch sp1.msp of type minor upgrade takes product {1E37580C-4EC8-4CF1-A887-651D8AD74177} to version 1.1.0<br \/>\nMSI (s) (F0:48) [11:12:57:664]: 3.0 patch sp2.msp of type minor upgrade takes product {1E37580C-4EC8-4CF1-A887-651D8AD74177} to version 1.2.0<br \/>\nMSI (s) (F0:48) [11:12:57:664]: PATCH SEQUENCER: verifying the applicability of minor upgrade patch sp1.msp against product code: {1E37580C-4EC8-4CF1-A887-651D8AD74177}, product version: 1.0.0, product language 1033 and upgrade code: {8166E0CB-2A4E-46DD-ADF0-A0DD5C0BE48D}<br \/>\nMSI (s) (F0:48) [11:12:57:664]: Validating transform &#8216;T1ToU1&#8217; with validation bits 0x922<br \/>\nMSI (s) (F0:48) [11:12:57:664]: Transform &#8216;T1ToU1&#8217; is valid.<br \/>\nMSI (s) (F0:48) [11:12:57:674]: PATCH SEQUENCER: minor upgrade patch sp1.msp is applicable.<br \/>\nMSI (s) (F0:48) [11:12:57:674]: PATCH SEQUENCER: verifying the applicability of minor upgrade patch sp2.msp against product code: {1E37580C-4EC8-4CF1-A887-651D8AD74177}, product version: 1.0.0, product language 1033 and upgrade code: {8166E0CB-2A4E-46DD-ADF0-A0DD5C0BE48D}<br \/>\nMSI (s) (F0:48) [11:12:57:684]: Validating transform &#8216;T1ToU1&#8217; with validation bits 0x922<br \/>\nMSI (s) (F0:48) [11:12:57:684]: Transform &#8216;T1ToU1&#8217; is valid.<br \/>\nMSI (s) (F0:48) [11:12:57:684]: PATCH SEQUENCER: minor upgrade patch sp2.msp is applicable.<br \/>\nMSI (s) (F0:48) [11:12:57:684]: SequencePatches returns success.<br \/>\nMSI (s) (F0:48) [11:12:57:684]: Final Patch Application Order:<br \/>\nMSI (s) (F0:48) [11:12:57:684]: {4B45E0A7-7D85-410B-9D3F-E5DF343BFF95} &#8211; sp2.msp<br \/>\nMSI (s) (F0:48) [11:12:57:684]: Other Patches:<br \/>\n<font color=\"#FF0000\">MSI (s) (F0:48) [11:12:57:684]: Superseded:\n{D34AA461-D159-48E5-908B-62F565F303E4} &#8211; sp1.msp<\/font><\/font><\/p>\n<p>You can have this property added to your patch by authoring it into the\n<a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/patchmetadata_table__patchwiz_dll_.asp\">PatchMetadata table<\/a> of your <i>.pcp<\/i> file to be processed by <i>\n<a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/patchwiz_dll.asp\">PatchWiz.dll<\/a><\/i>. Unfortunately,\n<i>PatchWiz.dll<\/i> version 3.1 doesn&#8217;t consider the MinorUpdateTargetRTM\nproperty to be a standard property; that is, a property in the resulting\nMsiPatchMetadata table that does not require a value for the Company field. This\nis fixed for <i>PatchWiz.dll<\/i> version 4.0 that ships with the\n<a href=\"http:\/\/msdn.microsoft.com\/windowsvista\/downloads\/docs\/windowssdk\/default.aspx\">\nWindows Vista Platform SDK<\/a> for beta 2 or newer, which can be used to create\npatches targeting older versions of Windows Installer.<\/p>\n<p>If you cannot use <i>PatchWiz.dll<\/i> version 4.0 or newer for whatever\nreason, you can open the <i>.msp<\/i> package and add the property yourself\nrather easily, as developed in the\n<a href=\"http:\/\/hstewart.members.winisp.net\/downloads\/AddMinorUpdateTargetRTM.zip\">\nsample script<\/a> using the\n<a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/automation_interface.asp\">\nWindows Installer automation interface<\/a>. Please note this script is only an\nexample of how to programmatically add the MinorUpdateTargetRTM property and is\nnot officially supported.<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Microsoft has had a long-standing policy of providing cumulative service packs &#8211; service packs that can be installed for a product whether a previous service pack for that product has been installed or not. Prior to the release of Windows Installer 3.1, minor upgrades which typically serve as service packs had to contain a pair [&hellip;]<\/p>\n","protected":false},"author":389,"featured_media":3843,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[20,23],"class_list":["post-2173","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-installation","tag-logging"],"acf":[],"blog_post_summary":"<p>Microsoft has had a long-standing policy of providing cumulative service packs &#8211; service packs that can be installed for a product whether a previous service pack for that product has been installed or not. Prior to the release of Windows Installer 3.1, minor upgrades which typically serve as service packs had to contain a pair [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/posts\/2173","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/users\/389"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/comments?post=2173"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/posts\/2173\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/media\/3843"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/media?parent=2173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/categories?post=2173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/tags?post=2173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}