An installation package (.msi), a transform (.mst) and a
patch package (.msp) are all OLE compound files (see the
compound file container)
holding a relational database and a summary information stream. Windows Installer sets
the storage’s class ID to show which of the three it is, independently of the summary
information. This page follows Microsoft’s Windows Installer documentation.
What the compound file holds
| Item | Contents |
|---|---|
| Tables | The database tables, listed on the tables page, with their catalogue in the system tables below. |
| Embedded streams | Embedded OLE data streams, listed in the _Streams table. |
| Embedded storages | Embedded OLE sub-storages (in a patch, for example, its transforms), listed in the _Storages table. |
| Summary information | The summary information property set. |
Not documented by Microsoft: how table rows and the shared string
pool are laid out in streams, and how stream names are encoded inside the compound file.
These are known only from independent implementations (such as Wine’s
msi library) and are not covered here.
System tables
| Table | Contents |
|---|---|
_Tables | Read-only list of all the tables. |
_Columns | Read-only catalogue of every column. |
_Validation | Column names and allowed values for all tables, used by validation tools. |
_Streams | The embedded OLE data streams. |
_Storages | The embedded OLE sub-storages. |
_TransformView | A read-only temporary table for viewing transforms. |
Column data types
Every column of every table has one of these data types:
| Type | Type | Type |
|---|---|---|
| Text | UpperCase | LowerCase |
| Integer | DoubleInteger | Time/Date |
| Identifier | Property | Filename |
| WildCardFilename | Path | Paths |
| AnyPath | DefaultDir | RegPath |
| Formatted | FormattedSDDLText | Template |
| Condition | GUID | Version |
| Language | Binary | CustomSource |
| Cabinet | Shortcut |
Summary information
An OLE property set. Codepage must be set before any string property.
| PID | Name | Property ID | Type |
|---|---|---|---|
| 1 | Codepage | PID_CODEPAGE | VT_I2 |
| 2 | Title | PID_TITLE | VT_LPSTR |
| 3 | Subject | PID_SUBJECT | VT_LPSTR |
| 4 | Author | PID_AUTHOR | VT_LPSTR |
| 5 | Keywords | PID_KEYWORDS | VT_LPSTR |
| 6 | Comments | PID_COMMENTS | VT_LPSTR |
| 7 | Template | PID_TEMPLATE | VT_LPSTR |
| 8 | Last Saved By | PID_LASTAUTHOR | VT_LPSTR |
| 9 | Revision Number | PID_REVNUMBER | VT_LPSTR |
| 11 | Last Printed | PID_LASTPRINTED | VT_FILETIME |
| 12 | Create Time/Date | PID_CREATE_DTM | VT_FILETIME |
| 13 | Last Saved Time/Date | PID_LASTSAVE_DTM | VT_FILETIME |
| 14 | Page Count | PID_PAGECOUNT | VT_I4 |
| 15 | Word Count | PID_WORDCOUNT | VT_I4 |
| 16 | Character Count | PID_CHARCOUNT | VT_I4 |
| 18 | Creating Application | PID_APPNAME | VT_LPSTR |
| 19 | Security | PID_SECURITY | VT_I4 |
Meanings
| Property | Package (.msi) | Transform (.mst) | Patch (.msp) |
|---|---|---|---|
| Title | Describes the file; should include “Installation Database”. | Should include “Transform”. | Should include “Patch”. |
| Subject | Product name (as ProductName). | Subject of the original package. | Description of the patch, with the product name. |
| Author | Manufacturer (as Manufacturer). | Manufacturer of the transform. | Manufacturer of the patch. |
| Keywords | Search keywords, including “Installer”. | The same. | Semicolon-separated list of the patch’s sources. |
| Comments | “This installer database contains the logic and data required to install …”. | “This transform contains …”. | “This patch contains …”. |
| Template (required) | Platform and languages. | Platform and one language it applies to; may be blank. | Semicolon-separated product codes that accept the patch. |
| Last Saved By | Last person to edit it; null when shipped; set to LogonUser during an administrative installation. | Platform and language IDs of the database after transforming. | Semicolon-separated transform substorage names, in the order applied. |
| Revision Number (required) | The package code (a GUID). | original-product-code original-version;new-product-code new-version;upgrade-code. | The patch code GUID, optionally followed (no separator) by the patch codes of patches it removes. |
| Last Printed | May record when an administrative image was made. | Null. | Null. |
| Create Time/Date | When created. | When created. | When created. |
| Last Saved Time/Date | When last saved; initially null. | The same. | The same. |
| Page Count (required in packages and transforms) | Minimum installer version × 100 (200 for 2.0); at least 200 for 64-bit packages. | The greater Page Count of the two databases compared. | Null. |
| Word Count (required) | Source image flags. | Null. | Minimum installer version. |
| Character Count | Null. | High 16 bits: transform validation flags; low 16 bits: transform error condition flags. | Null. |
| Creating Application | The authoring tool. | The tool. | The tool. |
| Security | Should be 2, “recommended read-only”. | Should be 4, “enforced read-only”. | Should be 4. |
| Codepage | The ANSI code page used to display the summary information. | ||
Template
In a package: [platform];[language-id][,language-id]…,
for example x64;1033, Intel;1033, Intel64;1033,
Arm;0, Arm64;1033,2046 or ;1033. Platforms:
Intel (32-bit; assumed when left out), x64,
Intel64 (Itanium), Arm (Windows RT) and
Arm64. Only one platform may be given; Alpha is not supported. Language 0 or
empty means language-neutral; only merge modules may list several languages. If the
current platform does not match, the installer does not process the package.
Word Count
In a package it is a bit field (0 when missing):
| Bit | Value | Meaning |
|---|---|---|
| 0 | 1 | Short file names (0: long file names). |
| 1 | 2 | Source is compressed (in cabinets listed in the Media table); only files at the root of the source are installed. 0: uncompressed, matching the Directory tree. |
| 2 | 4 | Source is an administrative image (0: original media). |
| 3 | 8 | Elevated privileges are not required (Windows Installer 4.0 and later). |
In a patch it gives the minimum installer version: 1 (default; made with MSPATCH), 2 (Windows Installer 1.2), 3 (2.0), 4 (3.0), 5 (3.1).
Sources
Microsoft Learn, Windows Installer: “Database Tables” (system tables), “Column Data Types”, “Summary Information Stream Property Set”, “Summary Property Descriptions”, “Template Summary property” and “Word Count Summary property”.