Creating Patch Installers

Windows Installer Technology allows for MSP Patch installers, which compliment your MSI installers really well.  However, Visual Studio doesn’t support the creation of them from within the IDE.  In fact, you have to download the Windows SDK Toolkit and use a utility called MSIMSP.  For this process, you will also need a utility called Orca from the same SDK; when you download the SDK, inside the Bin folder is an Orca.msi installer.

What you do is build the original version of your MSI installer; then you make the necessary changes and/or fixes to your product and recreate another MSI installer representing the new version of your product.  Then you pass these two MSI installers to the MSIMSP utility and it creates an MSP patch installer for you by automatically detecting the binary differences between the two MSI installers.

I used this article as a guide:

However, the Platform SDK link in the article is broken, so use this one instead:

This isn’t the most up-to-date Windows SDK, but the batch script in the CodeProject article relies on this specific versions folder structure (it has everything you need to create the MSP patch installer nicely in one folder, whereas the newest SDK does not).

I did run into a few of the same hiccups that others did (found down below in the comments of the CodeProject article).  Here are links to my posts with the solutions (you’ll have to click around each thread to see the problems posted before my posts):

Also, I had to modify his patch.cmd batch file slightly; a copy of it is pasted below.

This process isn’t as effective as it should be if you are trying to difference two Visual Studio created MSI installers.  The MSIMSP utility is very thorough in its comparison of file names, locations, sizes, versions, and every byte of data contained in the files.  It can create a binary difference between the two files in order to minimize as much as possible the patch installer’s size and speed.  It even compares the 8.3 short filename of every file.  Unfortunately, Visual Studio can be very inconsistent in its assignment of short filenames with the tilde-numbering system (i.e., "FILENA~3.TXT") if you add, rename, move, or delete even a couple of files from your project.  I often had to manually edit the short filenames in the second MSI using the Orca utility to make the names be consistent between the two versions of the Visual Studio created installers; otherwise, the MSIMSP utility would just blindly include the whole file for patching and inflate the overall size of the MSP patcher.

Good luck and enjoy not having to figure out what the deltas are between the versions of your products!

if "%1"=="" %0 Debug Release Done 

@set path=%path%;"C:\Program Files\Microsoft Platform SDK\Samples\SysMgmt\Msi\Patching"
@set PatchTmp=C:\VSTemp

if "%1"=="Done" goto end

if not exist %1\*.msi goto nopatch
if not exist TargetImage\%1\*.msi goto nopatch

rmdir /s /q %PatchTmp%
mkdir %PatchTmp%
mkdir %PatchTmp%\TargetImage
mkdir %PatchTmp%\UpgradedImage
mkdir %PatchTmp%\Patch

for %%a in (TargetImage\%1\*.msi) do copy %%a %PatchTmp%\setup.msi
msiexec /qb /a %PatchTmp%\setup.msi TARGETDIR=%PatchTmp%\TargetImage /L*v %PatchTmp%\TargetImage\setup.log
del %PatchTmp%\setup.msi

for %%a in (%1\*.msi) do copy %%a %PatchTmp%\setup.msi
msiexec /qb /a %PatchTmp%\setup.msi TARGETDIR=%PatchTmp%\UpgradedImage /L*v %PatchTmp%\UpgradedImage\setup.log
del %PatchTmp%\setup.msi

copy patch.pcp %PatchTmp%
set PatchDir=%CD%
chdir %PatchTmp%
msimsp -s patch.pcp -p Patch\patch.msp -l Patch\patch.log -f %PatchTmp%\Tmp -d

rmdir /s /q %PatchTmp%\TargetImage
rmdir /s /q %PatchTmp%\UpgradedImage
rmdir /s /q %PatchTmp%\Tmp
chdir %PatchDir%

mkdir Patch
mkdir Patch\%1
copy %PatchTmp%\Patch\*.* Patch\%1\*.*
rmdir /s /q %PatchTmp%

goto loop



if u run the above cmd file,it is going into an infinite loop.
ERROR: PatchGUID property is missing from the Properties table of the .pcp file. This is a required property
Found the solution…
i was missing "/D" option for chdir in my .cmd file
Hi Mike,
Thanks for the very useful article.
While prepating a patch as described above, i am getting following error
Failed to create patch. Error code: 0xC00E5198

any idea what can be the problem ?
Hi I’m getting this error while patching:

ERROR: UpgradedImages.MsiPath ‘C:\VSTemp\UpgradedImage\ERP.msi’ does not exist.

What could be the reason? I used your patch.cmd file.
Mike Murray
I think you will find the following link helpful:

I think you will find the whole website to be a helpful resource for all questions about installers, especially MSI and MSP installers.
Hi michael, thanks for your post is very interesting.

I´m trying release step to step, but my problem is the next:

***** Log starting: 2008-10-29 10:24:54 *****

Input-PCP path = ‘patch.pcp’
Patch-MSP path = ‘Patch\patch.msp’
Temp Folder = ‘C:\VSTemp\Tmp'
Patch GUID = ‘{91FF215B-112C-42B9-8862-FEE08663EC9C}’
ListOfPatchGUIDsToReplace = “none”
ListOfTargetProductCodes = ‘*’
PatchSourceList = ‘PatchSourceList’
AllowProductCodeMismatches = ‘1’
AllowProductVersionMajorMismatches = ‘1’
OptimizePatchSizeForLargeFiles = ‘blank’
ApiPatchingSymbolFlags = ‘0x00000000’
MsiFileToUseToCreatePatchTables = ‘blank’
SqlCmdToCreatePatchTable = ‘blank’
SqlCmdToCreatePatchPackageTable = ‘blank’
SqlCmdToCreateMsiPatchHeadersTable = ‘blank’
DontRemoveTempFolderWhenFinished = ‘1’
IncludeWholeFilesOnly = ‘0’
MinimumRequiredMsiVersion = ‘200’
AllowRemoval = ‘blank’

Using internal SQL cmd to create ‘Patch’ table.
Using internal SQL cmd to create ‘PatchPackage’ table.
Using internal SQL cmd to create ‘MsiPatchHeaders’ table.

Files differ: ‘C:\VSTemp\UpgradedImage.\AlbumFotos.dll’,
Patch file created: FTK=_0E2D0A15B23B989808E6FD64A243497B; temp location=fam1\00002.HDR.
Files differ: ‘C:\VSTemp\UpgradedImage.\PruebasPictureBox.dll’,
Patch file created: FTK=_24E4033462F0482C9B569672F8337663; temp location=fam1\00003.HDR.
Files differ: ‘C:\VSTemp\UpgradedImage.\DermaDatos.dll’,
Patch file created: FTK=_294ABD0349756E66C6CB0D11001752CE; temp location=fam1\00004.HDR.
Files differ: ‘C:\VSTemp\UpgradedImage.\CapturaImagenesPruebas.dll’,
Patch file created: FTK=_5E58F544E2DC940F4F3139031A15DE72; temp location=fam1\00005.HDR.
Files differ: ‘C:\VSTemp\UpgradedImage.\PruebasInforme.exe’,
Patch file created: FTK=_7328B00680B1965AF0370EF0DE389DBE; temp location=fam1\00006.HDR.
Files differ: ‘C:\VSTemp\UpgradedImage.\MotorAlertas.dll’,
Patch file created: FTK=_7FBC6D05562B82F2CDC2F1BDBE476432; temp location=fam1\00007.HDR.
Files differ: ‘C:\VSTemp\UpgradedImage.\ModoDiapositiva.dll’,
Patch file created: FTK=_8FEA4D552741B28293ABC797812149CD; temp location=fam1\00008.HDR.
Files differ: ‘C:\VSTemp\UpgradedImage.\Derma.exe’,
Patch file created: FTK=_5260684262CA164CEF0A33F5A94CAC55; temp location=fam1\00009.HDR.
ERROR: Since MSI 3.0 will block installation of major upgrade patches with sequencing information, creation of such patches is blocked.

***** Log finishing: 2008-10-29 10:25:05 *****

What is my problem?? Can you help me, please???

Thank you very much