title: Odd MSI Component Rules
body: <p>I have an installer that doesn't seem to be following MSI component rules at install time.  Here's the scenario:</p>
  
  <p>OS: Windows 7 x64</p>
  
  <p>Product A installs a set of files attached to a component with guid "123ABC" into C:\Program Files\Common Files\Foo.  The component has the following files:<br>
  foo.dll, version 1.0.0.0, (KeyPath)<br>
  foo.sys, version 1.0.0.0<br>
  foo.inf, no version<br>
  foo.cat, no version<br></p>
  
  <p>Product B installs the same set of files attached to the same component guid "123ABC" into the same path C:\Program Files\Common Files\Foo.  The component has the following files:<br>
  foo.dll, version 1.0.0.1, (KeyPath)<br>
  foo.sys, version 1.0.0.0<br>
  foo.inf, no version<br>
  foo.cat, no version<br></p>
  
  <p>Product A is installed first, and product B does not perform an upgrade of product A, they just share a common MSM that contains the component "123ABC".  My expectation is that when product B is installed, MSI will compare the keypath versions of foo.dll and determine that product B's foo.dll is newer.  Then all four files associated with component "123ABC" will overwrite the existing files on disk that were installed by product A.  This is not happening :(  Instead, this is the resulting fileset:<br>
  C:\Program Files\Common Files\Foo<br>
  foo.dll, version 1.0.0.1 (From product B)<br>
  foo.sys, version 1.0.0.0 (From product A)<br>
  foo.inf, no version (From product A)<br>
  foo.cat, no version (From product B)<br></p>
  
  <p>Only the dll and the cat file are overwritten.  From the msi log file I can see the following:</p>
  
  <pre><code>MSI (s) (4C:F0) [17:29:24:227]: File: C:\Program Files\Common Files\Foo\foo.dll;    Overwrite;  Won't patch;    Existing file is a lower version
  MSI (s) (4C:F0) [17:29:24:305]: File: C:\Program Files\Common Files\Foo\foo.sys;    Won't Overwrite;    Won't patch;    Existing file is of an equal version
  MSI (s) (4C:F0) [17:29:24:305]: File: C:\Program Files\Common Files\Foo\foo.inf;    Won't Overwrite;    Won't patch;    Existing file is unversioned and unmodified - hash matches source file
  MSI (s) (4C:F0) [17:29:24:335]: File: C:\Program Files\Common Files\Foo\foo.cat;    Overwrite;  Won't patch;    Existing file is unversioned and unmodified - hash doesn't match source file
  </code></pre>
  
  <p>I thought MSI components installed all associated files based on whether or not the keypath is to be installed.  What could cause every file associated with the same component to be individually compared?</p>