Blog
MSI Registry Tables
What is a Registry table?
This table holds all the miscellaneous (that is, not directly related to COM or COM+) information that the Installer needs to write to the Registry to install the application. The Registry table is used by the WriteRegistryValues action. This table contains the following columns:

Registry:
This column is an arbitrary key for the table which is used to identify a registry record.
Root:
This column indicates the Registry hive to be written to. It must have one of the values shown in below table.
Constant | Value | Explanation |
None (Empty) | -1 | i) For a per-user installation, writes to HKEY_CURRENT_USER. ii) For a per-machine installation, Writes to HKEY_LOCAL_MACHINE. |
msidbRegistryRootClassesRoot | 0 | HKEY_CLASSES_ROOT |
msidbRegistryRootCurrentUser | 1 | HKEY_CURRENT_USER |
msidbRegistryRootLocalMachine | 2 | HKEY_LOCAL_MACHINE |
msidbRegistryRootUsers | 3 | HKEY_USERS |
Key:
The Registry key to be written.
Name:
This column contains the name of the Registry value being written. If the column is null, then the value is written to the default for the Registry key. If the Value column is null, then this column should contain one of the special characters
Special Character | Corresponding Action |
+ | To create the key when the component is Installed. |
– | To delete the key when the component is uninstalled |
* | To create the key on installation and delete it on uninstallation |
Value:
This is the actual data to write to the Registry value.
Special Character. | Meaning |
If the value starts with #x | Stored as a hexadecimal value. |
If the value starts with #% | Stored as an expandable string. |
If the value starts with # | Stored as an integer. |
The special string [~] is stored as a null. | If this string occurs, the value is stored as a list of strings. |
If the string starts with [~] | The value is appended to any existing value. |
If the string ends with [~] | The value is prepended to any existing value. |
If the value starts with ## | Stored as a string starting with a single # sign. |
Component:
This is a foreign key to the Component table that identifies the component controlling this Registry operation.
The Remove Registry Table:
What is a RemoveRegistry table?
The RemoveRegistry table lists information that the Installer should delete from existing Registry keys when a product is installed. This table is used by the RemoveRegistryValues action. It has following columns:

RemoveRegistry:
This is an arbitrary key for the row of the table.
Root:
This column identifies the Registry hive that is to be edited. The RemoveRegistry table uses the same constants here that the Registry table uses.
Key:
This is the Registry key to be edited.
Name:
This is the Registry value to be deleted. We can use the special value “–” (without the quotes) to delete the entire key including any subkeys.
Component_:
This is a foreign key to the Component table, indicating the component whose installation triggers the removal of the keys.
Application Packaging Demo Video For Your Preview