Bug 899363 - Implement stub installer data ping version 6. r=bbondy, a=lsblakk
authorRobert Strong <robert.bugzilla@gmail.com>
Fri, 28 Mar 2014 11:54:42 -0700
changeset 192401 1e065473e9c806ddeaf181166e534c577d474c99
parent 192400 84dbc0d6ae9048c98ea1bd7896c5694ff044bca3
child 192402 fc24c0662fbd72a660e53d2b89d0b2ed235a31d7
push id474
push userasasaki@mozilla.com
push dateMon, 02 Jun 2014 21:01:02 +0000
treeherdermozilla-release@967f4cf1b31c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbbondy, lsblakk
bugs899363
milestone30.0a2
Bug 899363 - Implement stub installer data ping version 6. r=bbondy, a=lsblakk
browser/installer/windows/nsis/stub.nsi
toolkit/mozapps/installer/windows/nsis/overrides.nsh
--- a/browser/installer/windows/nsis/stub.nsi
+++ b/browser/installer/windows/nsis/stub.nsi
@@ -84,35 +84,33 @@ Var StartLastDownloadTickCount
 Var DownloadFirstTransferSeconds
 ; The last four tick counts are for the end of a phase in the installation page.
 ; the options phase when it isn't entered.
 Var EndDownloadPhaseTickCount
 Var EndPreInstallPhaseTickCount
 Var EndInstallPhaseTickCount
 Var EndFinishPhaseTickCount
 
-Var IntroPageShownCount
-Var OptionsPageShownCount
 Var InitialInstallRequirementsCode
 Var ExistingProfile
 Var ExistingVersion
 Var ExistingBuildID
 Var DownloadedBytes
 Var DownloadRetryCount
 Var OpenedDownloadPage
 Var DownloadServerIP
 
 Var ControlHeightPX
 Var ControlRightPX
 
 ; Uncomment the following to prevent pinging the metrics server when testing
 ; the stub installer
 ;!define STUB_DEBUG
 
-!define StubURLVersion "v5"
+!define StubURLVersion "v6"
 
 ; Successful install exit code
 !define ERR_SUCCESS 0
 
 /**
  * The following errors prefixed with ERR_DOWNLOAD apply to the download phase.
  */
 ; The download was cancelled by the user
@@ -190,22 +188,28 @@ Var ControlRightPX
 !define ProgressbarMarqueeIntervalMS 10
 
 ; On Vista and above attempt to elevate Standard Users in addition to users that
 ; are a member of the Administrators group.
 !define NONADMIN_ELEVATE
 
 !define CONFIG_INI "config.ini"
 
-!define MAX_PATH 260
-
-!define FILE_SHARE_READ 1
-!define GENERIC_READ 0x80000000
-!define OPEN_EXISTING 3
-!define INVALID_HANDLE_VALUE -1
+!ifndef FILE_SHARE_READ
+  !define FILE_SHARE_READ 1
+!endif
+!ifndef GENERIC_READ
+  !define GENERIC_READ 0x80000000
+!endif
+!ifndef OPEN_EXISTING
+  !define OPEN_EXISTING 3
+!endif
+!ifndef INVALID_HANDLE_VALUE
+  !define INVALID_HANDLE_VALUE -1
+!endif
 
 !include "nsDialogs.nsh"
 !include "LogicLib.nsh"
 !include "FileFunc.nsh"
 !include "WinVer.nsh"
 !include "WordFunc.nsh"
 
 !insertmacro GetParameters
@@ -231,16 +235,17 @@ Var ControlRightPX
 !endif
 !endif
 
 !include "common.nsh"
 
 !insertmacro ElevateUAC
 !insertmacro GetLongPath
 !insertmacro GetPathFromString
+!insertmacro GetParent
 !insertmacro GetSingleInstallPath
 !insertmacro GetTextWidthHeight
 !insertmacro IsUserAdmin
 !insertmacro OnStubInstallUninstall
 !insertmacro SetBrandNameVars
 !insertmacro UnloadUAC
 
 VIAddVersionKey "FileDescription" "${BrandShortName} Stub Installer"
@@ -341,49 +346,16 @@ Function .onInit
 
   ; Require elevation if the user can elevate
   ${ElevateUAC}
 
   ${If} ${AtLeastWinVista}
     System::Call 'user32::SetProcessDPIAware()'
   ${EndIf}
 
-  ; Create a mutex to prevent multiple launches of the same stub installer in
-  ; the same location on the file system. This intentionally won't handle the
-  ; case where someone runs multiple copies of the stub on the file system but
-  ; it does handle the important case which is a user launching the same stub
-  ; multiple times.
-  StrCpy $1 "$EXEPATH"
-  ; Backslashes are illegal in a mutex name so replace all occurences of a
-  ; backslash with a forward slash.
-  ${WordReplace} "$1" "\" "/" "+" $1
-  StrLen $2 "$1"
-
-  ; The lpName parameter for CreateMutexW is limited to MAX_PATH characters so
-  ; use the characters at the end since they are more likely to be unique.
-  ${If} $2 > ${MAX_PATH}
-    StrCpy $1 "$1" ${MAX_PATH} -${MAX_PATH}
-  ${EndIf}
-  System::Call "kernel32::CreateMutexW(i 0, i 0, w '$1') i .r0 ?e"
-  Pop $0
-
-  ${Unless} $0 == 0
-    ; The mutex is specific to this executable's path so we should be able to
-    ; find the Window with the same caption as this executable's and bring that
-    ; window to the front. This could find another instance of the same
-    ; executable but that is an uninteresting edge case.
-    FindWindow $1 "#32770" "$(WIN_CAPTION)" 0
-    ${If} $1 != 0
-      ; Restore the window if it is minimized and make it the foreground window
-      System::Call "user32::ShowWindow(i r1, i ${SW_RESTORE}) i."
-      System::Call "user32::SetForegroundWindow(i r1) i."
-    ${EndIf}
-    Abort
-  ${EndUnless}
-
   SetShellVarContext all ; Set SHCTX to HKLM
   ${GetSingleInstallPath} "Software\Mozilla\${BrandFullNameInternal}" $R9
 
   ${If} "$R9" == "false"
     SetShellVarContext current ; Set SHCTX to HKCU
     ${GetSingleInstallPath} "Software\Mozilla\${BrandFullNameInternal}" $R9
   ${EndIf}
 
@@ -393,33 +365,33 @@ Function .onInit
 
   ; Used to determine if the default installation directory was used.
   StrCpy $InitialInstallDir "$INSTDIR"
 
   ClearErrors
   WriteRegStr HKLM "Software\Mozilla" "${BrandShortName}InstallerTest" \
                    "Write Test"
 
+  ; Only display set as default when there is write access to HKLM and on Win7
+  ; and below.
   ${If} ${Errors}
   ${OrIf} ${AtLeastWin8}
     StrCpy $CanSetAsDefault "false"
     StrCpy $CheckboxSetAsDefault "0"
   ${Else}
     DeleteRegValue HKLM "Software\Mozilla" "${BrandShortName}InstallerTest"
     StrCpy $CanSetAsDefault "true"
   ${EndIf}
 
   ; Initialize the majority of variables except those that need to be reset
   ; when a page is displayed.
   StrCpy $IntroPhaseSeconds "0"
   StrCpy $OptionsPhaseSeconds "0"
   StrCpy $EndPreInstallPhaseTickCount "0"
   StrCpy $EndInstallPhaseTickCount "0"
-  StrCpy $IntroPageShownCount "0"
-  StrCpy $OptionsPageShownCount "0"
   StrCpy $InitialInstallRequirementsCode ""
   StrCpy $IsDownloadFinished ""
   StrCpy $FirefoxLaunchCode "0"
   StrCpy $CheckboxShortcutOnBar "1"
   StrCpy $CheckboxShortcutInStartMenu "1"
   StrCpy $CheckboxShortcutOnDesktop "1"
   StrCpy $CheckboxSendPing "1"
 !ifdef MOZ_MAINTENANCE_SERVICE
@@ -561,19 +533,27 @@ Function SendPing
 !endif
 
     ${If} ${RunningX64}
       StrCpy $R1 "1"
     ${Else}
       StrCpy $R1 "0"
     ${EndIf}
 
-    ${WinVerGetMajor} $R2
-    ${WinVerGetMinor} $R3
-    ${WinVerGetBuild} $R4
+    ; Though these values are sometimes incorrect due to bug 444664 it happens
+    ; so rarely it isn't worth working around it by reading the registry values.
+    ${WinVerGetMajor} $5
+    ${WinVerGetMinor} $6
+    ${WinVerGetBuild} $7
+    ${WinVerGetServicePackLevel} $8
+    ${If} ${IsServerOS}
+      StrCpy $9 "1"
+    ${Else}
+      StrCpy $9 "0"
+    ${EndIf}
 
     ${If} "$ExitCode" == "${ERR_SUCCESS}"
       ReadINIStr $R5 "$INSTDIR\application.ini" "App" "Version"
       ReadINIStr $R6 "$INSTDIR\application.ini" "App" "BuildID"
     ${Else}
       StrCpy $R5 "0"
       StrCpy $R6 "0"
     ${EndIf}
@@ -596,58 +576,129 @@ Function SendPing
       DeleteRegValue HKLM "Software\Mozilla" "${BrandShortName}InstallerTest"
       StrCpy $R8 "1"
     ${EndIf}
 
     ${If} "$DownloadServerIP" == ""
       StrCpy $DownloadServerIP "Unknown"
     ${EndIf}
 
+    StrCpy $R2 ""
+    SetShellVarContext current ; Set SHCTX to the current user
+    ReadRegStr $R2 HKCU "Software\Classes\http\shell\open\command" ""
+    ${If} $R2 != ""
+      ${GetPathFromString} "$R2" $R2
+      ${GetParent} "$R2" $R3
+      ${GetLongPath} "$R3" $R3
+      ${If} $R3 == $INSTDIR
+        StrCpy $R2 "1" ; This Firefox install is set as default.
+      ${Else}
+        StrCpy $R2 "$R2" "" -11 # length of firefox.exe
+        ${If} "$R2" == "${FileMainEXE}"
+          StrCpy $R2 "2" ; Another Firefox install is set as default.
+        ${Else}
+          StrCpy $R2 "0"
+        ${EndIf}
+      ${EndIf}
+    ${Else}
+      StrCpy $R2 "0" ; Firefox is not set as default.
+    ${EndIf}
+
+    ${If} "$R2" == "0"
+    ${AndIf} ${AtLeastWinVista}
+      ; Check to see if this install location is currently set as the default
+      ; browser by Default Programs which is only available on Vista and above.
+      ClearErrors
+      ReadRegStr $R3 HKLM "Software\RegisteredApplications" "${AppRegName}"
+      ${Unless} ${Errors}
+        AppAssocReg::QueryAppIsDefaultAll "${AppRegName}" "effective"
+        Pop $R3
+        ${If} $R3 == "1"
+          StrCpy $R3 ""
+          ReadRegStr $R2 HKLM "Software\Classes\http\shell\open\command" ""
+          ${If} $R2 != ""
+            ${GetPathFromString} "$R2" $R2
+            ${GetParent} "$R2" $R3
+            ${GetLongPath} "$R3" $R3
+            ${If} $R3 == $INSTDIR
+              StrCpy $R2 "1" ; This Firefox install is set as default.
+            ${Else}
+              StrCpy $R2 "$R2" "" -11 # length of firefox.exe
+              ${If} "$R2" == "${FileMainEXE}"
+                StrCpy $R2 "2" ; Another Firefox install is set as default.
+              ${Else}
+                StrCpy $R2 "0"
+              ${EndIf}
+            ${EndIf}
+          ${Else}
+            StrCpy $R2 "0" ; Firefox is not set as default.
+          ${EndIf}
+        ${EndIf}
+      ${EndUnless}
+    ${EndIf}
+
+    ${If} $CanSetAsDefault == "true"
+      ${If} $CheckboxSetAsDefault == "1"
+        StrCpy $R3 "2"
+      ${Else}
+        StrCpy $R3 "3"
+      ${EndIf}
+    ${Else}
+      ${If} ${AtLeastWin8}
+        StrCpy $R3 "1"
+      ${Else}
+        StrCpy $R3 "0"
+      ${EndIf}
+    ${EndIf}
+
 !ifdef STUB_DEBUG
     MessageBox MB_OK "${BaseURLStubPing} \
                       $\nStub URL Version = ${StubURLVersion}${StubURLVersionAppend} \
                       $\nBuild Channel = ${Channel} \
                       $\nUpdate Channel = ${UpdateChannel} \
                       $\nLocale = ${AB_CD} \
                       $\nFirefox x64 = $R0 \
                       $\nRunning x64 Windows = $R1 \
-                      $\nMajor = $R2 \
-                      $\nMinor = $R3 \
-                      $\nBuild = $R4 \
+                      $\nMajor = $5 \
+                      $\nMinor = $6 \
+                      $\nBuild = $7 \
+                      $\nServicePack = $8 \
+                      $\nIsServer = $9 \
                       $\nExit Code = $ExitCode \
                       $\nFirefox Launch Code = $FirefoxLaunchCode \
                       $\nDownload Retry Count = $DownloadRetryCount \
                       $\nDownloaded Bytes = $DownloadedBytes \
+                      $\nDownload Size Bytes = $DownloadSizeBytes \
                       $\nIntroduction Phase Seconds = $IntroPhaseSeconds \
                       $\nOptions Phase Seconds = $OptionsPhaseSeconds \
                       $\nDownload Phase Seconds = $0 \
                       $\nLast Download Seconds = $1 \
                       $\nDownload First Transfer Seconds = $DownloadFirstTransferSeconds \
                       $\nPreinstall Phase Seconds = $2 \
                       $\nInstall Phase Seconds = $3 \
                       $\nFinish Phase Seconds = $4 \
-                      $\nIntro Page Shown Count = $IntroPageShownCount \
-                      $\nOptions Page Shown Count = $OptionsPageShownCount \
                       $\nInitial Install Requirements Code = $InitialInstallRequirementsCode \
                       $\nOpened Download Page = $OpenedDownloadPage \
                       $\nExisting Profile = $ExistingProfile \
                       $\nExisting Version = $ExistingVersion \
                       $\nExisting Build ID = $ExistingBuildID \
                       $\nNew Version = $R5 \
                       $\nNew Build ID = $R6 \
                       $\nDefault Install Dir = $R7 \
                       $\nHas Admin = $R8 \
+                      $\nDefault Status = $R2 \
+                      $\nSet As Sefault Status = $R3 \
                       $\nDownload Server IP = $DownloadServerIP"
     ; The following will exit the installer
     SetAutoClose true
     StrCpy $R9 "2"
     Call RelativeGotoPage
 !else
     ${NSD_CreateTimer} OnPing ${DownloadIntervalMS}
-    InetBgDL::Get "${BaseURLStubPing}/${StubURLVersion}${StubURLVersionAppend}/${Channel}/${UpdateChannel}/${AB_CD}/$R0/$R1/$R2/$R3/$R4/$ExitCode/$FirefoxLaunchCode/$DownloadRetryCount/$DownloadedBytes/$IntroPhaseSeconds/$OptionsPhaseSeconds/$0/$1/$DownloadFirstTransferSeconds/$2/$3/$4/$IntroPageShownCount/$OptionsPageShownCount/$InitialInstallRequirementsCode/$OpenedDownloadPage/$ExistingProfile/$ExistingVersion/$ExistingBuildID/$R5/$R6/$R7/$R8/$DownloadServerIP" \
+    InetBgDL::Get "${BaseURLStubPing}/${StubURLVersion}/${Channel}/${UpdateChannel}/${AB_CD}/$R0/$R1/$5/$6/$7/$8/$9/$ExitCode/$FirefoxLaunchCode/$DownloadRetryCount/$DownloadedBytes/$DownloadSizeBytes/$IntroPhaseSeconds/$OptionsPhaseSeconds/$0/$1/$DownloadFirstTransferSeconds/$2/$3/$4/$InitialInstallRequirementsCode/$OpenedDownloadPage/$ExistingProfile/$ExistingVersion/$ExistingBuildID/$R5/$R6/$R7/$R8/$R2/$R3/$DownloadServerIP" \
                   "$PLUGINSDIR\_temp" /END
 !endif
   ${Else}
     ${If} "$IsDownloadFinished" == "false"
       ; Cancel the download in progress
       InetBgDL::Get /RESET /END
     ${EndIf}
     ; The following will exit the installer
@@ -676,18 +727,16 @@ Function createIntro
 !endif
   ${NSD_CreateLabel} ${INTRO_BLURB_EDGE_DU} $0 ${INTRO_BLURB_WIDTH_DU} 76u "${INTRO_BLURB}"
   Pop $0
   SendMessage $0 ${WM_SETFONT} $FontBlurb 0
   SetCtlColors $0 ${INTRO_BLURB_TEXT_COLOR} transparent
 
   SetCtlColors $HWNDPARENT ${FOOTER_CONTROL_TEXT_COLOR_NORMAL} ${FOOTER_BKGRD_COLOR}
   GetDlgItem $0 $HWNDPARENT 10 ; Default browser checkbox
-  ; Set as default is not supported in the installer for Win8 and above so
-  ; only display it on Windows 7 and below
   ${If} "$CanSetAsDefault" == "true"
     ; The uxtheme must be disabled on checkboxes in order to override the
     ; system font color.
     System::Call 'uxtheme::SetWindowTheme(i $0 , w " ", w " ")'
     SendMessage $0 ${WM_SETFONT} $FontNormal 0
     SendMessage $0 ${WM_SETTEXT} 0 "STR:$(MAKE_DEFAULT)"
     SendMessage $0 ${BM_SETCHECK} 1 0
     SetCtlColors $0 ${FOOTER_CONTROL_TEXT_COLOR_NORMAL} ${FOOTER_BKGRD_COLOR}
@@ -715,37 +764,37 @@ Function createIntro
   ${NSD_SetFocus} $0
 
   GetDlgItem $0 $HWNDPARENT 2 ; Cancel button
   SendMessage $0 ${WM_SETTEXT} 0 "STR:$(CANCEL_BUTTON)"
 
   GetDlgItem $0 $HWNDPARENT 3 ; Back button used for Options
   SendMessage $0 ${WM_SETTEXT} 0 "STR:$(OPTIONS_BUTTON)"
 
-  IntOp $IntroPageShownCount $IntroPageShownCount + 1
-
   System::Call "kernel32::GetTickCount()l .s"
   Pop $StartIntroPhaseTickCount
 
   LockWindow off
   nsDialogs::Show
 
   ${NSD_FreeImage} $0
   ${NSD_FreeImage} $1
 FunctionEnd
 
 Function leaveIntro
   LockWindow on
 
   System::Call "kernel32::GetTickCount()l .s"
   Pop $0
-  ${GetSecondsElapsed} "$StartIntroPhaseTickCount" "$0" $1
-  ; This is added to the previous value of $IntroPhaseSeconds because the
-  ; introduction page can be displayed multiple times.
-  IntOp $IntroPhaseSeconds $IntroPhaseSeconds + $1
+  ${GetSecondsElapsed} "$StartIntroPhaseTickCount" "$0" $IntroPhaseSeconds
+  ; It is possible for this value to be 0 if the user clicks fast enough so
+  ; increment the value by 1 if it is 0.
+  ${If} $IntroPhaseSeconds == 0
+    IntOp $IntroPhaseSeconds $IntroPhaseSeconds + 1
+  ${EndIf}
 
   SetShellVarContext all ; Set SHCTX to All Users
   ; If the user doesn't have write access to the installation directory set
   ; the installation directory to a subdirectory of the All Users application
   ; directory and if the user can't write to that location set the installation
   ; directory to a subdirectory of the users local application directory
   ; (e.g. non-roaming).
   Call CanWrite
@@ -981,18 +1030,16 @@ Function createOptions
   ${If} "$WasOptionsButtonClicked" != "1"
     ${If} "$CanWriteToInstallDir" == "false"
       MessageBox MB_OK|MB_ICONEXCLAMATION "$(WARN_WRITE_ACCESS)"
     ${ElseIf} "$HasRequiredSpaceAvailable" == "false"
       MessageBox MB_OK|MB_ICONEXCLAMATION "$(WARN_DISK_SPACE)"
     ${EndIf}
   ${EndIf}
 
-  StrCpy $OptionsPageShownCount "1"
-
   System::Call "kernel32::GetTickCount()l .s"
   Pop $StartOptionsPhaseTickCount
 
   LockWindow off
   nsDialogs::Show
 FunctionEnd
 
 Function leaveOptions
@@ -1018,20 +1065,22 @@ Function leaveOptions
   ${If} "$HasRequiredSpaceAvailable" == "false"
     LockWindow off
     MessageBox MB_OK|MB_ICONEXCLAMATION "$(WARN_DISK_SPACE)"
     Abort ; Stay on the page
   ${EndIf}
 
   System::Call "kernel32::GetTickCount()l .s"
   Pop $0
-  ${GetSecondsElapsed} "$StartOptionsPhaseTickCount" "$0" $1
-  ; This is added to the previous value of $OptionsPhaseSeconds because the
-  ; options page can be displayed multiple times.
-  IntOp $OptionsPhaseSeconds $OptionsPhaseSeconds + $1
+  ${GetSecondsElapsed} "$StartOptionsPhaseTickCount" "$0" $OptionsPhaseSeconds
+  ; It is possible for this value to be 0 if the user clicks fast enough so
+  ; increment the value by 1 if it is 0.
+  ${If} $OptionsPhaseSeconds == 0
+    IntOp $OptionsPhaseSeconds $OptionsPhaseSeconds + 1
+  ${EndIf}
 
   ${NSD_GetState} $CheckboxShortcutOnBar $CheckboxShortcutOnBar
   ${NSD_GetState} $CheckboxShortcutInStartMenu $CheckboxShortcutInStartMenu
   ${NSD_GetState} $CheckboxShortcutOnDesktop $CheckboxShortcutOnDesktop
   ${NSD_GetState} $CheckboxSendPing $CheckboxSendPing
 !ifdef MOZ_MAINTENANCE_SERVICE
   ${NSD_GetState} $CheckboxInstallMaintSvc $CheckboxInstallMaintSvc
 !endif
@@ -1144,17 +1193,16 @@ Function createInstall
   GetDlgItem $0 $HWNDPARENT 2 ; Cancel button
   SendMessage $0 ${WM_SETTEXT} 0 "STR:$(CANCEL_BUTTON)"
   ; Focus the Cancel button otherwise it isn't possible to tab to it since it is
   ; the only control that can be tabbed to.
   ${NSD_SetFocus} $0
   ; Kill the Cancel button's focus so pressing enter won't cancel the install.
   SendMessage $0 ${WM_KILLFOCUS} 0 0
 
-  ; Set as default is not supported in the installer for Win8 and above
   ${If} "$CanSetAsDefault" == "true"
     GetDlgItem $0 $HWNDPARENT 10 ; Default browser checkbox
     SendMessage $0 ${BM_GETCHECK} 0 0 $CheckboxSetAsDefault
     EnableWindow $0 0
     ShowWindow $0 ${SW_HIDE}
   ${EndIf}
 
   GetDlgItem $0 $HWNDPARENT 11
--- a/toolkit/mozapps/installer/windows/nsis/overrides.nsh
+++ b/toolkit/mozapps/installer/windows/nsis/overrides.nsh
@@ -19,25 +19,40 @@
 !endif
 
 !ifmacrondef FILEFUNC_VERBOSE
 !include FileFunc.nsh
 !endif
 
 !macro __MOZ__WinVer_DefineOSTests WinVer
   !insertmacro __WinVer_DefineOSTest AtLeast ${WinVer} ""
+  !insertmacro __WinVer_DefineOSTest Is ${WinVer} ""
   !insertmacro __WinVer_DefineOSTest AtMost ${WinVer} ""
-  !insertmacro __WinVer_DefineOSTest Is ${WinVer} ""
 !macroend
 
 !ifndef WINVER_8
-  !define WINVER_8    0x06020000 ;6.02.????
+  !define WINVER_8         0x06020000 ;6.02.9200
   !insertmacro __MOZ__WinVer_DefineOSTests 8
 !endif
 
+!ifndef WINVER_8.1
+  !define WINVER_8.1       0x06030000 ;6.03.9600
+  !insertmacro __MOZ__WinVer_DefineOSTests 8.1
+!endif
+
+!ifndef WINVER_2012
+  !define WINVER_2012      0x06020001 ;6.02.9200
+  !insertmacro __MOZ__WinVer_DefineOSTests 2012
+!endif
+
+!ifndef WINVER_2012R2
+  !define WINVER_2012R2    0x06030001 ;6.03.9600
+  !insertmacro __MOZ__WinVer_DefineOSTests 2012R2
+!endif
+
 !verbose push
 !verbose 3
 !ifndef _OVERRIDE_VERBOSE
   !define _OVERRIDE_VERBOSE 3
 !endif
 !verbose ${_OVERRIDE_VERBOSE}
 !define OVERRIDE_VERBOSE `!insertmacro OVERRIDE_VERBOSE`
 !define _OVERRIDE_UN