ICE Errors and Resolutions

download ICE Errors and Resolutions

of 49

Transcript of ICE Errors and Resolutions

  • 8/7/2019 ICE Errors and Resolutions

    1/49

    ICE Errors and Resolutions

    11/19/2008 | Submitted By RJ What are Internal Consistency Evaluators (ICEs)?

    When I was visiting a customer a while ago, I ran into a software packagerwearing a funny t-shirt. I do not remember the name of the company whichwas promoting their packaging tool with that t-shirt at the time. However,the back of the t-shirt said Real packagers do it on ICE . :)

    Every software packager involved with Windows Installer possibly knows thatit is not easy to do it on ICE, right?

    Even though Microsoft created the ICE validation rules to enforce consistencywithin the MSI database, you may need to deal with many validation errorsand warnings which do not have obvious cause or resolution. Whether youdeal with a repackaged application as MSI or a vendor-supplied MSI, you maysee hundreds of validation errors and warnings. Some errors and warnings

    can safely be left in packages and others should be resolved.

    Internal Consistency Evaluators (ICEs)Internal consistency evaluators are simply custom actions written in VBScript,JScript, or as a DLL or EXE. When these custom actions are executed, theyscan the database for entries in database records that are valid whenexamined individually but that may cause incorrect behavior in the context of the whole installation database.ICE custom actions return four kinds of messages.

    * Errors: Error messages report database authoring that cause incorrectbehavior. Errors may cause run-time problems for the installation databaseand/or the application which can be installed from the installation database.For example, using the same GUID for two components is not allowed andthis will result in an ICE error during validation.

    * Warnings: Warning messages report database authoring that causesincorrect behavior in certain cases. Warnings can also report unexpectedside-effects of database authoring. For example, entering the same propertyname 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 differentproperties.

    * Failures: Failure messages report the failure of the ICE custom action.

    Failure is commonly caused by a database with such severe problems thatthe ICE cannot even run.

    * Informational: Informational messages provide information from the ICEand do not indicate a problem with the database. Often they are informationabout the ICE itself, such as a brief description. They can also provideprogress information as the ICE runs.

    The mechanism to do a package validation is fairly simple. To validate a

    http://www.appdeploy.com/account.asp?name=RJhttp://www.appdeploy.com/account.asp?name=RJ
  • 8/7/2019 ICE Errors and Resolutions

    2/49

    database, you will need to use a special validation tool to merge a .cub file(sometimes called ice cubes) containing the Internal Consistency Evaluators(ICEs) into your database, execute the ICEs, and report the results. You canuse MSI Validation Tool that comes with MS Platform SDK or use thirdparty utilities like Wise Package Validation Wizard .Authors of installation packages can also write ICE custom actions or use the

    standard set of ICEs included in the .cub files provided with the SDK. A .CUBfile is a special type of database that can also be opened by an MSI editingtool like ORCA (Orca comes with MS Platform SDK).

    ICE01

    What does ICE01 check?ICE01 validates that the ICE mechanism is working. It does not testanything. This ICE uses the Time property to get the time and returns eitherthe system time or None.

    When does ICE01 show up?Unless there is a problem with the ICE mechanism, ICE01 should neverreturn an error.

    Where can I get more information?Microsoft Platform SDK - ICE01

    ICE02 What does ICE02 check?ICE02 validates that certain references between the Component, File, andRegistry tables are reciprocal. These references must to be reciprocal for theinstaller to correctly determine the installation state of components.Key path value used for a component in the Component table must be theprimary key of a record in the Registry or File tables depending on the type of key path. In addition, the value used under Component_ column of File or

    Registry tables must be the primary key of the corresponding record in theComponent table. Hence, the references must be reciprocal.

    When does ICE02 show up?ICE02 posts an error message if it finds a reference that is not reciprocal.

    How can I fix ICE02?You will need to modify the record so that the reference can be reciprocal.

    Where can I get more information?Microsoft Platform SDK - ICE02

    ICE03 What does ICE03 check?ICE03 checks the data types and foreign keys based on the _Validation tableand the database tables in the .msi file. The _Validation table is a systemtable that contains the column names and the data types for all of the tablesin the database. It is used during the database validation process to ensurethat all columns are accounted for and have the correct values.

    When does ICE03 show up?ICE03 typically posts an error if a data value is not permitted based on the

  • 8/7/2019 ICE Errors and Resolutions

    3/49

    data type and table information stored in _Validation Table.Brief descriptions of the ICE03 errors are listed below:Duplicate Primary KeyThe primary keys of a new row duplicates the primary keys of an existingrow. The Nullable column of the _Validation table shows the primary keys inthe database.

    Not A Nullable ColumnA table column that is not specified as nullable in the Nullable column of the_Validation table contains an entry that is Null.

    Not A Valid Foreign KeyA column that is a foreign key into a second table contains an entry that doesnot exist in the primary key of the second table.

    Value exceeds MaxValueThe numeric value of an entry in a database table exceeds the maximumlimit specified for this field in the MaxValue column of the _Validation table.

    Value below MinValueThe numeric value of an entry in a database table is less than the minimumlimit specified for this field in the MinValue column of the _Validation table.

    Value not a member of the setThe value of an entry in a database table is not a member of the acceptableset of values specified for this field in the Set column of the _Validation table.

    Invalid version stringVersion number is not an acceptable value. The Version data type is a textstring containing a valid version string. A version string has the formatxxxxx.xxxxx.xxxxx.xxxxx where x is a digit.

    All UPPER case requiredLowercase values are not allowed. The UpperCase data type is a text stringthat must be all uppercase.

    Invalid GUID stringGlobally Unique Identifier used is not an acceptable value. The valid formatfor a GUID is {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} where X is ahex digit (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F). Note that utilities such asGUIDGEN can generate GUIDs containing lowercase letters. These must all bechanged to uppercase letters before the GUID can be used by the installer asa valid product code, package code, or component code.

    Invalid file name/usage of wildcardsThe database contains an invalid file name or an incorrect wildcard. TheWildCardFilename data type is a Filename that may also contain the wild cardcharacters "?" for any single character or "*" for zero or more occurrences of any character. The Filename data type is a text string containing a file nameor folder. By default, the file name is assumed to use short file name syntax;that is, eight-character name, period (.), and 3-character extension. Toinclude a long file name with the short file name, separate it from the shortfile name with a vertical bar (|).

  • 8/7/2019 ICE Errors and Resolutions

    4/49

    Short and long file names must not contain the following characters:\ ? | > < : / * "In addition, short file names must not contain the following characters:+ , ; = [ ]No space is allowed preceding the vertical bar (|) separator for the short filename/long file name syntax. Short file names may not include a space,

    although a long file name may. A space can exist after the separator only if the long file name of the file name begins with the space. No full-path syntaxis allowed.

    Invalid identifierThe Identifier data type is a text string. Identifiers may contain the ASCIIcharacters A-Z (a-z), digits, underscores (_), or periods (.). However, everyidentifier must begin with either a letter or an underscore.

    Invalid Language IdThe database contains an invalid numeric Language Identifier (LANGID). TheLanguage data type is a text string containing one or more valid numericlanguage IDs. If there are two or more language IDs, they must be separatedby commas.See the platform SDK for a current list of Language Identifiers used byWindows. For example, 1033 for the U.S. and 0 for language neutral.

    Invalid FilenameThe Filename data type is a text string containing a file name or folder. Bydefault, the file name is assumed to use short file name syntax; that is,eight-character name, period (.), and 3-character extension. To include along file name with the short file name, separate it from the short file namewith a vertical bar (|).Short and long file names must not contain the following characters:\ ? | > < : / * "

    In addition, short file names must not contain the following characters:+ , ; = [ ]No space is allowed preceding the vertical bar (|) separator for the short filename/long file name syntax. Short file names may not include a space,although a long file name may. A space can exist after the separator only if the long file name of the file name begins with the space. No full-path syntaxis allowed.

    Invalid full pathOnly Path, AnyPath, and Paths data types are allowed. The Path data type isa text string containing a valid full path. The string may also contain aproperty name enclosed in square brackets [ ]. In such a case, the name of the property, including the brackets, is replaced in the string by the value of the property. The AnyPath data type is a text string containing either a fullpath or a relative path. When specifying a relative path, you can include along file name with the short file name by separating the short and longnames with a vertical bar (|). Note that you cannot specify multiple levels of a directory or fully qualified paths in this way. The path may containproperties enclosed within square brackets ([ ]). The Paths data type is a textstring containing a list of Path data types, separated by semicolons (;).

    Bad conditional string

  • 8/7/2019 ICE Errors and Resolutions

    5/49

    The database contains an invalid conditional string. This is a text string thatmust evaluate to TRUE or FALSE according to the Conditional StatementSyntax.

    Invalid format stringOnly Formatted data type is allowed.

    The Formatted data type is a text string that is processed to resolveembedded property names, table keys, environment variable references, andother special substrings. The following conventions are recognized to resolvethe string* Square brackets ([ ]) or curly braces ({ }) with no matching pair are left inthe text.* If a substring of the form [propertyname] is encountered, it is replaced bythe value of the property. If propertyname is not a valid property name, thenthe substring resolves as blank.* The square brackets may be iterated and the property names are resolvedfrom inside out.* If a substring of the form [%environmentvariable] is found, the value of theenvironment variable is substituted for the substring.* If a substring of the form [\x] is found, it is replaced by the character x ,where x is one character, without any further processing. Only the firstcharacter after the backslash is kept; everything else is removed.* If a substring is enclosed in curly braces ({ }), and it contains no propertynames enclosed in square brackets ([ ]), the substring is left unchanged,including the curly braces.* If a substring is enclosed in curly braces ({ }) and it contains one or moreproperty names enclosed in square brackets ([ ]) then, if all the propertynames are valid, the text (with the resolved substitutions) is displayedwithout the curly braces.* If a substring of the form [~] is found, it is replaced with the null character.This is used to author REG_MULTI_SZ character strings in the Registry table.

    Note that [~] is also used to append or prefix values to environmentvariables using the Environment table.* If a substring of the form [#filekey] is found, it is replaced by the full pathof the file, with the value filekey used as a key into the File table. The valueof [#filekey] remains blank and is not replaced by a path until the installerruns the CostInitialize action, FileCost action, and CostFinalize action. Thevalue of [#filekey] depends upon the installation state of the component towhich the file belongs. If the component is run from the source, the value isthe path to the source location of the file. If the component is run locally, thevalue is the path to the target location of the file after installation. If thecomponent has an action state of absent, the installed state of thecomponent is used to determine the [#filekey] value. If the installed state of the component is also absent or null, [#filekey] resolves to an empty string,otherwise it resolves to the value based upon the component's installed state.For more information about checking the installation state of components,see Checking the Installation of Features, Components, Files.* If a substring of the form [$componentkey] is found, it is replaced by theinstall directory of the component, with the value componentkey used as akey into the Component table. The value of [$componentkey] remains blankand is not replaced by a directory until the installer runs the CostInitializeaction, FileCost action, and CostFinalize action. The value of [$componentkey] depends upon the installation state of the component and

  • 8/7/2019 ICE Errors and Resolutions

    6/49

    where it occurs. In the Value column of the Registry Table, this substringmay refer to the action state or the requested action state of the component.In all other cases, this substring refers to the action state of the component.For example, if the component is run from the source, the value is the sourcedirectory of the file. If the component is run locally, the value is the targetdirectory after installation. If the component is absent, the value is left blank.

    Windows Installer tracks both the action and requested installation states of components.* Note that if a component is already installed, and is not reinstalled,removed, or moved during the current installation, the action state of thecomponent is null and the string [$componentkey] evaluates to Null.If a substring of the form [!filekey] is found, it is replaced by the full shortpath of the file, with the value filekey used as a key into the File table. Thissyntax is valid only when used in the Value column of the Registry or theIniFile tables. When used in other columns this syntax is treated the same as[#filekey].

    Invalid template stringOnly Template data type is allowed. The Template data type is a text stringthat may contain properties that are enclosed in brackets [ ]. The templatetype allows all of the Formatted type formats, plus [1] where 1 is a number.

    Invalid DefaultDir stringOnly DefaultDir data type is allowed. The DefaultDir data type is a text stringcontaining either a valid Filename or a valid Identifier. This is used only in theDirectory table. It must be an identifier if the directory is a root directory. If the directory is a non-root, this value must be a filename or afilename:filename pair. Note that "." is allowed as a file name and has specialmeaning in the Directory table.

    Invalid registry path

    Only RegPath data type is allowed. The RegPath data type is a text stringcontaining a Registry path. Registry paths can include properties, as with theFormatted data type. A RegPath may not begin or end with a backslash (\).The [#file key] and [$component key] can be embedded in the path orpreceded by other characters.

    Bad CustomSource dataOnly CustomSource data type is allowed. The CustomSource data type iseither a valid Identifier or an external key depending on the Type column of the CustomAction table. It can be an external key into the Binary table, Filetable, Directory table, and Property table.

    Invalid property stringOnly Property data type is allowed. The Property data type is a valid Identifierwith the additional syntax "%identifier", which represents an environmentvariable.

    Missing data in _Validation table or old DatabaseThere are columns in the database that are not listed in the Column columnof the _Validation table. The database and _Validation table do not match

    Bad cabinet syntax/name

  • 8/7/2019 ICE Errors and Resolutions

    7/49

    Only Cabinet data type is allowed. The Cabinet data type must be used in theCabinet column of the Media table. If the cabinet name is preceded by thenumber sign, the cabinet is stored as a data stream inside the package. Thecharacter string which follows the # is an Identifier for this data stream. Notethat if the cabinet is stored as a data stream, the name of a cabinet is case-sensitive.

    _Validation table: Invalid category stringThis is an error in authoring the _Validation table. Validation does notrecognize the category string used for this particular column in the_Validation table. The following Column Data Types are specified as validcategories: Text, UpperCase, LowerCase, Integer, DoubleInteger, Time/Date,Identifier, Property, Filename, WildCardFilename, Path, Paths, AnyPath,DefaultDir, RegPath, Formatted, Template, Condition, GUID, Version,Language, Binary, CustomSource, Cabinet, Shortcut.

    _Validation table: Data in KeyTable column is incorrectThe KeyTable column in the _Validation table references a table that does notexist in the database.

    _Validation table: Value in MaxValue column < that in MinValue columnThis is an error in authoring the _Validation table. Min must always be lessthan or equal to Max.

    Bad shortcut targetOnly Shortcut data type is allowed. The Shortcut data type is usually used inthe Target column of the Shortcut table. If it contains square brackets ([ ]),the shortcut target is evaluated as a Formatted string. Otherwise, theshortcut is evaluated as an Identifier and must be a valid foreign key into theFeature table.

    String overflow (greater than length permitted in column)The string's length is greater than the column width specified by the columndefinition. Note that the installer does not internally limit the column width tothe specified value. See Column Definition Format.

    Undefined errorUnknown error

    Column cannot be localizedPrimary key columns cannot be localized.

    How can I fix ICE03?You will need to correct the data found in the specified table based on thedata type information stored in _Validation table.

    Where can I get more information?Microsoft Platform SDK - ICE03

    ICE04 What does ICE04 check?ICE04 validates that the sequence number of every file in the File table is lessthan or equal to the largest sequence number in the LastSequence column of

  • 8/7/2019 ICE Errors and Resolutions

    8/49

    the of the Media table.When does ICE04 show up?ICE04 posts an error message if there is a file with a sequence numbergreater than the largest LastSequence number for the source media.How can I fix ICE04?LastSequence column in Media table holds the maximum number allowed for

    a sequence number of a file. In order to fix this, the largest LastSequencenumber for the source media needs to be incremented.Where can I get more information?Microsoft Platform SDK ICE04ICE05What does ICE05 check?ICE05 validates that certain database tables contain required entries. Thefollowing properties (i.e. Windows Installer variables) have to be present inthe Property table of any MSI file: ProductName, ProductLanguage,ProductVersion, ProductCode, and Manufacturer.When does ICE05 show up?ICE05 posts an error if a required entry is not found in the database.How can I fix ICE05?You will need to add the required entry or entries to your installationdatabase.Where can I get more information?Microsoft Platform SDK ICE05ICE06What does ICE06 check?ICE06 checks every table to validate that all the columns listed in the_Validation table are present in the table. The _Validation table is a systemtable that contains the column names and the data types for all of the tablesin the database. It is used during the database validation process to ensurethat all columns are accounted for and have the correct values. If a tabledoes not exist, any _Validation entries for that table are ignored.

    When does ICE06 show up?ICE06 posts an error if it detects instances in which an author tries to use anew _Validation table that reflects a schema change with an old databasethat has not been updated. ICE06 also detects the reverse case of an old_Validation table being used with an altered database. Essentially, ICE06 willshow up when there is a table column defined in the _Validation table that isnot listed in the _Columns table.How can I fix ICE06?You will need to update your _Validation table or alter your MSI databaseschema.Where can I get more information?Microsoft Platform SDK ICE06ICE07What does ICE07 check?ICE07 checks to see if the installation package is set to install fonts into theFontsFolder (FontsFolder is a property which gets resolved to the full path of the system Fonts folder.). If a font is installed to a folder other than theFontsFolder the installer creates a shortcut rather than actually installing thefont.When does ICE07 show up?ICE07 posts an error if the font file is being installed into a folder other thanthe FontsFolder.

  • 8/7/2019 ICE Errors and Resolutions

    9/49

    How can I fix ICE07?You will need to specify your fonts files to be installed into the FontsFolder.Where can I get more information?Microsoft Platform SDK ICE07ICE08What does ICE08 check?

    ICE08 validates that the Component table contains no duplicate GUIDs (i.e.Globally Unique Identifiers). Every component must have a unique GUID.Components are storage units for application resources. They are alsoregistered on the target system for application maintenance. The only way forWindows Installer to identify which resource belongs to which component isthrough these unique identifiers. Components should never ever use thesame GUID.When does ICE08 show up?ICE08 posts an error message if two or more components share the sameGUID. Technically that means two or more entries in the ComponentIdcolumn of the Component table contain the same GUID.How can I fix ICE08?You will need to specify/generate unique GUIDs for each component you havein your installation database.Where can I get more information?Microsoft Platform SDK ICE08ICE09What does ICE09 check?ICE09 checks to see if a file is set to be installed as a permanent resource (tobe left on the system during uninstall) under SystemFolder (SystemFolder isthe property which gets resolved to the full path of the System folder).Technically, ICE09 validates that the permanent bit is set for everycomponent marked for installation into the SystemFolder.When does ICE09 show up?ICE09 posts a warning if a file that is set to be installed under System folder

    is NOT marked as a permanent resource. Installation authors should avoidinstalling non-permanent system components to the SystemFolder.How can I fix ICE09?To prevent this warning, you should mark your files that are set to beinstalled under System folder as permanent resources. Technically, you needto set the Permanent bit in the Attributes column of the Component table forevery component that is marked for installation into the SystemFolder.Where can I get more information?Microsoft Platform SDK ICE09ICE10What does ICE10 check?ICE10 checks if advertisement is allowed for a child feature whose parentfeature supports advertisement. Technically, ICE10 validates that theadvertise state of child features matches that of its parent feature. A childfeature may not disallow advertisement while its parent feature allowsadvertisement because it would turn off the parent whenever the parent wassupposed to be advertised. However, the reverse is allowed. A child can bemarked to favor advertisement while the parent is marked to disallowadvertisement.Note: The Windows Installer can advertise the availability of an application tousers or other applications without actually installing the application. If anapplication is advertised, only the interfaces required for loading and

  • 8/7/2019 ICE Errors and Resolutions

    10/49

    launching the application are presented to the user or other applications. If auser or application activates an advertised interface the installer thenproceeds to install the necessary components as described in Installation-On-Demand.When does ICE10 show up?ICE10 generates an error if a child feature disallows advertisement while its

    parent feature allows advertisement. Technically, ICE10 posts an error if theAttributes column of the Feature table contains a mismatch in the advertisestate.How can I fix ICE10?Child feature should not be set to disallow advertisement, which conflicts withthe allow advertisement state of its parent. So, you should either change thefeature state of the child or the parent. Note that it is valid to set the state of a feature to 0 and have its parent or child set to favor or disallowadvertisement.Where can I get more information?Microsoft Platform SDK ICE10ICE11What does ICE11 check?ICE11 validates that a nested MSI installation custom action has a valididentifier for the source. Technically, ICE11 checks the Source column of theCustomAction table for Nested Installation custom actions. The Sourcecolumn must contain a valid GUID (MSI product code).Note: The valid format for a GUID is {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} where X is a hex digit (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F).Utilities such as GUIDGEN can generate GUIDs containing lowercase letters.These must all be changed to uppercase letters before the GUID can be usedby the installer as a valid product code, package code, or component codeWhen does ICE11 show up?ICE11 posts an error if the Source column of the CustomAction table isauthored incorrectly for nested installation custom actions.

    How can I fix ICE11?The source of a Nested Installation custom action must contain a valid GUID.So, you should update the source value so that it can represent a valid MSIproduct code.Where can I get more information?Microsoft Platform SDK ICE11ICE12What does ICE12 check?ICE12 checks the following items in your MSI database: CostFinalize action occurs in any sequence table containing SetDirectory (Type 3 5) or Set Property (Type 51) custom actions. Every Set Directory (Type 35) custom action comes after the CostFinalize action in the sequence tables. Every Set Property (Type 51) custom action that has a foreignkey to the Directory table in the Source column of the CustomAction tablecomes before the CostFinalize action in the sequence tables.ICE12 queries the CustomAction, Directory, AdminExecuteSequence,AdminUISequence, AdvtExecuteSequence, InstallExecuteSequence, andInstallUISequence tables for validation.Note: ICE12 does not validate the formatted text in the Target column of theCustomAction table.When does ICE12 show up?

  • 8/7/2019 ICE Errors and Resolutions

    11/49

    ICE12 posts an error message if validation of the custom actions that set adirectory property fails.How can I fix ICE12?Since ICE12 checks more than one thing, you will need to fix your MSI basedon the specific error message returned from ICE12. You may need to do oneof the following to fix ICE12: Change the custom action entry in the Source column of CustomActiontable to an existing entry in the Directory table or add the new directory tothe Directory table. Change the custom action location in the InstallExecuteSequence tablesuch that it comes after the CostFinalize action. Change the custom action location in the InstallExecuteSequence tablesuch that it comes before the CostFinalize action.Where can I get more information?Microsoft Platform SDK ICE12ICE13What does ICE13 check?ICE13 checks if any of your installation user interface dialogs in your MSIdatabase are placed in ExecuteSequence tables. Technically, ICE13 validatesthat dialogs in sequence tables appear ONLY in the AdminUISequence, orInstallUISequence tables. Dialogs must not be listed in the ExecuteSequencetables (i.e. InstallExecuteSequence, AdminExecuteSequence, andAdvtExecuteSequence tables).When does ICE13 show up?ICE13 posts an error message if a dialog is found in an execute sequencetable (i.e. InstallExecuteSequence, AdminExecuteSequence, orAdvtExecuteSequence tables).How can I fix ICE13?You should either completely remove the specified dialog from the executesequence or cut & paste it to a UISequence table (i.e. AdminUISequence, orInstallUISequence)

    Where can I get more information?Microsoft Platform SDK ICE13ICE14What does ICE14 check?ICE14 validates the following: Root (top level) features must not have Follow Parent attribute set. A root feature does not have a parent. No feature can be its own parent.When does ICE14 show up?ICE14 posts an error message if it finds a root feature with the FollowParent (i.e., msidbFeatureAttributesFollowParent) bit set or a feature with identical entries in the Feature and Feature_Parent columns of the Featuretable.How can I fix ICE14?Depending on the ICE14 error details, you will need to do one of thefollowing: From your root feature, remove the msidbFeatureAttributesFollowParentbit set in the Attributes column of the Feature table. Remove the value found under Feature_Parent column of the Featuretable for the feature that has the same entry in the Feature andFeature_Parent columns.Where can I get more information?

  • 8/7/2019 ICE Errors and Resolutions

    12/49

    Microsoft Platform SDK ICE14ICE15What does ICE15 check?ICE15 validates that content type and extension references in the MIME andExtension tables are reciprocal. The MIME table must reference a contenttype to an extension that the Extension table references back to the samecontent type. Multiple extensions can reference the same MIME type, as longas the MIME type references back to one of the extensions. Multiple MIMEtypes can reference the same extension, as long as the extension referencesback to one of the MIME types.Note: Whenever a MIME references an extension, that extension cannot havethe MIME_ column in the Extension table set to Null.When does ICE15 show up?ICE15 posts an error if the content type and extension references are notreciprocal.How can I fix ICE15?You will need to take a look at ContentType, and Extension_ columns of MIMEtable as well as Extension, and MIME_ columns of Extension table to find if references are reciprocal.Note: _ (i.e. underscore character) used in a column name is an indication of a foreign key (i.e. primary key of another table). Such a columnname also gives you an indication about which table it links to. For example,MIME_ column of Extension table is a foreign key that links the table to MIMEtable where the primary key is ContentType. Hence, you should see the samedata under both columns for records that are reciprocal.Where can I get more information?Microsoft Platform SDK ICE15ICE16What does ICE16 check?ICE16 validates that the value of the ProductName property in the Propertytable is no greater than 63 characters in length.

    Note: The installer truncates ProductName values that are 31 to 63characters in length to 31 characters. A longer name does not show when theregistry key for DisplayName is set in the Uninstall for ARP.When does ICE16 show up?ICE16 posts an error message if the ProductName set in the Property table islonger than 63 characters.How can I fix ICE16?You need to make your Product Name string less than or equal to 63characters in length.Where can I get more information?Microsoft Platform SDK ICE16ICE17What does ICE17 check?ICE17 checks more than one situation related to the user interface controlsused on dialogs (if your setup contains dialogs).When does ICE17 show up?ICE17 displays an error or warning message if the following rules are notfollowed: Pushbutton control used on a dialog must have an event defined in theControl Event table. Essentially the idea of using a push button is to triggeran event. A button that is not attached to an event does not provide anyvalue. ICE17 returns error if this rule is not followed.

  • 8/7/2019 ICE Errors and Resolutions

    13/49

    Bitmap and/or icon controls used on dialogs must have correspondingbitmaps and/or icons listed in the Binary table. Binary table is used to storebinary data such as bitmaps, icons, DLL files, etc. If a bitmap control or anicon control does not have a corresponding data listed in the Binary table,ICE17 returns error. Property value used in RadioButton table must be used for thecorresponding data under Property column in Control table (if the Indirect bitis not set in Attributes column). ICE17 posts a warning because the installeruses the property's value as a foreign key into the RadioButton table, but thevalue is missing from the primary key of that table. This warning can beignored if the control is created at runtime. Property value used in ComboBox table must be used for thecorresponding data under Property column in Control table (if the Indirect bitis not set in Attributes column). ICE17 posts a warning because the installeruses the property's value as a foreign key into the ComboBox table, but thevalue is missing from the primary key of that table. This warning can beignored if the control is created at runtime. Property value used in ListView table must be used for the correspondingdata under Property column in Control table (if the Indirect bit is not set inAttributes column). ICE17 posts a warning because the installer uses theproperty's value as a foreign key into the ListView table, but the value ismissing from the primary key of that table. This warning can be ignored if thecontrol is created at runtime. PushButton or CheckBox controls can display a bitmap or an icon. If thatis the case, Text column of the Control table must contain a foreign key intothe record of the Binary table containing the bitmap or icon. ICE17 returnserror if this rule is not followed. RadioButtonGroup control can display a bitmap or an icon. If that is thecase, Text column of the RadioButton table must contain a foreign key intothe record of the Binary table containing the bitmap or icon. ICE17 returnserror if this rule is not followed.

    PushButton, CheckBox, or RadioButtonGroup controls can not have bothIcon bit and Bitmap bit set in the Attributes column of the Control table. It isnot allowed to set both attributes together. ICE17 returns error if this rule isnot followed.How can I fix ICE17?Depending on the situations explained above, the necessary modificationsshould be done for the appropriate record(s) of user interface control tables.Where can I get more information?Microsoft Platform SDK ICE17ICE18What does ICE18 check?ICE18 checks if the installation package specifies an empty directory as thekey path of a component that is not listed in the CreateFolder table.If the KeyPath column of the Component table is Null, this means thatdirectory listed in the Directory_ column is the key path for that component.Because folders created by the installer are deleted when they becomeempty, this folder must be listed in the CreateFolder table to prevent theinstaller from attempting to install every time.When performing a validation ICE18 first checks whether the following are alltrue: The KeyPath column of the Component table contains a Null value. That there are no files listed for the component in the File table.

  • 8/7/2019 ICE Errors and Resolutions

    14/49

    That there are no files for the component listed in the RemoveFile tableand that the value in the DirProperty is the same as the Directory_ column of the Component table. That there are no files for the component listed in the DuplicateFile tableand that the value in the DestFolder is the same as the Directory_ column of the Component table. That there are no files for the component listed in the MoveFile table andthat the value in the DestFolder is the same as the Directory_ column of theComponent table.If these are all true then ICE18 validates the following: That the Component_ column of the CreateFolder table has the samevalue as the Component column of the Component table. That the Directory_ column of the CreateFolder table has the same valueas the Directory_ column of the Component table.When does ICE18 show up?ICE18 posts an error message if the installation package specifies a directoryas the key path for component that is not listed in the CreateFolder table.How can I fix ICE18?Empty directory used as a key path for a component in the installationpackage must be specified in the CreateFolder table.Where can I get more information?Microsoft Platform SDK ICE18ICE19What does ICE19 check?ICE19 validates that advertised components reference a file in the KeyPathcolumn of the Component table and that an advertised shortcut references adirectory in this column.ICE19 validates that advertised components or shortcuts have aComponentId. Components in the PublishComponent table, which are notadvertised in another table, are only checked to see whether they have aComponentId.

    When does ICE19 show up?ICE19 posts an error message if the KeyPath column of the Component tabledoes not reference a file in the case of an advertised component or adirectory in the case of an advertised shortcut.ICE19 posts an error message if any advertised components or shortcuts donot have a ComponentId.How can I fix ICE19?Depending on the situation, either the KeyPath or ComponentId column of the Component table has to be updated.Where can I get more information?Microsoft Platform SDK ICE19ICE20What does ICE20 check?ICE20 validates the standard dialogs (i.e. FilesInUse, Error, Exit, UserExit,FatalError dialogs) and dialog requirements of an installation package havingan authored user interface. Installation packages with an authored userinterface have a Dialog table and the LIMITUI property is not set.When does ICE20 show up?ICE20 posts an error message if it cannot validate that the standard dialogsand requirements are present in the installation package.How can I fix ICE20?If you use commercial MSI setup development tools, standard dialogs should

  • 8/7/2019 ICE Errors and Resolutions

    15/49

    already be part of a base MSI template. In other words, ICE20 should nevershow up if you create packages based on a base MSI template which containsthese standard dialogs.Where can I get more information?Microsoft Platform SDK ICE20ICE21What does ICE21 check?ICE21 validates that every component in the Component table belongs to afeature. FeatureComponents table is checked to verify this mapping.When does ICE21 show up?ICE21 posts an error message if the installation package contains acomponent that does not belong to a feature.How can I fix ICE21?Every component in an MSI package must be assigned to a feature. If thereare unassigned components, they will never be installed on a target PC. Inorder to fix ICE21, the component with this error must be assigned to aproper feature in the package. This can be accomplished by creating a recordin FeatureComponents table.Where can I get more information?Microsoft Platform SDK ICE21ICE22What does ICE22 check?ICE22 uses the FeatureComponents table to validate the mapping of featuresand components referenced in the PublishComponent table(PublishComponent table is used for qualified components. A qualifiedcomponent is a method of single-level indirection, similar to a pointer.Qualified components are primarily used to group components with parallelfunctionality into categories.).When does ICE22 show up?ICE22 posts an error message if the features and components are mappedincorrectly in the PublishComponent table.

    How can I fix ICE22?PublishComponent table needs to be modified to have the correct mapping of features and components referenced in PublishComponent table.Where can I get more information?Microsoft Platform SDK ICE22ICE23What does ICE23 check?ICE23 validates the control tab order for each dialog box. ICE23 verifies thatthe tab order forms a single, closed, loop that comes back to the initialcontrol. Hence, at run-time if you tab from one control to another in the endyou should come back to the control which you started with.When does ICE23 show up?ICE23 posts an error message if the tab order of controls does not form asingle closed loop in the dialog box.How can I fix ICE23?You will need to create a single, closed loop for the tab order. You may needto modify the data under Control_First column of dialog record found inDialog table or data under Control_next column of control record found inControl table.Where can I get more information?Microsoft Platform SDK ICE23ICE24

  • 8/7/2019 ICE Errors and Resolutions

    16/49

    What does ICE24 check?ICE24 validates the following properties in the Property table: That the ProductCode Property is a valid GUID data type. The validformat for a GUID is {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} whereX is a hex digit (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F). That the ProductVersion Property is a valid Version data type. TheVersion data type is a text string containing a valid version string. A versionstring has the format xxxxx.xxxxx.xxxxx.xxxxx where x is a digit. Themaximum acceptable version string is 65535.65535.65535.65535. That the ProductLanguage Property is a valid Language data type. TheLanguage data type is a text string containing one or more valid numericlanguage IDs.When does ICE24 show up?ICE24 posts an error message if any of these properties are not in the formof a valid data type.How can I fix ICE24?Property value(s) must be modified to follow the data types allowed.Where can I get more information?Microsoft Platform SDK ICE24ICE25What does ICE25 check?ICE25 validates that a .msi file satisfies all of its internal merge moduledependencies and exclusions.When does ICE25 show up?ICE25 posts an error message if .msi file has previously been merged with anincompatible merge module or if it has not been merged with a necessarymerge module.How can I fix ICE25?All merge module dependencies indicated in the .msi file's ModuleDependencytable must be satisfied by at least one merge module listed in theModuleSignature table. All excluded merge modules in the ModuleExclusion

    table must be compatible with the merge modules listed in theModuleSignature table.Where can I get more information?Microsoft Platform SDK ICE25ICE26What does ICE26 check?ICE26 validates that AdminUISequence, AdminExecuteSequence,InstallUISequence, InstallExecuteSequence tables contain the actions thatare required by the table and does not contain any actions disallowed in thetable.When does ICE26 show up?ICE26 posts an error message if the installation package has a sequencetable that lacks a required action or that contains an action that is disallowedfor the table.How can I fix ICE26?If a required action is missing from the sequence table, you must add themissing action to the indicated sequence table. If an action cannot be in theindicated sequence table, you must remove the action from the sequencetable.Where can I get more information?Microsoft Platform SDK ICE26ICE27

  • 8/7/2019 ICE Errors and Resolutions

    17/49

    What does ICE27 check?ICE27 validates the sequence tables (i.e., AdvtExecuteSequence,AdminUISequence, AdminExecuteSequence, InstallUISequence,InstallExecuteSequence tables) of an installation package for valid actions,action sequence restrictions, and organization in Search, Costing, Selection,and Execution sections.The ICE27 custom action validates the following: That the actions listed in the Action column of the sequence tables arestandard actions, a custom action listed in the CustomAction table, or adialog box listed in the Dialog table. That actions subject to sequencing restrictions are in the correct relativeorder to each other in the action sequence. Sequencing restrictions resultwhen one action is dependent on another. That actions restricted to a particular section of the sequence are locatedwhere they belong.When does ICE27 show up?ICE27 posts an error message if there are sequence tables in the packagewith invalid action sequencing or organization.How can I fix ICE27?If there is an unknown action found in a standard table, depending on theaction either a custom action must be added to CustomAction table or adialog box must be listed in the Dialog table.If there is an action that is in wrong place in the sequence table, you mustchange the sequence number of the action to place it to the correct locationin the sequence.If there is an action depends on the execution of another action in thesequence, one of the two actions must be re-placed in the action sequence byupdating the action sequence number so that the dependent action alwaysgets executed first.Where can I get more information?Microsoft Platform SDK ICE27

    ICE28What does ICE28 check?ICE28 is commonly used to validate that the ForceReboot action (if used) isplaced before or after, and never within, a specific group of actions in theaction sequence tables (i.e., AdminUISequence, AdminExecuteSequence,InstallUISequence, InstallExecuteSequence).When does ICE28 show up?ICE28 posts an error message if ForceReboot is sequenced within thespecified action group.How can I fix ICE28?The ForceReboot action must come between InstallInitialize andInstallFinalize in the action sequence of the InstallExecuteSequence table.The following actions commonly occur together as a group in the actionsequence. It is recommended that the ForceReboot action be scheduled tocome after this group. If the ForceReboot action is scheduled before theRegisterProduct action, the installer again requires the source of theinstallation package after the restart. Therefore, the preferred sequence forForceReboot is immediately following this action sequence.RegisterProductRegisterUserPublishProductPublishFeatures

  • 8/7/2019 ICE Errors and Resolutions

    18/49

    CreateShortcutsRegisterMIMEInfoRegisterExtensionInfoRegisterClassInfoRegisterProgIdInfoWhere can I get more information?Microsoft Platform SDK ICE28ICE29What does ICE29 check?MSI file is designed as a Win32 OLE structured storage and handling of streams by the Win32 OLE structured storage implementation limits streamnames. The installer can compress stream names up to 62 characters inlength. Names longer than this are truncated. ICE29 validates that truncatedstream names remain unique. Any table having a Binary or Object column isvalidated.When does ICE29 show up?ICE29 posts an error if truncated stream names do not remain unique.How can I fix ICE29?You must change the truncated stream name to a unique name to fix thiserror.Where can I get more information?Microsoft Platform SDK ICE29ICE30What does ICE30 check?ICE30 validates that the installation of components containing the same filenever installs the file more than once in the same directory. ICE30 checksboth long file names (LFN) and short file names (SFN).ICE30 can detect file collisions due to directories with the same property intheir paths, but does not detect collisions resulting from two propertieshaving the same value due to possible change of a property value at run-time.

    When does ICE30 show up?ICE30 posts an error message for each pair of components that installs thesame file to the same directory.How can I fix ICE30?Unless two (or more) components have mutually exclusive conditions, theymust not install the same file to the same location. Doing so will break thecomponent reference counting system.In order to fix ICE30, you should either conditionalize both components ormake sure that components install the file to different targets.Where can I get more information?Microsoft Platform SDK ICE30ICE31What does ICE31 check?ICE31 checks if the font styles used in controls on dialogs are defined in MSI.It also validates that the DefaultUIFont property refers to a valid font style.The DefaultUIFont property sets the default font style used for controls.Controls can have a predefined font style. To set the font and font style of atext string, you need to prefix the string of displayed characters with {\style}or {&style}. Where style is an identifier listed in the TextStyle column of theTextStyle table. If neither of these are present, but the DefaultUIFontproperty is defined as a valid text style, that font will be used.ICE31 checks the Text column for each control in the Control Table to verifies

  • 8/7/2019 ICE Errors and Resolutions

    19/49

    that a valid entry exist in the TextStyle table.When does ICE31 show up?ICE31 posts an error message for undefined styles, style names that are toolong, a missing TextStyle table, and style tags with no closing brace.ICE31 posts a warning if the style tag is not at the beginning of the line, or if a control has multiple style tagsHow can I fix ICE31?If the error is because of an undefined style, a style record has to be enteredin TextStyle table.If the error is due to a long style name, you will need to shorten the name sothat it can contain less than 72 characters. A style that is over 72 chars andtherefore cannot possibly be a style even if somehow you did manage to getit in the TextStyle table.If the error is because of the missing TextStyle table, it has to be added tothe MSI and then style records have to be added to the table.If the error is due to a style tag with no closing brace, a closing brace has tobe added to the Text column of the control record in Control table.If ICE31 posts a warning because of a style tag not at the beginning of theline, the tag has to be replaced to the beginning of the line under the Textcolumn of the control record in Control table.If ICE31 posts a warning due to multiple style tags, only one of the tags haveto be left by removing the others from the Text column of the control recordin Control table.Where can I get more information?Microsoft Platform SDK ICE31ICE32What does ICE32 check?ICE32 validates that keys and foreign keys in the .msi file are of the samesize and column definition types. This ICE custom action makes thecomparison using the _Validation table and using the definition types that arereturned by MsiViewGetColumnInfo.

    When does ICE32 show up?ICE32 posts errors if the .msi file contains any foreign keys to keys of adifferent column length or column data type.How can I fix ICE32?If the foreign key and key defined differ in size, you should change the datatype length to match.If there is a foreign key and key defined that differ in their definition types,the foreign key and key pairs must be defined so that their data types match.Note: As long as you use a good MSI template to start with and do notmanually add any extra custom tables to the database, you should never seeany ICE32 errors.Where can I get more information?Microsoft Platform SDK ICE32ICE33What does ICE33 check?ICE33 validates that the all the entries in the Registry table belong in thattable.Even though Registry table is used to create/edit registry keys on the targetmachine, it is not the only table used to do this task. Registry keys thatregister Classes, Filename Extensions, ProgIDs, Shell Verbs, Remote ServerAppIDs, MIME types, or Typelibs are considered as special keys because theycan be used as advertised entry points to the application. Maximizing the

  • 8/7/2019 ICE Errors and Resolutions

    20/49

    number of advertised entry points to the application increases the chancesthat the application can trigger self-repair in a situation where the applicationis expected to fail. Technically entering these special registry keys to Registrytable does not create any problems as far as the application functionalitiesand the setup are concerned. These special keys will still be registered bymeans of Registry table. However, Windows Installer service will not considerthese keys as advertised entry points to the application. Hence, they will notbe able to trigger self-repair if needed. Use of Extension, ProgId, Verb, MIME,Class, Typelib and AppId tables provides the extra benefit by maximizingyour potential for self-healing.The other disadvantage of keeping ICE33 warnings in your MSI package isthe fact that you will not be able to fully advertise your product if you want toutilize advertising features of Windows Installer. That means, installation-on-demand will be limited to only advertised shortcuts but not other entry pointssuch as file extensions or MIME types. That is because advertising simplyputs down the advertised entry points to the target machine and postponesthe rest of the installation to a time that the application is somehow triggeredby an advertised entry point. If Registry table is used to store those entrypoints such as file extensions, they will not show up during advertisement.They will only show up when the application is fully installed.When does ICE33 show up?ICE33 issues a warning for each Registry table entry that should be movedand suggests the appropriate table. ICE33 posts warnings for any entries thatregister Classes, Filename Extensions, ProgIDs, Shell Verbs, Remote ServerAppIDs, MIME types, or Typelibs.How can I fix ICE33?The fix is to move those special registry entries to the table(s) suggested bythe warning. However, unless you are very familiar with registry as well asthe application, it is not recommended to move them especially in arepackaging situation. Taking such an action without much familiarity withregistry and the application can cause more problems with your MSI package.

    Extensions, ProgIds, Verbs, and MIME types must be registered through theirrespective Extension, ProgId, Verb, MIME tables to support advertisementand install-on-demand. Entries in the Registry table are not written to theregistry until the component controlling the value is installed to run Locally orto Run From Source. This precludes the advertisement of componentsregistered through the Registry table. It also precludes install-on-demand forany feature or product requiring the component because advertisement is theonly way install-on-demand is available through the Windows Shell.For Windows 2000, COM Classes must be registered through the Class tableto advertise CLSID Contexts and for install-on-demand.Note that the tables available cannot handle all possible COM registration. Inthese cases an author should enter as much information as possible into tothe individual tables and the remaining information into the Registry table. Acommon authoring error that must be avoided in this case is that of duplicating an entry in both a COM table and in the Registry table.It is easier to manage registry keys if they are listed in the appropriate tablesrather than being mixed together into the Registry tables. The values in theTypelib and AppId tables are registered when the component controlling thevalue is installed to run Locally or From Source. These tables are provided forthe convenience of setup authors.Where can I get more information?Microsoft Platform SDK ICE33

  • 8/7/2019 ICE Errors and Resolutions

    21/49

    ICE34What does ICE34 check?ICE34 validates that each radio button on every RadioButtonGroup Controlhas a property in the Property column of the RadioButton table that specifiesits radio button group. ICE34 validates that this property exists and is set toa default value in the Property table which is equal to one of the group's radiobutton values in the Value column of the RadioButton table.A radio button group must have a default for users to be able to select achoice using the TAB key. This is required for proper user accessibility.Property used for a RadioButtonGroup control keeps the selection made bythe user.ICE34 also reports missing tables.When does ICE34 show up?ICE34 post an error message if there is a radio button that does not have aproperty or specifies an invalid property.How can I fix ICE34?To fix the errors reported by this ICE34, you need to check the following: Every RadioButton control entry without the indirect attribute set has aproperty listed in the Property column. Every such property has at least one corresponding entry in theRadioButton table. Every such property is defined in the Property table, with a value that isone of the choices from the RadioButton table. Every property referenced in the Property column of a RadioButtoncontrol with the indirect attribute set is defined in the Property table.Where can I get more information?Microsoft Platform SDK ICE34ICE35What does ICE35 check?ICE35 validates that components containing compressed files stored in acabinet file are not set to run from source. With Windows Installer 2.0 or

    later, this restriction has been removed.ICE35 queries the Cabinet column of the Media table to determine which filesare compressed and stored in a cabinet file. It queries the File table todetermine which components contain these files. Finally, it checks theComponent table to determine whether the run-from-source bits are set inthe Attributes column.When does ICE35 show up?ICE35 posts an error message if there is a compressed file stored in a cabinetfile belonging to a component which is set to run from source. With WindowsInstaller 2.0 or later, this is changed from an error to a warning message.ICE35 posts warning message if there is a compressed file stored in a cabinetfile belonging to a component which is set to run locally or from source. Thiswarning message has been removed with Windows Installer 2.0 and later.How can I fix ICE35?To fix this error/warning you must change the bit set in the Attributes columnof the Component table so that it will be set to run locally, or remove the filefrom the CAB file.Where can I get more information?Microsoft Platform SDK ICE35ICE36 What does ICE36 check?ICE36 checks if the package contains unused icons that reduces the installerperformance. ICE36 validates that every icon in the Icon table is listed at

  • 8/7/2019 ICE Errors and Resolutions

    22/49

    least once in the ARPPRODUCTICON property or the Class, ProgId, orShortcut tables.During advertisement, the installer installs all the icons listed in the Icontable on the user's computer. Having unused icons in the Icon table does notprevent the installation from running, however it does unnecessarily increasethe size of the .msi file and the time and space required to advertise afeature.When does ICE36 show up?ICE36 posts a message if there is an icon in the Icon table that is notreferenced in the Class, ProgId, or Shortcut tables and if there is no UIprovided to create such a reference at run time.How can I fix ICE36?If an icon is not referenced in the property or table and there is no UIprovided to create a reference at run time, you should remove the icon toachieve better performance.Where can I get more information?Microsoft Platform SDK ICE36

    ICE38What does ICE38 check?ICE38 validates that every component being installed under the currentuser's profile also specifies a registry key under the HKEY_CURRENT_USERroot in the KeyPath column of the Component table.In a roaming user profiles scenario where the application is installed foreveryone, windows installer must take care of re-installing the user specificresources such as HKCU keys for the new user who did not originally installthe application. Since key paths are verified and self healing is initiated (if necessary) when the application is launched through an advertised entrypoint, the way to get the user specific data back for a new user is to make anHKCU key as the key path of a component that installs the user data.When does ICE38 show up?

    ICE38 posts an error if a component installed under the user's profile doesnot specify a HKCU registry key.How can I fix ICE38? If a component with a file key path, installs to user profile, it must use aregistry key under HKCU as its Key Path, not a file. To fix this error on thecomponent, change the component key path type to registry key path andset the key path to a HKCU key. If a component with a key path value set to NULL, installs to user profile,it must use a registry key under HKCU as its Key Path, not NULL. To fix thiserror on the component, change the component key path type to registry keypath and set the key path to a HKCU key. If a component with a registry key path value set to a HKLM registry key,installs to user profile, it must use a registry key under HKCU as its Key Path,not a HKLM registry key. To fix this error on the component, set the key pathto a HKCU key. If a component with a registry key path value set as NULL, installs touser profile, it must use a registry key under HKCU as its Key Path, not NULL.To fix this error on the component, set the key path to a HKCU key. If the Registry entry referenced in the KeyPath column of the componentwas found and lies under the HKCU tree, but the registry entry's Component_column does not refer back to the same component that listed it as theKeyPath, this means that the registry entry used as the KeyPath of the

  • 8/7/2019 ICE Errors and Resolutions

    23/49

    component would only be created when some other component was installed.To fix this error change the KeyPath value to refer to a registry entry thatbelongs to the component, or change the registry entry to belong to thecomponent using it as a KeyPath.Where can I get more information?Microsoft Platform SDK ICE38ICE39What does ICE39 check?ICE39 validates the Summary Information Stream of the database.ICE39 checks the format of the Word Count Summary Property, Page CountSummary Property, Template Summary Property, Revision Number SummaryProperty, Create Time/Date Summary Property, Last Saved Time/DateSummary Property, and Last Printed Summary Property.When does ICE39 show up?If the Word Count Summary Property specifies that the source iscompressed, ICE39 posts a warning if any files are also marked ascompressed in the Attributes column of the File table.ICE39 also posts a warning if the properties specified above do not follow theformat specified in Windows Installer SDK.How can I fix ICE39?If the warning is due to a data format problem, check the specific propertyexplanation and update the value entered as a value based on the propertyvalue format.Where can I get more information?Microsoft Platform SDK ICE39ICE40What does ICE40 check?ICE40 does the following miscellaneous validation: ICE40 checks if the .msi file is missing the Error table and the PageCount Summary Property is less than or equal to 100. This means that theinstaller is only capable of displaying numeric error codes to the user at run

    time. The Error table is only required in packages having a schema that isless than or equal to 100. Windows Installer versions 1.1 and later do notrequire the package to have an Error table because the error messages canalso be retrieved using Msimsg.dll. Packages with a schema greater than 100cannot be installed by Windows Installer version 1.0. ICE40 checks if the REINSTALLMODE property has been overridden. ICE40 also checks if the RemoveIniFile table has a Delete Tag entry withno value.When does ICE40 show up? ICE40 posts an error if the .msi file is missing the Error table and thePage Count Summary Property is less than or equal to 100. ICE40 posts an error if REINSTALLMODE property is defined in theProperty table. ICE40 posts an error if there is a Delete Tag action in the in theRemoveIniFile column of the RemoveIniFile table without specifying a tag todelete in the Value column.How can I fix ICE40? If the .msi file is missing the Error table and the Page Count SummaryProperty is less than or equal to 100, add an Error table to the installationpackage and author formatting templates in the Message column for errormessages. If REINSTALLMODE property is defined in the Property table, remove it

  • 8/7/2019 ICE Errors and Resolutions

    24/49

    from the Property table. Defining the REINSTALLMODE property in .msi filecan lead to unexpected behavior. If there is a Delete Tag action in the in the RemoveIniFile column of theRemoveIniFile table without specifying a tag to delete in the Value column,add a tag to delete in the Value column of RemoveIniFile table for thatspecific record.Where can I get more information?Microsoft Platform SDK ICE40ICE41What does ICE41 check?ICE41 checks if the package contains any feature that does not contain thecomponent implementing the class object or extension. If the packagecontains such a feature, the installer does not install the component with thefeature and that advertising may not work as expected.ICE41 validates that the entries in the Class and Extension tables refer toentries in the Component table that implement the class object or extension of the component.When does ICE41 show up?ICE41 posts an error if there is a feature that does not contain thecomponent implementing the class object or extension.How can I fix ICE41? If the error is due to an extension, change the entry in the Feature_column of the Extension table entry to reference a feature that installs thecomponent listed in the Component_ column or change the feature andcomponent associated in the FeatureComponents table. If the error is because of a class entry, change the entry in the Feature_column of the Class table entry to reference a feature that installs componentlisted in the Component_ column or change the feature and componentassociated in the FeatureComponents table.Where can I get more information?Microsoft Platform SDK ICE41

    ICE42What does ICE42 check?ICE42 validates that InProc servers are not linked to EXE files in the Classtable. EXE files cannot be InProc servers.ICE42 also validates that only LocalServer and LocalServer32 classes havearguments and DefInProc values.When does ICE42 show up?ICE42 posts an error if there are InProc servers linked to EXE files in theClass table.How can I fix ICE42? If CLSID specified in the Class table is an InProc server, but theimplementing component has an EXE as its key path, change the key pathfile. If Context column of the Class table for a CLSID record is set to'InProcServer32' and the record has an argument under Argument column,remove the argument. Only LocalServer contexts can have arguments. If CLSID in context 'InProcServer32' species a default InProc value,remove the DeflnProc value or change the context of the class. OnlyLocalServer contexts can have default InProc values.Where can I get more information?Microsoft Platform SDK ICE42ICE43

  • 8/7/2019 ICE Errors and Resolutions

    25/49

    What does ICE43 check?ICE43 validates that shortcuts that do not reference a feature as their Target(non-advertised shortcuts) are in components having a HKCU registry entryas their key path.Leaving ICE43 errors in the package causes non-advertised shortcuts in theproblem component to be installed for the first user on the computer ONLY.Users who install the component later do not see the shortcuts because thecomponent appears to the installer as already existing on the computer.When does ICE43 show up?ICE43 posts an error message if a non-advertised shortcut is in a componentthat does not have a HKCU registry entry as its key path.How can I fix ICE43? If a component has non-advertised shortcuts, and its key path is set to afile, reset the key path with a registry key under HKCU. If a component has non-advertised shortcuts, and its key path is set toNULL, reset the key path with a registry key under HKCU. If a component has non-advertised shortcuts, and its key path is set to aregistry key other than keys under HKCU, reset the key path with a registrykey under HKCU. If a component has non-advertised shortcuts, and its key path is set to aregistry key under HKCU but not listed in the Registry table, create the entryin the Registry table. If a registry entry is set as the key path for a component, but thatregistry entry doesn't belong to the same component, the registry entry usedas the key path of the component is only created if some other componentwas installed. To fix this error, change the key path value to refer to aregistry entry that belongs to the component or change the registry entry tobelong to the component using it as a key path.Where can I get more information?Microsoft Platform SDK ICE43ICE44

    What does ICE44 check?ICE44 validates that the NewDialog, SpawnDialog, and SpawnWaitDialogControlEvents reference valid dialog boxes in the Dialog table.When does ICE44 show up?ICE44 posts an error message if there is a dialog control event that does notreference a dialog box listed in the Dialog table.How can I fix ICE44?If the control event for a control on a dialog is set to NewDialog, orSpawnDialog, or SpawnWaitDialog, the argument must be set to a validdialog box in the Dialog table.To fix ICE44, add an argument that is a key in the Dialog Table.Where can I get more information?Microsoft Platform SDK ICE44ICE45What does ICE45 check?ICE45 validates that bit field columns in the database do not set any reservedbits to 1.Reserved bits provide no functionality in current versions of the installer, butmight in future versions. They should be set to 0 to be compatible with futureversions of Windows Installer.When does ICE45 show up?ICE45 posts an error message if any of the following tables contains a bit

  • 8/7/2019 ICE Errors and Resolutions

    26/49

  • 8/7/2019 ICE Errors and Resolutions

    27/49

    ICE48 checks for directories that are hard-coded to local paths in theProperty table.When does ICE48 show up?ICE48 posts an error message if there is a directory that is hard-coded to alocal path in the Property table.How can I fix ICE48?Do NOT hard-code directory paths to local drives because computers differ inthe setup of the local drive. This practice may be acceptable if deploying anapplication to a large number of computers on which the relevant portions of the drives are all the same.Where can I get more information?Microsoft Platform SDK ICE48ICE49What does ICE49 check?ICE49 checks for default registry entries that are not a REG_SZ type.When does ICE49 show up?ICE49 posts an error if there is a default registry entry that is not a REG_SZtype.On Windows 95 computers, default registry entries (those with no name) canonly be REG_SZ values. On Windows 98 and Windows NT/Windows 2000systems, default values can be of any type. Components with non-REG_SZdefault values are valid, as long as they are never installed on a Win95computer. If they are, an error is generated at install time.How can I fix ICE49?To fix this error, make installation of the component conditional upon thetarget not being a Windows 95 computer, or change the value to typeREG_SZ.Where can I get more information?Microsoft Platform SDK ICE49ICE50What does ICE50 check?

    ICE50 checks that shortcut icons are specified to display correctly and matchtheir target file's extension.When does ICE50 show up?ICE50 posts an error message if the extension of the icon and target files donot match. ICE50 posts a warning if icons are stored in files that do not havean .exe or .ico extension.How can I fix ICE50? If the extensions of the icon and the target file do not match, theshortcut will not have the correct context menu when the component isadvertised. To fix this error, rename the icon to match the extension of thetarget file. Some versions of the shell incorrectly display icons stored in files that donot have extensions of "exe" or "ico". To fix this warning, rename the iconhave an extension of "exe" or "ico".Where can I get more information?Microsoft Platform SDK ICE50ICE51What does ICE51 check?ICE51 checks for TTC/TTF fonts that have titles and other fonts that aremissing titles.When does ICE51 show up?ICE51 posts an error or warning if there are any TTC/TTF fonts with titles or

  • 8/7/2019 ICE Errors and Resolutions

    28/49

    other fonts missing titles.How can I fix ICE51?You must specify a title for fonts that do not have embedded names.TTF/TTC fonts have the title of the font embedded in the file itself. Do notspecify a title for these fonts because the font is then registered twice, onceunder the supplied name and again under the embedded name.Where can I get more information?Microsoft Platform SDK ICE51ICE52What does ICE52 check?ICE52 checks for private properties in the AppSearch table.The AppSearch table contains properties needed to search for a file having aparticular file signature. The AppSearch table can also be used to set aproperty to the existing value of a registry or .ini file entry.When using Windows 2000 all properties set in the Property column of theAppSearch table must be public properties.Note: Private property names must include lowercase letters. However, publicproperty names cannot contain lowercase letters.When does ICE52 show up?ICE52 posts a warning if there is a private property in the AppSearch table.How can I fix ICE52?To fix this warning change the private property found in the AppSearch tableto a custom public property.Where can I get more information?Microsoft Platform SDK ICE52ICE53What does ICE53 check?ICE53 checks for entries in the Registry table that write private installerinformation or policy values to the system registry.When does ICE53 show up?ICE53 posts a warning if the Registry table specifies writing internal or policy

    information to the registry.How can I fix ICE53?The package should not specify any system policy value in the registry.System policies should be configured without an installer package.Note: Windows Installer specific system policy values can be found underHKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\InstallerWhere can I get more information?Microsoft Platform SDK ICE53ICE54What does ICE54 check?ICE54 checks for components that use a companion file as their key path.When does ICE54 show up?ICE54 posts a warning if any component has a key path file that derives itsversion from another file.How can I fix ICE54?The key path file of a component must not derive its version from a differentfile. This can cause some files to fail to install. To fix this warning, change thekey path of the component to another file whose version is not derived froma different file and found in the same component.Note: For companion files, the Version field of the File table can be set tocontain the primary key of another record in the File table. The referenced filethen determines the versioning logic for this file.

  • 8/7/2019 ICE Errors and Resolutions

    29/49

    Where can I get more information?Microsoft Platform SDK ICE54ICE55What does ICE55 check?ICE55 validates that all LockPermission objects exist and have validpermission values.Note: The LockPermissions table is used to secure individual portions of yourapplication in a locked-down environment. It can be used to set permissionson installation of files, registry keys, and created folders for specificusers/groups.When does ICE55 show up?ICE55 post an error if a LockObject listed in the LockPermissions table doesnot exist or if no privilege level is specified in the Permission column.How can I fix ICE55? If there is an object record in the LockPermission without a permissionvalue, specify a numeric value in Permission column. If no privileges areneeded for this object then you should remove the row. If an object described in the LockPermissions table is not listed in theappropriate table (i.e., File, Registry, CreateFolder), refer to a valid object.Where can I get more information?Microsoft Platform SDK ICE55ICE56What does ICE56 check?ICE56 validates that the directory structure of the .msi file has a single rootdirectory, that the root is the TARGETDIR property, and that the SourceDirproperty value is in the DefaultDir column of the Directory table.If a .msi file has multiple roots or specifies a root other than TARGETDIR, anadministrative installation does not create a correct administrative image.Note: Empty directories are not checked by ICE56. The directory structurepasses validation with multiple root directories if the extra directories areempty.

    When does ICE56 show up?ICE56 posts an error if the .msi does not have a single root, TARGETDIR, or if SourceDir is not specified in the DefaultDir column of the Directory table.How can I fix ICE56? If directory TARGETDIR has a bad DefaultDir value, change theDefaultDir value to SourceDir or SOURCEDIR . It may be possible to make TARGETDIR the parent of the second root, and use the '.'value in the DefaultDir column. If there is a root directory other than TARGETDIR set toSourceDir or SOURCEDIR , remove the second root dir ectory.The Directory structure should have only one root called TARGETDIR.Where can I get more information?Microsoft Platform SDK ICE56ICE57What does ICE57 check?ICE57 validates that individual components do not mix per-machine and per-user data. This ICE custom action checks registry entries, files, directory keypaths, and non-advertised shortcuts.Mixing per-user and per-machine data in the same component could result inonly partial installation of the component for some users in a multi-userenvironment. For example, after the installation for everyone on the samemachine, a new user may not be able to get per-user data due to the poor

  • 8/7/2019 ICE Errors and Resolutions

    30/49

    design of components. This can lead to application run-time problems.When does ICE57 show up?ICE57 posts an error if it finds any component that contains both a per-machine and per-user registry entries, files, directory key paths, or non-advertised shortcuts.How can I fix ICE57?To fix ICE57 errors, reorganize the application such that each componentcontains only per-user or per-machine resources, and not both.Where can I get more information?Microsoft Platform SDK ICE57ICE58What does ICE58 check?ICE58 checks that your Media table does not have more than 80 rows.When does ICE58 show up?ICE58 posts a warning if the package contains more than 80 rows in theMedia table and the package's Page Count Summary Property is less than150.Warnings reported by ICE58 cause the installation to FAIL unless the packageis installed with Windows Installer version 2.0 or later. Beginning withWindows Installer version 2.0, the restriction to more than 80 media tableentries is removed. No warning is issued if the package's Page CountSummary Property is greater than or equal to 150. Packages of schema 200or higher can only be installed by Windows Installer version 2.0 or later.How can I fix ICE58?To fix this error, eliminate any unused media table entries, consolidate mediatable entries that refer to the same media, and repackage your application toreduce the media required.Note: If the target machines are known to have Windows Installer version2.0 or later, ICE58 can be safely ignored.Where can I get more information?Microsoft Platform SDK ICE58

    ICE59What does ICE59 check?ICE59 checks that advertised shortcuts belong to components that areinstalled by the target feature of the shortcut.Target of an advertised shortcut must point to a valid feature and thecomponent it refers to must be part of the target feature.Errors reported by ICE59 generally lead to the following behavior:The advertised shortcut will launch the Windows Installer to install thefeature listed in the Target column. But because the FeatureComponentstable does not map the target feature to the component containing theshortcut, the keyfile of the component (which is activated by the shortcut) isnot installed. Therefore the shortcut is broken and will not do anything.When does ICE59 show up?ICE59 posts an error if an advertised shortcut does not belong to thecomponents that are installed by the target feature of the shortcut.How can I fix ICE59?If there is no mapping between the target feature of an advertised shortcutand the component it refers to (in the FeatureComponents table), add a rowto the FeatureComponents table so that target feature of the advertisedshortcut is associated with the component that advertised shortcut belongs.Where can I get more information?Microsoft Platform SDK ICE59

  • 8/7/2019 ICE Errors and Resolutions

    31/49

    ICE60What does ICE60 check?ICE60 checks that files in the File table meet the following condition: If the file is not a font and has a version, then it must have a language. ICE60 checks that no versioned files are listed in the MsiFileHash table.Failure to fix a warning reported by ICE60 generally leads to a file beingneedlessly reinstalled when a product repair is done. This happens becausethe file to be installed in the repair and the existing file on disk have thesame version (they are the same file) but different languages. The file tablelists the language as null, but the file itself has a language value in theresource. Based on the file versioning rules, the installer favors the file to beinstalled, so it is recopied needlessly.When does ICE60 show up? ICE60 posts a warning or an error if a file in the File table that is not afont and has a version, does not have a language. ICE60 posts an error if a file listed in the MsiFileHash table is versioned.How can I fix ICE60? If ICE60 shows up due to a missing language code, add a language tothe file in the File table. Files should have language values stored in theversion resource whenever possible. If a file is language neutral, use theLANGID 0. If a versioned file is listed in the MsiFileHash table, remove the recordfrom the table.Where can I get more information?Microsoft Platform SDK ICE60ICE61What does ICE61 check?ICE61 checks the upgrade table to ensure that the following conditions aretrue: All ActionProperty properties are not pre-authored in the Property table. All ActionProperty properties are Public Properties.

    All ActionProperty properties are included in the SecureCustomPropertiesproperty (i.e., they are restricted public properties). All ActionProperty properties are unique to each record in the Upgradetable. All VersionMax values are not less than the corresponding VersionMinvalues. No attempt is made to remove a newer or equal version of the currentproduct.Failure to fix a warning or error reported by ICE61 generally leads toproblems in upgrading your application. Depending on the exact error, thiscould be anything from leaving files from the older version behind, deletingfiles from the older version even though they are needed by the newapplication, or complete failure of the upgrade.When does ICE61 show up?ICE61 posts a warning or error if any of the above conditions are not true.How can I fix ICE61? If the VersionMax value in the Upgrade table is NOT less than theproduct version in the Property table (i.e., ProductVersion), the installer willtry to remove the product of the same version or higher. To fix this error, usea version in the VersionMax column lower than the current version specifiedin the Property table. Remove the Include maximum version option if Maximum Version is equal to the current version. If the intent is only to

  • 8/7/2019 ICE Errors and Resolutions

    32/49

    detect the product and not remove it, specifying Detect Only will also fix this error. If the ActionProperty is not listed in the SecureCustomPropertiesproperty, the property is not passed to the server side of the install when theproperty is found. To fix this error, add the property toSecureCustomProperties (i.e., make it a restricted public property). If the ActionProperty contains lowercase letters, edit the property nameto have all uppercase letters. Upgrade properties must be public propertiesfor the result to be passed to the server side of the installation. If the same ActionProperty is used for more than one record of theUpgrade table, use a different property for the second record. A property canonly be used in one row of the Upgrade table. If Upgrade.VersionMax is less than Upgrade.VersionMin, update theVersionMax value to be higher than VersionMin. The minimum version mustbe less than the maximum version.Where can I get more information?Microsoft Platform SDK ICE61ICE62What does ICE62 check?ICE62 performs extensive checks on the IsolatedComponent table for datathat may cause unexpected behavior.IsolatedComponents table is used to specify that the installer copy the sharedfiles (commonly shared DLLs) of an application into that application's folderrather than to a shared location. This private set of files (DLLs) are then usedonly by the application. Isolating the application together with its sharedcomponents in this manner has the following advantages: The application always uses the versions of the shared files with which itwas deployed. Installing the application does not overwrite other versions of the sharedfiles by other applications. Subsequent installations of other applications using different versions of

    the shared files cannot overwrite the files used by this application.Failure to fix an error reported by ICE62 can result in a failure of the isolatedcomponent system in a wide variety of ways. For example, if the shared DLLreference counter is not incremented for a shared component, theregistration for the component could be removed when another applicationuses that ComponentId and is uninstalled.When does ICE62 show up?ICE62 posts a warning or error when it finds data in the IsolatedComponenttable that may produce unexpected behavior.How can I fix ICE62? If an isolated application component does not have a file key path, use adifferent component as the application for the isolated component. Anisolated application component must provide a valid executable path to useto isolate the component. If an isolated shared component is not set to increment shared DLLreference counter, update the component to increment the shared DLLcounter. Not solving this problem can result in the lifetime of the componentbeing incorrect. If another application uses this component (isolated or not)and is uninstalled, the registration for the component is removed but thisapplication's isolated copy remains. This causes repair and uninstallproblems. If an isolated shared component contains a condition that may be

  • 8/7/2019 ICE Errors and Resolutions

    33/49

    evaluated too FALSE during the lifetime of an installation on a computer, theisolated component could be orphaned without registration information. To fixthis warning, remove the condition, or author the condition so that it cannever change from TRUE to FALSE. If an isolated shared component is shared by two or more componentsthat belong to different features and are installed to the same directory,install the components to different directories or check whether some of thecomponents truly require an isolated component. If a feature containing one of the application components is removed theshared component is removed as well. This causes the other feature havingapplication components to lose the isolated component.Where can I get more information?Microsoft Platform SDK ICE62

    ICE63What does ICE63 check?ICE63 checks for proper sequencing of the RemoveExistingProducts action.Note: The RemoveExistingProducts action goes through the product codeslisted in the Upgrade column of the Upgrade table and removes the productsin sequence by invoking nested installations. For each nested installation theinstaller sets the ProductCode property to the product code and sets theREMOVE property to the value in the Remove field of the Upgrade table. If the Remove field is blank, its value defaults to ALL and the installer removesthe entire product.The RemoveExistingProducts action has sequence restrictions and may beplaced: Between InstallValidate and InstallInitialize Immediately after InstallInitialize, or after InstallInitialize if the actionsbetween InstallInitialize and RemoveExistingProducts do not generate anyscript actions.

    Immediately after InstallExecute or InstallExecuteAgain and beforeInstallFinalize (the same restriction as above applies). After InstallFinalize.Failure to fix a warning or error reported by ICE63 leads to failure of theupgrade.When does ICE63 show up?ICE63 posts a warning or error if the sequencing of theRemoveExistingProducts action is not correct.How can I fix ICE63?To fix ICE63, verify resequence the actions based on sequence restrictions of RemoveExistingProducts action.Where can I get more information?Microsoft Platform SDK ICE63ICE64What does ICE64 check?ICE64 checks that new directories in the user profile