Blog
MSI Introduction to Tables
- April 12, 2022
- Posted by: Pavithra
- Category: End User Computing

MSI Introduction to Table basically represents a portion of the MSI file. MSI file is a well organized database. And this database is organized in to components and Features. The package installation logic is stored in the database along with the tables. Tables in an MSI file store data about how the software application is structured. To represent any given entity (say all the information to install a file) there may be several linked tables involved.
Windows Installer describes software applications using set of database tables. Installations are built by filling in rows in many different tables within a database. These tables are included in a .WSI file and when we compile this .WSI file, these tables are included in the resulting .MSI file.
Tables can be broadly classified as follows:
- Core Tables
- File Tables
- Advertising Tables
- Registry Tables
- ODBC Tables
- Service Tables
- Locator Tables
- Program Information Tables
- Installation Procedure Tables
- User Interface Tables
- System Tables
Core Tables:
What are core tables?
A) These are the tables most directly related to the Installer’s job of placing features and components on the user’s computer.
Feature Table:
What is a Feature table?
Feature table explains the logical tree structure of features. There should be atleast one feature in every MSI file. And a feature can have a parent and child features also. Feature table contains the list of features that are present in a specific MSI file. The following are the columns of Feature table:
For example suppose there are two features Feature 1 and Feature 2 in a specific msi file. Suppose ‘Feature 1’ feature is child feature of ‘Feature 2’ feature.

Feature Column:
It is a Primary key used to identify a particular feature record. Feature column shows Feature 1 as primary key for feature Feature1.
Feature Parent:
Feature 2 will be its parent feature, since Feature 1 feature is a child feature of Feature 2.
Title:
Title will be the Short string of text identifying the feature. So in this case it will be Feature 1.
Description:
Longer string of text describing the feature. It can be NULL
Display:
Value | Appearance in UserInterface |
NULL | Feature not displayed |
ODD NUMBER | Displayed as expanded |
EVEN NUMBER | Displayed as collapsed |
Level:
The initial installation level of this feature. An install level of zero disables the item and prevents it from being displayed.
Directory:
Directory_ column specifies the name of a directory that can be configured. In this particular example the Directory is INSTALLDIR.
Directory | Full path |
1) INSTALLDIR | C:\ProgramFiles\{Application Name}. Ex: “C:\Program Files\Adobe”. Where Adobe is application name. |
2) TargetDir | Ex: “C:\” |
Attributes:
This field specifies the remote execution option for features that have not yet been installed and for which no feature state request has been made using any of the properties. If this field is blank, the value defaults to 0.
Component Table: (MSI Introduction to Tables)
What is a Component table?
Component table lists all the components that are present in a particular MSI. In component table each and every component has specific number of files under it, and the installation and uninstallation of all the files under a specific component are managed by the component. There should be at least one component in each MSI file. There can’t be component under another component. Each component should have key path. This table contains the following columns:

Component:
Primary table key which identifies the component record.
ComponentId:
It a unique 128 bit hexadecimal number and this GUID (Globally Unique Identifier) is unique for every component.
Directory:
This column specifies to which directory a particular Component belongs to.
Attributes:
This column contains a bit flag that specifies options for remote execution. This is a bit field containing a combination of the flags as listed in below table.
Flag | Value | Explanation |
msidbComponentAttributesLocalOnly | 0 | Component cannot be run from source. |
msidbComponentAttributesSourceOnly | 1 | Component can only be run from source. |
msidbComponentAttributesOptional | 2 | Component can run locally or from source. |
msidbComponentAttributesRegistryKeyPath | 4 | The value in the KeyPath column is a foreign key into the Registry table. |
msidbComponentAttributesSharedDllRefCount | 8 | The Installer will increment the shared DLL RefCount value in the Registry for this component. |
msidbComponentAttributesPermanent | 16 | The Installer will not remove this component if the product is uninstalled. |
msidbComponentAttributesODBCDataSource | 32 | The value in the KeyPath column is a foreign key into the ODBCDataSource table. |
msidbComponentAttributesTransitive | 64 | The component is a transitive component. See Chapter 3 for an explanation of transitive components. |
msidbComponentAttributesNeverOverwrite | 128 | Prevents the Installer from overwriting the key path file or Registry entry if it already exists. |
Condition:
This column contains a conditional statement that can control whether a component is installed.
Value | UI |
Null (OR) TRUE | Component is Enabled |
False | Component is disabled and is not installed. |
KeyPath:
This column contains the key path of each component.
FeatureComponents Table:
What is a FeatureComponent table? FeatureComponents table defines the relationship between all the features and components of an msi file. If we have to change the feature of any component it can also be done through this table. For each feature, this table lists all the components that make up that feature. The following are the columns of FeatureComponents table:

Feature_:
An external key into the first column of the Feature table.
Component_:
An external key into the first column of the Component table
PublishComponent Table: (MSI Introduction to Tables)
What is a Publish Component table? The Publish Component table associates components listed in the Component table with a qualifier text-string and a category ID GUID. Components with parallel functionality that have been grouped together in this way are referred to as qualified components. The Publish Component table has the following columns:

ComponentId:
A string GUID that represents the category of components being grouped together. It refers to a server that provides the functionality of a component to external clients rather than the component itself.
Qualifier:
A qualifier is used to distinguish multiple forms of the same component, such as a component that is implemented in multiple languages.
Component:
This identifier refers to the qualified component’s record in the Component table.
AppData:
An optional localizable text describing the qualified component of this record.
Feature:
This is the feature which is using the qualified component.
Condition:
What is a condition table?
The Condition table can be used to modify the selection state of any entry in the Feature table based on a conditional expression. The Condition table has the following columns:

Feature:
This is a foreign key to the Feature table.
Level:
This is the install level to be set for the specified feature.
Condition:
This is a conditional expression to be evaluated.
Directory:
What is a Directory table? Directory table contains all the directories in an msi file. A directory can have a parent and child directories. If the parent or child directory of any directory is to be modified it can be done through this table. This table also lists all the parent directories of each directory. The Directory table has the following columns:

Directory:
Directory column contains a unique identifier for a directory.
Directory_Parent:
Directory_Parent column is a reference to the directory’s parent directory. Directory that has a Directory_Parent column equal to null or equal to the Directory column represents a root directory.
DefaultDir:
This column references to the name of both the target and source directories.
Complus:
What is a Complus table?
The Complus table contains information needed to install COM+ applications. The Complus table has the following columns:

Component:
The value present in this column references to the component that contains the COM+ application.
ExpType:
This column references Export flags used during the generation of the .msi file.
IsolatedComponent:
What is an IsolatedComponent table? The IsolatedComponent table enables the installation of “side-by-side” DLLs. A side-by-side DLL is one that is contained in the same folder as the application that uses the library. Windows has the ability to load multiple versions of side-by-side DLLs for different applications, even if they have the same name. Thus, side-by-side DLLs can provide a solution to DLL conflict problems. This table contains these columns:

Component_Shared:
Foreign key back to the Component table. This column identifies the component that contains the library to be loaded as a side-by-side DLL.
Component_Application:
Foreign key back to the Component table. This column identifies the component that will load the side-by-side DLL.
Shortcut Table:
What is a Shortcut table? Shortcut table holds the information the application needs, to create shortcuts on the user’s computer. Shortcut table has the following columns:

Shortcut:
This column contains the name of the shortcut.
Directory:
This column specifies the directory in which the Shortcut file is created.
Name:
The localizable name of the shortcut to be created
Component:
This column references to the name of the component that contains the shortcut.
Target:
The value in this column varies for advertised and non-advertised shortcuts. For advertised shortcuts the value in this column references to the Feature which contains the component that owns the shortcut. And in the case of non-advertised shortcuts the value in this column will be formatted string, and this particular formatted string will a folder or file containing the shortcut. To convert the non-advertised shortcuts into advertised shortcut resolve the formatted string to its full path.
Arguments:
This particular column references to the command-line arguments for the shortcut.
Description:
This column refers to the description of the shortcut.
Hotkey:
Authors of installation packages are generally recommended not to set this option, because the setting of this option can add duplicate hotkeys to a user’s desktop.
Icon:
This is a foreign key to the Icon table. If this is null, the icon in the target file is used.
IconIndex:
This must be a non negative integer.
ShowCmd:
The Show command for the application window.
Value | Style |
1 | SW_SHOWNORMAL |
3 | SW_SHOWMAXIMIZED |
7 | SW_SHOWMINNOACTIVE |
WKDir:
This column contains the working directory of the shortcut.