ValMakr – Command Line Windows Installer Automated Validation

ValMakr Prerequisites

Visual C++ Redistributables
evalcom2.dll (installed with Orca.msi)

Introduction

ValMakr is a tool which enables us to validate Windows Installers and Windows Installer transforms from the command line. We can use it to automate part of the Quality Assurance process during the packaging of applications.

As you probably already know, Microsoft already provide a tool called Msival2.exe which can be found here: http://msdn.microsoft.com/en-us/library/windows/desktop/aa370504(v=vs.85).aspx

Although a nice concept, if any organisation started using this tool they would notice some limitations:

  • You cannot specify a transform (MST) file to validate
  • You can only filter out informational messages (and not errors and warnings)
  • Although you can specify ICE messages to include, you cannot specify ICE messages to omit
  • You can not do differential validation – that is, only find validation messages introduced by transforms
  • You can not validate the summary information stream of transforms

The second point above is probably just a nice-to-have, and may not ever be used to suppress showing warnings/errors. The third point above is a useful one, since there are a few ICE messages which my current client chooses to ignore. So rather than specifying every single ICE message apart from the ones we omit (as we would have to with Msival2.exe), we can (more efficiently) just specify the ones to omit.

We thought the lack of ability to validate a transform mentioned in the first point – especially in the modern era where most vendor’s supply their own MSI files – was a real showstopper. ValMakr enables us to do all of this. And a little bit more….

For example, if we chose to validate an MSI with an MST we could either do a full validation (whereby the MSI with applied MST is validated as a whole) or a differential validation (whereby we only capture the ICE messages which have been introduced by the transform).

In my current organisation we would generally do a differential validation pointing to darice.cub (since we’re generally not interested in vendor ICE messages, but only the ones which we may introduce) and then a full validation to our own custom cub file, which has been created using CubMakr. ValMakr also checks the Summary Information Stream (SIS) of transforms too, to ensure they validate against SIS rules specified in CubMakr. The following SIS entries are checked:

PID_TITLE
PID_SUBJECT
PID_AUTHOR
PID_KEYWORDS
PID_COMMENTS
PID_TEMPLATE
PID_PAGECOUNT

Here is a list of available parameters to pass (square brackets are optional, mandatory parameters are -msi, -cub and -log):

ValMakr.exe -msi <Full Path to MSI> [-mst <Full Path to MST>] [-diff] -cub <Full Path to CUB> [-ice <Colon separated list of ICE routines>] [-noice <Colon separated list of ICE routines to omit>] [-type <e/w/i>] [-log <Full Path to LOG>]

Examples:

Full validation of MSI

ValMakr.exe -msi "c:\example.msi" -cub "c:\custom.cub" -log "c:\mylog.log"

Full validation of MSI, omit ICE33 and ICE03

ValMakr.exe -msi "c:\example.msi" -cub "c:\custom.cub" -noice "ICE33:ICE03" -log "c:\mylog.log"

Full validation of MSI and MST

ValMakr.exe -msi "c:\example.msi" -mst "c:\example.mst" -cub "c:\custom.cub" -log "c:\mylog.log"

Differential validation of MSI and MST

ValMakr.exe -msi "c:\example.msi" -mst "c:\example.mst" -diff -cub "c:\darice.cub" -log "c:\mylog.log"