{"id":2303,"date":"2006-04-07T17:40:00","date_gmt":"2006-04-07T17:40:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/heaths\/2006\/04\/07\/patch-files-extractor\/"},"modified":"2006-04-07T17:40:00","modified_gmt":"2006-04-07T17:40:00","slug":"patch-files-extractor","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/setup\/patch-files-extractor\/","title":{"rendered":"Patch Files Extractor"},"content":{"rendered":"<p><a href=\"http:\/\/blogs.msdn.com\/heaths\/archive\/2006\/02\/14\/532200.aspx\">Previously<\/a> I discussed conceptually how to extract files from a patch, mentioning that the transforms <a href=\"http:\/\/blogs.msdn.com\/heaths\/archive\/2005\/09\/01\/459561.aspx\">contained<\/a> within patches are stored as sub-storages and the cabinets that contain the files are stored as sub-streams. I&#8217;ve had a tool for a while that extracts the transforms and cabinets from a <i>.msp<\/i> file and wanted to share the slightly modified source for public consumption. This tool can extract transforms and binary streams from other Windows Installer file types such as <em>.msi<\/em> and <em>.msm<\/em> files, as well as other compound storage documents.<\/p>\n<p>You can <a href=\"http:\/\/hstewart.members.winisp.net\/downloads\/msix.zip\">download<\/a> the source and a release binary that programmatically does what I previously explained. This does not expand the files into the target directory structure, which is best handled by patching an administrative installation. What&#8217;s nice about extracting the cabinet file is that you get all files for all target products if the patch targets multiple products, which is common for Developer Division.<\/p>\n<p>Extracting the transforms &#8211; both the patch transform and the non-administrative transform &#8211; can be handy in determine which transform transforms what data. For example, in <a href=\"http:\/\/blogs.msdn.com\/heaths\/archive\/2006\/03\/24\/560467.aspx\">identifying a patch applied to an administrative transform<\/a>, I need to write a property to the non-administrative transform. To check this, I can extract the transforms and apply the non-administrative transform to the target product in Orca. If I simply applied the patch in Orca, I&#8217;d see both transforms applied and couldn&#8217;t be sure which transform wrote the property to help identify the patch as a client patch.<\/p>\n<p><a href=\"http:\/\/sdrv.ms\/QXFXhr\">Download the tool<\/a><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Previously I discussed conceptually how to extract files from a patch, mentioning that the transforms contained within patches are stored as sub-storages and the cabinets that contain the files are stored as sub-streams. I&#8217;ve had a tool for a while that extracts the transforms and cabinets from a .msp file and wanted to share the [&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":[14,20],"class_list":["post-2303","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-development","tag-installation"],"acf":[],"blog_post_summary":"<p>Previously I discussed conceptually how to extract files from a patch, mentioning that the transforms contained within patches are stored as sub-storages and the cabinets that contain the files are stored as sub-streams. I&#8217;ve had a tool for a while that extracts the transforms and cabinets from a .msp file and wanted to share the [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/posts\/2303","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=2303"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/posts\/2303\/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=2303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/categories?post=2303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/tags?post=2303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}