You are on page 1of 6

Internal Consistency Evaluators - ICEs

Internal consistency evaluators, also called ICEs, are custom actions written in VBScript, JScript,
or as a DLL or EXE. When these custom actions are executed, they scan the database for entries
in database records that are valid when examined individually but that may cause incorrect
behavior in the context of the whole database. Note that this is different than the validation done
on individual records using MsiViewModify.

For example, the Component table may list several components that are all valid when tested
individually with MsiViewModify. However, MsiViewModify would not catch the error when
two components use the same GUID as their component code. The custom action ICE08 is
designed to validate that the Component table does not contain duplicate component code
GUIDs.

ICE custom actions return four kinds of messages:

 Errors Error messages report database authoring that cause incorrect behavior. For
example, duplicate component GUIDs cause the installer to incorrectly register
components.
 Warnings Warning messages report database authoring that causes incorrect behavior in
certain cases. Warnings can also report unexpected side-effects of database authoring.
For example, entering the same property name in two conditions that differ only by the
case of letters in the name. Because the installer is case-sensitive, the installer treats these
as different properties.
 Failures Failure messages report the failure of the ICE custom action. Failure is
commonly caused by a database with such severe problems that the ICE cannot even run.
 Informational Informational messages provide information from the ICE and do not
indicate a problem with the database. Often they are information about the ICE itself,
such as a brief description. They can also provide progress information as the ICE runs.

1
ICE Description
ICE01 Simple test of ICE mechanism.
ICE02 Circular reference test for File-Component, Registry-Component KeyPaths.
ICE03 Basic data and foreign key validation.
ICE04 Validates file sequence numbers against the LastSequence numbers of the Media Table.
ICE05 Validates for "required" entries in particular tables.
ICE06 Validates for missing column or tables in the database. Any column defined in the
_Validation table must be found in the database.
ICE07 Validates that fonts are installed to the FontsFolder.
ICE08 Checks for duplicate GUIDs in the ComponentId column of the Component table.
ICE09 Validates that the permanent bit is set for every component marked for installation into the
SystemFolder.
ICE10 Ensures that advertise feature states among children and parents are compatible.
ICE12 Validates type 35 and type 51 custom actions and their locations in the sequence tables.
ICE13 Validates that dialogs are not listed as actions in the execute sequence tables. Dialog
actions are only allowed in the user interface sequence tables.
ICE14 Validates that feature parents do not have the msidbFeatureAttributesFollowParent bit set.
Also validates that the entries in the Feature and Feature_Parent columns are not the same
in the same record.
ICE15 Validates that a circular reference exists between every entry in the MIME table and the
corresponding extension in the Extension table.
ICE16 Validates that the ProductName in the Property table is not greater than 63 characters in
length.
ICE17 Validates control type dependencies in the Control table. Covers PushButtons,
RadioButtonGroups, ListBoxes, ListViews, and ComboBoxes.
ICE18 Validates the KeyPath column of the Component table when it is null. In this case, the key
path is a Directory.
ICE19 Validates the advertising tables: Class, TypeLib, Extension, PublishComponents, and
Shortcut.
ICE20 Validates that the required dialogs are in the Dialog table.
2
ICE21 Validates that all components in the Component table map to a feature in the
FeatureComponents table.
ICE22 Validates that the Feature_ and Component_ columns in the PublishComponent table.
ICE23 Validates the tab order of controls in all dialog boxes.
ICE24 Validates certain properties in the Property table.
ICE25 Verifies merge module dependencies and merge module exclusions.
ICE26 Validates required and prohibited actions in the sequence tables.
ICE27 Validates the organization and order of the sequence tables.
ICE28 Validates actions that must not be separated by ForceReboot.
ICE29 Validates that your stream names remain unique if truncated to the 62-character limit.
ICE30 Validates that the installation of components containing the same file never install the file
more than one time in the same directory.
ICE31 Validates the text styles listed in the Text column of the control table.
ICE32 Compares the column definitions to validate that keys and foreign keys are of the same
size and type.
ICE33 Checks the registry table for entries that belong in other tables.
ICE34 Validates that every group of radio buttons has a default.
ICE35 Validates that any files from a cabinet file cannot be set to run from the source.
ICE36 Validates that icons listed in the Icon table are used in the Class, ProgID, or Shortcut
tables.
ICE38 Validates that components installed under the user's profile use a registry key under
HKCU as their key path.
ICE39 Validates the Summary Information stream of the database.
ICE40 Performs various miscellaneous checks.
ICE41 Validates that entries in the Extension and Class tables refer to components belonging to
the referenced feature.
ICE42 Checks that Class table entries do not have .exe files set as InProc values, and that only
LocalServer contexts have arguments and DefInProc values.
ICE43 Checks that non-advertised shortcuts are in components with HKCU registry keys as the
key paths.
ICE44 Checks that dialog events in the ControlEvent table (NewDialog, SpawnDialog,
SpawnWaitDialog) reference valid Dialogs in the Dialog table.

3
ICE45 Checks for reserved bits that are set.
ICE46 Checks for custom properties that only differ from defined properties by their case.
ICE47 Checks for features with more than 1600 components per feature..
ICE48 Checks for directories that are hard-coded to local paths.
ICE49 Checks for non-REG_SZ default values in the registry table.
ICE50 Checks that advertised shortcuts have correct icons and context menus.
ICE51 Checks that TTC/TTF fonts do not have titles, but that all other fonts do.
ICE52 Checks for non-public properties in the AppSearch table.
ICE53 Checks for registry entries that write private installer information or policy values.
ICE54 Checks for components using companion files as their key path file.
ICE55 Checks that LockPermission objects exist and have valid permissions.
ICE56 Validates that the directory structure of the .msi file has a single valid root.
ICE57 Validates that individual components do not mix per-machine and per-user data.
ICE58 Checks that your Media Table does not have more than 80 rows.
ICE59 Checks that advertised shortcuts belong to components that are installed by the target
feature of the shortcut.
ICE60 Checks that if a file in the File Table is not a font and has a version, then it also has a
language.
ICE61 Checks the Upgrade Table.
ICE62 Performs extensive checks on the IsolatedComponent Table for data that may cause
unexpected behavior.
ICE63 Checks for proper sequencing of the RemoveExistingProducts action.
ICE64 Checks that new directories in the user profile are removed in roaming scenarios.
ICE65 Checks that the Environment Table does not have invalid prefix or append values.
ICE66 Uses the tables in the database to determine which schema your database should use.
ICE67 Checks that the target of a non-advertised shortcut belongs to the same component as the
shortcut itself, or that the attributes of the target component ensure that it does not change
installation locations.
ICE68 Checks that all custom action types needed for an installation are valid.
ICE69 Checks that all substrings of the form [$componentkey] within a Formatted string do not
cross-reference components.
ICE70 Verifies that integer values for registry entries are specified correctly.

4
ICE71 Verifies that the Media Table contains an entry with DiskId equal to 1.
ICE72 Ensures that the only custom actions used in the AdvtExecuteSequence Table are type 19,
type 35, and type 51 custom actions.
ICE73 Verifies that your package does not reuse package codes or product codes of the Windows
Installer SDK samples. For more information, see Package Codes and Product Codes.
ICE74 Verifies that the FASTOEM property has not been authored into the Property Table.
ICE75 Verifies that all custom action types that use an installed file as their source are sequenced
after the CostFinalize Action.
ICE76 Verifies that no files in the BindImage Table reference SFP (WFP) catalogs.
ICE77 Verifies that in-script custom actions are sequenced after the InstallInitialize Action and
before the InstallFinalize Action.
ICE78 Verifies that the AdvtUISequence Table either does not exist or is empty.
ICE79 Validates references to components and features entered in the database fields using the
Condition data type.
ICE80 Validates that Template Summary Property and Page Count Summary Property
correctly specify the presence of 64-bit components or custom action scripts.
ICE81 Validates the MsiDigitalCertificate Table, MsiDigitalSignature Table and
MsiPackageCertificate Table.
ICE82 Validates the InstallExecuteSequence Table.
ICE83 Validates the MsiAssembly Table.
ICE84 Checks the sequence tables to verify that required Standard Actions are not set with
conditions.
ICE85 Validates that the SourceName column of the MoveFile Table is a valid long file name.
ICE86 Issues a warning if the package uses the AdminUser property in database column of the
Condition type.
ICE87 Validates that the following properties have not been authored in the Property Table.
ICE88 Validates the DirProperty column of IniFile Table.
ICE89 Validates that the value in the Progid_Parent column in ProgId Table is a valid foreign key
into the ProgId column in ProgId table.
ICE90 Posts a warning if it finds that a shortcut's directory has been specified as a public
property.
ICE91 Posts a warning if a file, .ini file, or shortcut file is installed into a per-user profile

5
directory that does not vary based on the ALLUSERS property.
ICE92 Verifies that a component without a Component Id GUID is not also specified as a
permanent component. Verifies that no component has both the
msidbComponentAttributesPermanent and
msidbComponentAttributesUninstallOnSupersedence attributes.
ICE93 Issues a warning if a custom action uses the same name as a standard action.
ICE94 Issues a warning if there are any unadvertised shortcuts pointing to an assembly file in the
global assembly cache.
ICE95 Checks the Control Table and BBControl Table to verify that the billboard controls fit
onto all the billboards.
ICE96 Verifies that the PublishFeatures Action and the PublishProduct Action are entered in the
AdvtExecuteSequence Table.
ICE97 Verifies that two components do not isolate a shared component to the same directory.
ICE98 Verifies the description field of the ODBCDataSource Table for an ODBC data source.
ICE99 Verifies that no property name entered in the Directory table duplicates a name reserved
for the public or private use of the Windows Installer.
ICE10 Checks the authoring of the MsiEmbeddedUI and MsiEmbeddedChainer tables.
0
ICE10 Checks that no value in the Feature column of the Feature table exceeds a maximum
1 length of 38 characters.
ICE10 Validates the MsiServiceConfig and MsiServiceConfigFailureActions tables.
2
ICE10 Validates the MsiPrint and MsiLaunchApp control events.
3
ICE10 Verifies the MsiLockPermissionsEx and LockPermissions tables.
4
ICE10 Validates that the package has been authored to be installed in a per-user context.
5

You might also like