1<?xml version="1.0"?> 2<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 3 4 <?define EventSourceName = "chromoting" ?> 5 <?define ServiceName = "chromoting" ?> 6 7 <!-- TODO(alexeypa): There strings should be localized, 8 see http://crbug.com/121785 --> 9 <?if $(var.Branding) ~= Chrome ?> 10 <?define ChromotingHost = "Chrome Remote Desktop Host" ?> 11 <?define ChromotingServiceName = "Chrome Remote Desktop Service" ?> 12 <?define ChromotingServiceDescription = "This service enables incoming connections from Chrome Remote Desktop clients." ?> 13 <?define Manufacturer = "Google Inc." ?> 14 <?else?> 15 <?define ChromotingHost = "Chromoting Host" ?> 16 <?define ChromotingServiceName = "Chromoting Service" ?> 17 <?define ChromotingServiceDescription = "This service enables incoming connections from Chromoting clients." ?> 18 <?define Manufacturer = "The Chromium Authors" ?> 19 <?endif?> 20 21 <?define FirewallName = "$(var.ChromotingHost)" ?> 22 23 <?define OmahaAppid = "{b210701e-ffc4-49e3-932b-370728c72662}" ?> 24 <?define UpgradeCode = "2b21f767-e157-4fa6-963c-55834c1433a6" ?> 25 26 <?define CoreBinary = "remoting_core.dll" ?> 27 <?define HostBinary = "remoting_host.exe" ?> 28 29 <?define ChromotingTypelib = "{b6396c45-b0cc-456b-9f49-f12964ee6df4}" ?> 30 31 <!-- AppIDs used by the COM components. --> 32 <?define ControllerAppid = "{4ff35d5e-d226-4550-9248-03e7779e67de}" ?> 33 <?define RdpAppid = "{52e6fd1a-f16e-49c0-aacb-5436a915448b}" ?> 34 35 <?define ControllerClass = "ElevatedController Class" ?> 36 <?define ControllerProgid = 37 "ChromotingElevatedController.ElevatedController" ?> 38 39 <?define IRdpDesktopSessionId = "{6a7699f0-ee43-43e7-aa30-a6738f9bd470}" ?> 40 <?define IRdpDesktopSessionEventHandlerId = 41 "{b59b96da-83cb-40ee-9b91-c377400fc3e3}" ?> 42 43 <!-- 44 The long hex value(s) below are security descriptors generated from SDDL 45 definition using the PowerShell script below: 46 47 $sddl = "<SDDL definition goes here>" 48 $i = ([wmiclass]"Win32_SecurityDescriptorHelper").SDDLToBinarySD($sddl).BinarySD 49 -join ($i | foreach {$_.ToString("X2")}) 50 --> 51 52 <!-- 53 A security descriptor that gives SYSTEM, built-in administrators and 54 LocalService accounts COM_RIGHTS_EXECUTE, COM_RIGHTS_EXECUTE_LOCAL, and 55 COM_RIGHTS_ACTIVATE_LOCAL rights. It specifies a mandatory label that 56 specifies "no execute up" policy for medium integrity level. 57 58 $sddl = "O:BAG:BAD:(A;;0xb;;;SY)(A;;0xb;;;BA)(A;;0xb;;;LS)S:(ML;;NX;;;ME)" 59 --> 60 <?define RdpSd = "010014807800000088000000140000003000000002001C000100000011001400040000000101000000000010002000000200480003000000000014000B000000010100000000000512000000000018000B00000001020000000000052000000020020000000014000B0000000101000000000005130000000102000000000005200000002002000001020000000000052000000020020000" ?> 61 62 <!-- Verify that all required parameters are defined. --> 63 <?ifndef ControllerClsid ?> 64 <?error ControllerClsid must be defined ?> 65 <?endif?> 66 67 <?ifndef RdpDesktopSessionClsid ?> 68 <?error RdpDesktopSessionClsid must be defined ?> 69 <?endif?> 70 71 <?ifndef Version ?> 72 <?error Version must be defined ?> 73 <?endif?> 74 75 <Product Id="*" 76 Language="1033" 77 Manufacturer="$(var.Manufacturer)" 78 Name="$(var.ChromotingHost)" 79 UpgradeCode="$(var.UpgradeCode)" 80 Version="$(var.Version)"> 81 82 <Package Comments="$(var.ChromotingHost) Package" 83 Compressed="yes" 84 Description="$(var.ChromotingHost) Package" 85 InstallerVersion="200" 86 Manufacturer="$(var.Manufacturer)" 87 InstallScope="perMachine"/> 88 89 <Condition 90 Message="$(var.ChromotingHost) is only supported on Windows XP, Windows Server 2003, or higher."> 91 <![CDATA[Installed OR (VersionNT >= 501)]]> 92 </Condition> 93 94 <!-- The upgrade rules below could be expressed with MajorUpgrade element. 95 Unfortunately, there is a bug in WiX decompiler (Dark) corrupting 96 InstallExecuteSequence table. The installation compiled from 97 the disassembled .msi schedules RemoveExistingProducts after 98 InstallFinalize while the original installation schedules it after 99 InstallInitialize. Fortunately, the verbose version of the upgrade 100 rules below decompiles correctly, so we use it instead. 101 See http://crbug.com/145265 for more details. 102 --> 103 <Upgrade Id="$(var.UpgradeCode)"> 104 <UpgradeVersion IncludeMinimum="no" 105 Minimum="$(var.Version)" 106 OnlyDetect="yes" 107 Property="NEWERVERSIONDETECTED" /> 108 <UpgradeVersion IncludeMaximum="yes" 109 IncludeMinimum="yes" 110 Maximum="$(var.Version)" 111 Minimum="0.0.0.0" 112 Property="OLDERVERSIONBEINGUPGRADED" /> 113 <!-- Detect versions that didn't handle the usagestats value properly. --> 114 <UpgradeVersion IncludeMaximum="yes" 115 IncludeMinimum="yes" 116 Maximum="24.0.1312.29" 117 Minimum="0.0.0.0" 118 Property="BROKENUSAGESTATSVERSION" /> 119 </Upgrade> 120 121 <Condition Message="A later version of [ProductName] is already installed. Setup will now exit."> 122 NOT NEWERVERSIONDETECTED 123 </Condition> 124 125 <Media Id="1" Cabinet="chromoting.cab" EmbedCab="yes"/> 126 127 <Directory Id="TARGETDIR" Name="SourceDir"> 128 <Directory Id="ProgramFilesFolder"> 129 <?if $(var.OfficialBuild) != 0 ?> 130 <Directory Id="program_files_google" Name="Google"> 131 <Directory Id="chromoting" Name="Chrome Remote Desktop"> 132 <Directory Id="binaries" Name="$(var.Version)"/> 133 </Directory> 134 </Directory> 135 <?else?> 136 <Directory Id="chromoting" Name="Chromoting"> 137 <Directory Id="binaries" Name="$(var.Version)"/> 138 </Directory> 139 <?endif?> 140 </Directory> 141 <Directory Id="CommonAppDataFolder"> 142 <?if $(var.OfficialBuild) != 0 ?> 143 <Directory Id="common_app_data_google" Name="Google"> 144 <Directory Id="config_files" Name="Chrome Remote Desktop"/> 145 </Directory> 146 <?else?> 147 <Directory Id="config_files" Name="Chromoting"/> 148 <?endif?> 149 </Directory> 150 </Directory> 151 152 <DirectoryRef Id="binaries"> 153 <Component Id="sas" Guid="*"> 154 <File Id="sas.dll" 155 DiskId="1" 156 Name="sas.dll" 157 Vital="yes"/> 158 </Component> 159 160 <Component Id="remoting_core" Guid="*"> 161 <File Id="$(var.CoreBinary)" 162 DiskId="1" 163 KeyPath="yes" 164 Name="$(var.CoreBinary)" 165 Vital="yes"/> 166 167 <util:EventSource xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" 168 Name="$(var.EventSourceName)" 169 Log="Application" 170 CategoryCount="1" 171 CategoryMessageFile="[#$(var.CoreBinary)]" 172 EventMessageFile="[#$(var.CoreBinary)]" 173 SupportsErrors="yes" 174 SupportsInformationals="yes"/> 175 </Component> 176 177 <Component Id="remoting_desktop" Guid="*"> 178 <File Id="remoting_desktop.exe" 179 DiskId="1" 180 KeyPath="yes" 181 Name="remoting_desktop.exe" 182 Vital="yes"/> 183 </Component> 184 185 <Component Id="remoting_host" Guid="*"> 186 <File Id="remoting_host.exe" 187 DiskId="1" 188 Name="remoting_host.exe" 189 Vital="yes"/> 190 191 <ServiceInstall Id="install_service" 192 Type="ownProcess" 193 Vital="yes" 194 Name="$(var.ServiceName)" 195 DisplayName="[chromoting_service_display_name]" 196 Description="[chromoting_service_description]" 197 Arguments="--type=daemon --host-config="[config_files]host.json"" 198 Start="demand" 199 Account="LocalSystem" 200 ErrorControl="ignore" 201 Interactive="no"> 202 <!-- Configure the service to restart after one minute when it 203 crashes. 204 --> 205 <util:ServiceConfig 206 xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" 207 FirstFailureActionType="restart" 208 ResetPeriodInDays="1" 209 RestartServiceDelayInSeconds="60" 210 SecondFailureActionType="restart" 211 ThirdFailureActionType="restart"/> 212 </ServiceInstall> 213 214 <ServiceControl Id="start_service" 215 Stop="both" 216 Remove="uninstall" 217 Name="$(var.ServiceName)" 218 Wait="yes" /> 219 220 <fire:FirewallException xmlns:fire="http://schemas.microsoft.com/wix/FirewallExtension" 221 Id="me2me_firewall_exception" 222 IgnoreFailure="yes" 223 Name="$(var.FirewallName)" 224 Profile="all" 225 Program="[#remoting_host.exe]" 226 Scope="any" /> 227 </Component> 228 229 <?if $(var.OfficialBuild) != 0 ?> 230 <Component Id="omaha_registration" Guid="*"> 231 <RegistryKey Id="omaha_client_key" 232 Root="HKLM" 233 Key="SOFTWARE\Google\Update\Clients\$(var.OmahaAppid)" 234 Action="create"> 235 <RegistryValue Type="string" 236 Name="pv" 237 Value="$(var.Version)"/> 238 239 <RegistryValue Type="string" 240 Name="name" 241 Value="$(var.ChromotingHost)"/> 242 </RegistryKey> 243 </Component> 244 <?endif?> 245 246 <Component Id="remoting_lib" Guid="*"> 247 <RegistryKey Root="HKLM" 248 Key="SOFTWARE\Classes"> 249 <RegistryKey Key="AppId"> 250 <RegistryKey Key="$(var.ControllerAppid)" Action="create"> 251 <RegistryValue Type="string" 252 Value="ChromotingElevatedController"/> 253 </RegistryKey> 254 255 <RegistryKey Key="$(var.RdpAppid)" Action="create"> 256 <RegistryValue Type="string" 257 Value="ChromotingRdpDesktopSession"/> 258 <RegistryValue Name="AccessPermission" 259 Type="binary" 260 Value="$(var.RdpSd)"/> 261 <RegistryValue Name="LaunchPermission" 262 Type="binary" 263 Value="$(var.RdpSd)"/> 264 <RegistryValue Name="RunAs" 265 Type="string" 266 Value="NT AUTHORITY\LocalService"/> 267 </RegistryKey> 268 269 </RegistryKey> 270 271 <RegistryKey Key="$(var.ControllerProgid)" Action="create"> 272 <RegistryValue Type="string" 273 Value="$(var.ControllerClass)"/> 274 275 <RegistryKey Key="CLSID" Action="create"> 276 <RegistryValue Type="string" 277 Value="$(var.ControllerClsid)"/> 278 </RegistryKey> 279 280 <RegistryKey Key="CurVer" Action="create"> 281 <RegistryValue Type="string" 282 Value="$(var.ControllerProgid).$(var.Version)"/> 283 </RegistryKey> 284 </RegistryKey> 285 286 <RegistryKey Key="$(var.ControllerProgid).$(var.Version)" 287 Action="create"> 288 <RegistryValue Type="string" 289 Value="$(var.ControllerClass)"/> 290 291 <RegistryKey Key="CLSID" Action="create"> 292 <RegistryValue Type="string" 293 Value="$(var.ControllerClsid)"/> 294 </RegistryKey> 295 </RegistryKey> 296 297 <RegistryKey Key="CLSID"> 298 <RegistryKey Key="$(var.ControllerClsid)" Action="create"> 299 <RegistryValue Type="string" 300 Value="$(var.ControllerClass)"/> 301 302 <RegistryValue Type="string" 303 Name="AppID" 304 Value="$(var.ControllerAppid)"/> 305 306 <RegistryValue Type="string" 307 Name="LocalizedString" 308 Value="@[binaries]$(var.CoreBinary),-103"/> 309 310 <RegistryKey Key="LocalServer32" Action="create"> 311 <RegistryValue Type="string" 312 Value="[binaries]$(var.HostBinary) --type=controller"/> 313 </RegistryKey> 314 315 <RegistryKey Key="ProgID" Action="create"> 316 <RegistryValue Type="string" 317 Value="$(var.ControllerProgid).$(var.Version)"/> 318 </RegistryKey> 319 320 <RegistryKey Key="TypeLib" Action="create"> 321 <RegistryValue Type="string" 322 Value="$(var.ChromotingTypelib)"/> 323 </RegistryKey> 324 325 <RegistryKey Key="VersionIndependentProgID" Action="create"> 326 <RegistryValue Type="string" 327 Value="$(var.ControllerProgid)"/> 328 </RegistryKey> 329 330 <RegistryKey Key="Elevation" Action="create"> 331 <RegistryValue Type="integer" 332 Name="Enabled" 333 Value="1"/> 334 <RegistryValue Type="string" 335 Name="IconReference" 336 Value="@[binaries]$(var.CoreBinary),-104"/> 337 </RegistryKey> 338 </RegistryKey> 339 <RegistryKey Key="$(var.RdpDesktopSessionClsid)" Action="create"> 340 <RegistryValue Type="string" 341 Value="RdpDesktopSession Class"/> 342 343 <RegistryValue Type="string" 344 Name="AppID" 345 Value="$(var.RdpAppid)"/> 346 347 <RegistryKey Key="LocalServer32" Action="create"> 348 <RegistryValue Type="string" 349 Value="[binaries]$(var.HostBinary) --type=rdp_desktop_session"/> 350 </RegistryKey> 351 352 <RegistryKey Key="TypeLib" Action="create"> 353 <RegistryValue Type="string" 354 Value="$(var.ChromotingTypelib)"/> 355 </RegistryKey> 356 </RegistryKey> 357 358 <!-- IRdpDesktopSession PSFactory --> 359 <RegistryKey Key="$(var.IRdpDesktopSessionId)" 360 Action="create"> 361 <RegistryValue Type="string" 362 Value="IRdpDesktopSession PSFactory"/> 363 364 <RegistryKey Key="InprocServer32" Action="create"> 365 <RegistryValue Type="string" 366 Value="[binaries]$(var.CoreBinary)"/> 367 </RegistryKey> 368 </RegistryKey> 369 370 <!-- IRdpDesktopSessionEventHandler PSFactory --> 371 <RegistryKey Key="$(var.IRdpDesktopSessionEventHandlerId)" 372 Action="create"> 373 <RegistryValue Type="string" 374 Value="IRdpDesktopSessionEventHandler PSFactory"/> 375 376 <RegistryKey Key="InprocServer32" Action="create"> 377 <RegistryValue Type="string" 378 Value="[binaries]$(var.CoreBinary)"/> 379 </RegistryKey> 380 </RegistryKey> 381 </RegistryKey> 382 383 <RegistryKey Key="Interface"> 384 <!-- IDaemonControl2 interface --> 385 <RegistryKey Key="{655bd819-c08c-4b04-80c2-f160739ff6ef}" 386 Action="create"> 387 <RegistryKey Key="ProxyStubClsid32" Action="create"> 388 <RegistryValue Type="string" 389 Value="{00020424-0000-0000-C000-000000000046}"/> 390 </RegistryKey> 391 392 <RegistryKey Key="TypeLib" Action="create"> 393 <RegistryValue Type="string" 394 Value="$(var.ChromotingTypelib)"/> 395 </RegistryKey> 396 </RegistryKey> 397 398 <!-- IDaemonControl interface --> 399 <RegistryKey Key="{e051a481-6345-4ba1-bdb1-cf7929955268}" 400 Action="create"> 401 <RegistryKey Key="ProxyStubClsid32" Action="create"> 402 <RegistryValue Type="string" 403 Value="{00020424-0000-0000-C000-000000000046}"/> 404 </RegistryKey> 405 406 <RegistryKey Key="TypeLib" Action="create"> 407 <RegistryValue Type="string" 408 Value="$(var.ChromotingTypelib)"/> 409 </RegistryKey> 410 </RegistryKey> 411 412 <!-- IRdpDesktopSession interface --> 413 <RegistryKey Key="$(var.IRdpDesktopSessionId)" 414 Action="create"> 415 <RegistryValue Type="string" 416 Value="IRdpDesktopSession"/> 417 <RegistryKey Key="ProxyStubClsid32" Action="create"> 418 <RegistryValue Type="string" 419 Value="$(var.IRdpDesktopSessionId)"/> 420 </RegistryKey> 421 </RegistryKey> 422 423 <!-- IRdpDesktopSessionEventHandler interface --> 424 <RegistryKey Key="$(var.IRdpDesktopSessionEventHandlerId)" 425 Action="create"> 426 <RegistryValue Type="string" 427 Value="IRdpDesktopSessionEventHandler"/> 428 <RegistryKey Key="ProxyStubClsid32" Action="create"> 429 <RegistryValue Type="string" 430 Value="$(var.IRdpDesktopSessionEventHandlerId)"/> 431 </RegistryKey> 432 433 <RegistryKey Key="TypeLib" Action="create"> 434 <RegistryValue Type="string" 435 Value="$(var.ChromotingTypelib)"/> 436 </RegistryKey> 437 </RegistryKey> 438 </RegistryKey> 439 440 <RegistryKey Key="Typelib"> 441 <RegistryKey Key="$(var.ChromotingTypelib)" Action="create"> 442 <RegistryKey Key="1.0" Action="create"> 443 <RegistryValue Type="string" 444 Value="Chromoting 1.0 Type Library"/> 445 <RegistryKey Key="0" Action="create"> 446 <RegistryKey Key="win32" Action="create"> 447 <RegistryValue Type="string" 448 Value="[binaries]$(var.CoreBinary)"/> 449 </RegistryKey> 450 </RegistryKey> 451 452 <RegistryKey Key="FLAGS" Action="create"> 453 <RegistryValue Type="string" 454 Value="0"/> 455 </RegistryKey> 456 457 <RegistryKey Key="HELPDIR" Action="create"> 458 <RegistryValue Type="string" 459 Value="[binaries]"/> 460 </RegistryKey> 461 </RegistryKey> 462 </RegistryKey> 463 </RegistryKey> 464 </RegistryKey> 465 466 </Component> 467 468 <!-- Register with Sawbuck. See http://code.google.com/p/sawbuck/. --> 469 <Component Id="sawbuck_provider" Guid="*"> 470 <RegistryKey Root="HKLM" 471 Key="SOFTWARE\Google\Sawbuck\Providers"> 472 <RegistryKey Key="{2db51ca1-4fd8-4b88-b5a2-fb8606b66b02}" 473 Action="create"> 474 <RegistryValue Type="string" Value="Chromoting"/> 475 <RegistryValue Name="default_flags" Type="integer" Value="1"/> 476 <RegistryValue Name="default_level" Type="integer" Value="4"/> 477 <RegistryKey Key="Flags" Action="create"> 478 <RegistryKey Key="Stack Trace" Action="create"> 479 <RegistryValue Type="integer" Value="1"/> 480 </RegistryKey> 481 <RegistryKey Key="Text Only" Action="create"> 482 <RegistryValue Type="integer" Value="2"/> 483 </RegistryKey> 484 </RegistryKey> 485 </RegistryKey> 486 </RegistryKey> 487 </Component> 488 489 <!-- Delete the usagestats flag to reset the crash dump reporting settings 490 for existing users. --> 491 <Component Id="delete_usagestats" 492 Guid="5c73f2b9-b865-426f-81cc-90a27ebb54aa" 493 KeyPath="yes"> 494 <Condition>BROKENUSAGESTATSVERSION</Condition> 495 <RemoveRegistryValue 496 Id="usagestats" 497 Key="SOFTWARE\Google\Update\ClientStateMedium\$(var.OmahaAppid)" 498 Name="usagestats" 499 Root="HKLM" /> 500 </Component> 501 502 </DirectoryRef> 503 504 <DirectoryRef Id="config_files"> 505 <!-- Delete debug.log from previous versions --> 506 <Component Id="delete_debug_log" 507 Guid="b309082a-e6fa-4dc7-98e4-3d83c896561d"> 508 <RemoveFile Id="debug.log" 509 Name="debug.log" 510 On="both" /> 511 </Component> 512 </DirectoryRef> 513 514 <!-- The service is always installed in the stopped state with start type 515 set to 'manual'. This becomes a problem when upgrading an existing 516 installation that is configured to start the service automatically. 517 518 Here we check the startup type before making any changes, then restart 519 the service and change its startup type as needed once the installation 520 is finished. --> 521 <Property Id="CHROMOTING_SERVICE_START_TYPE"> 522 <RegistrySearch Id="chromoting_service_start_type" 523 Root="HKLM" 524 Key="SYSTEM\CurrentControlSet\services\$(var.ServiceName)" 525 Name="Start" 526 Type="raw" /> 527 </Property> 528 529 <CustomAction Id="query_auto_start_service" 530 Property="auto_start_service" 531 Value="[CHROMOTING_SERVICE_START_TYPE]" /> 532 533 <CustomAction Id="set_auto_start_service" 534 Impersonate="no" 535 Execute="deferred" 536 Script="jscript"> 537 <![CDATA[ 538 var controller = new ActiveXObject("$(var.ControllerProgid)"); 539 controller.StartDaemon(); 540 ]]> 541 </CustomAction> 542 543 <CustomAction Id="set_service_display_name" 544 Property="chromoting_service_display_name" 545 Value="@[binaries]$(var.CoreBinary),-101" /> 546 <CustomAction Id="set_service_description" 547 Property="chromoting_service_description" 548 Value="@[binaries]$(var.CoreBinary),-102" /> 549 550 <!-- XP does not support MUI strings in the service name and description, so 551 we fall back to plain strings on XP. --> 552 <CustomAction Id="set_service_display_name_xp" 553 Property="chromoting_service_display_name" 554 Value="$(var.ChromotingServiceName)" /> 555 <CustomAction Id="set_service_description_xp" 556 Property="chromoting_service_description" 557 Value="$(var.ChromotingServiceDescription)" /> 558 559 <UIRef Id="WixUI_ErrorProgressText" /> 560 561 <Feature Id="chromoting_host" Level="1" Title="$(var.ChromotingHost)"> 562 <ComponentRef Id="delete_debug_log"/> 563 <ComponentRef Id="delete_usagestats"/> 564 <?if $(var.OfficialBuild) != 0 ?> 565 <ComponentRef Id="omaha_registration"/> 566 <?endif?> 567 <ComponentRef Id="remoting_core"/> 568 <ComponentRef Id="remoting_desktop"/> 569 <ComponentRef Id="remoting_host"/> 570 <ComponentRef Id="remoting_lib"/> 571 <ComponentRef Id="sas"/> 572 <ComponentRef Id="sawbuck_provider"/> 573 </Feature> 574 575 <!-- Set the icon shown in Add/Remove Programs. --> 576 <Icon Id="chromoting.ico" SourceFile="chromoting.ico"/> 577 <Property Id="ARPPRODUCTICON" Value="chromoting.ico" /> 578 579 <InstallExecuteSequence> 580 <Custom Action="query_auto_start_service" Before="InstallInitialize"/> 581 <Custom Action="set_auto_start_service" After="StartServices"> 582 <![CDATA[NOT REMOVE AND (auto_start_service = "#2")]]> 583 </Custom> 584 585 <!-- Set the serivce name and description --> 586 <Custom Action="set_service_display_name_xp" Before="InstallInitialize"> 587 <![CDATA[VersionNT < 600]]> 588 </Custom> 589 <Custom Action="set_service_description_xp" Before="InstallInitialize"> 590 <![CDATA[VersionNT < 600]]> 591 </Custom> 592 <Custom Action="set_service_display_name" Before="InstallInitialize"> 593 <![CDATA[VersionNT >= 600]]> 594 </Custom> 595 <Custom Action="set_service_description" Before="InstallInitialize"> 596 <![CDATA[VersionNT >= 600]]> 597 </Custom> 598 599 <!-- Schedule RemoveExistingProducts before installing any files. 600 See http://msdn.microsoft.com/en-us/library/aa371197.aspx. --> 601 <RemoveExistingProducts After="InstallInitialize" /> 602 </InstallExecuteSequence> 603 </Product> 604</Wix> 605