The ICM branch in the registry is under the following key:
\\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ICM
The ICM key can have a SubstList subkey value, an array of pairs of manufacturer and model identifiers as described in "Profile Substitutions."
The ICM key has the following subkey branches:
\ICM\ICMatchers - color matcher ID to color matcher DLL file names \mntr - monitor profiles \ptrt - printer profiles \scnr - scanner profiles \link - defined in the ICC spec, unused by Windows \spac - defined in the ICC spec, unused by Windows \abst - defined in the ICC spec, unused by Windows
The last three keys are not used by GDI to find matching profiles for output devices. There is no substructure for these keys; they contain the names of profiles only. The scnr key has the substructure of manufacturer and model subkeys. The names of the profiles are in the model subkey. Windows installs profile names there, but does not look in the key for any reason.
The mntr key is structured by manufacturer and model identifiers. If the manufacturer key value is "none," there is no model subkey. The key might look like the following example:
\mntr\NEC \4FG \profile00 = c:\windows\system\color\nec.icm \profile01 = c:\windows\system\color\nec1.icm \5FG \profile00 = c:\windows\system\color\nec5fg.icm \HITA\34YU\profile00 = c:\windows\system\color\hitachi.icm \none\profile00 = c:\windows\system\color\mnebu18.icm \profile01 = c:\windows\system\color\mnebu21.icm
The \prtr key has more subkeys to track more printing variables. The subkeys, in order, are manufacturer, model, media, dither, and resolution. The key might look like the following example:
\prtr\EPSO\788D\107\ErrorDiffusion\00360x00360\profile00=epsonsty.icm \HP \7645\MediaUnknown\DitherUnknown\ResolutionUnknown\profile00=hp.icm
These entries get built from information in the ICC profiles when they are installed. The installation process begins with the profile being opened and memory mapped in. First, the class of the profile is read; that determines the kind of device that the profile is for, such as prtr or link. Let us assume for the rest of this discussion that a prtr is being installed. A prtr key is created. The 4-byte icHeader.manufacturer value is then read, and a key is created for it. A value is added to this key, which is the text equivalent of this key (for example, ManufacturerTag = Epson). This string is also pulled from the profile deviceMfgDescTag. The 4-byte icHeader.model value is read, a key created for it, and the text string corresponding added as a value (for example, ModelTag = Color Stylus). This string is also pulled from the profile deviceModelDescTag.
The 4-byte MS01 tag, which gives the media type, is read. For standard media types, the corresponding name is used; otherwise, a text string for the value is used. A key is created for it, but no values are added. If this tag does not exist, the default is MediaUnknown.
The 4-byte MS02 tag, which gives the dither type, is read. For standard dither types, the corresponding name is used; otherwise, a text string for the value is used. A key is created for it, but no values are added. If this tag does not exist, the default is DitherUnknown.
The 8-byte MS03 tag , which gives the X and Y resolution in pixels per inch, is read. A key is created for it. If this tag does not exist, the default is ResolutionUnknown. Finally, the filename of the ICC profile is added as a value of the kind profileXX=profilename.icm. Of course, profiles could exist that match in these tags and yet differ in additional tags, such as lighting conditions or line frequency. This is why one might expect multiple profiles at the end of the chain. There might be one more value here as well, default=profileXX. In the case of multiple profiles, this is the one GDI will pick to match.