[Spice-devel] [NSIS 1/8] nsis: Add support for building an oVirt installer

Yedidyah Bar David didi at redhat.com
Thu Sep 10 05:14:08 PDT 2015


From: Christophe Fergeau <cfergeau at redhat.com>

oVirt wants to reuse the SPICE Guest Tools code as a basis for building
an installer for the oVirt Guest Tools. This commit renames the install
script to win-guest-tools.nsis and add conditionals to build either an
installer for SPICE Guest Tools or oVirt Guest Tools.

Change-Id: I62e41f3b3bcc5d1975523614897928543c44ba1a
Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
---
 README                 |   4 +-
 spice-guest-tools.nsis | 394 -----------------------------------------------
 win-guest-tools.nsis   | 406 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 408 insertions(+), 396 deletions(-)
 delete mode 100644 spice-guest-tools.nsis
 create mode 100644 win-guest-tools.nsis

diff --git a/README b/README
index 856d36a..17365c2 100644
--- a/README
+++ b/README
@@ -8,7 +8,7 @@ started up/picked up correctly by Windows.
 
 This script needs to have the various binaries/drivers it will install
 available, they are not included in this archive. The various 'File'
-directives in spice-guest-tools.nsis should give you an idea of the
+directives in win-guest-tools.nsis should give you an idea of the
 directory tree the script expects. There are some rough notes about this
 in INSTALL as well.
 
@@ -20,4 +20,4 @@ from http://nsis.sourceforge.net/NSIS_Simple_Service_Plugin . The dll it ships m
 NSIS plugin path, for example /usr/share/nsis/Plugins/ on my Fedora machine.
 
 Once this is installed, all that is needed is to run makensis
-./spice-guest-tools.nsi from your Linux box, and magic will happen!
+./win-guest-tools.nsi from your Linux box, and magic will happen!
diff --git a/spice-guest-tools.nsis b/spice-guest-tools.nsis
deleted file mode 100644
index c7444a4..0000000
--- a/spice-guest-tools.nsis
+++ /dev/null
@@ -1,394 +0,0 @@
-#!Nsis Installer Command Script
-# @configure_input@
-# To build an installer from the script you would normally do:
-#
-#   makensis spice-guest-tools.nsis
-#
-# which will generate the output file 'spice-guest-tools-$VERSION.exe' which is a Windows
-# installer containing your program.
-#
-#
-#
-# Copyright (c) 2012-2015 Red Hat, Inc
-# Copyright (c) 2014 Lev Veyde <lveyde at gmail.com>
-# Copyright (c) 2012 Grant Williamson <grant.williamson at gmail.com>
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-# 
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-# DEALINGS IN THE SOFTWARE.
-#
-
-SetCompressor /SOLID lzma
-
-!include "driver.nsh"
-!include "FileFunc.nsh"
-!include "WinVer.nsh"
-!include "x64.nsh"
-
-!define FILENAME "spice-guest-tools"
-!define NAME "SPICE Guest Tools"
-!define PUBLISHER "The SPICE Project"
-!define REGKEYNAME "SpiceGuestTools"
-!define URL "http://spice-space.org"
-!define VERSION "0.103"
-Name "${NAME}"
-Caption "${NAME} Installer"
-OutFile "${FILENAME}-${VERSION}.exe"
-InstallDir "$PROGRAMFILES\${NAME}"
-BrandingText " "
-
-# SilentInstall silent
-ShowInstDetails nevershow
-# ShowUninstDetails hide
-
-!include "MUI2.nsh"
-!insertmacro MUI_PAGE_WELCOME
-!insertmacro MUI_PAGE_LICENSE win-driver-license.txt
-!insertmacro MUI_PAGE_INSTFILES
-!insertmacro MUI_PAGE_FINISH
-
-!insertmacro MUI_UNPAGE_WELCOME
-!insertmacro MUI_UNPAGE_INSTFILES
-!insertmacro MUI_UNPAGE_FINISH
-
-!insertmacro MUI_LANGUAGE "English"
-
-XPStyle on
-RequestExecutionLevel admin
-
-ComponentText "Select which optional components you want to install."
-
-DirText "Please select the installation folder."
-
-Section "spice-guest-tools"
-  SectionIn RO
-
-  Call StopServices
-
-  SetOutPath "$INSTDIR"
-  File "version.txt"
-
-  SetOutPath "$INSTDIR\32"
-  File "bin/vdagent_x86/vdagent.exe"
-  File "bin/vdagent_x86/vdservice.exe"
-  SetOutPath "$INSTDIR\64"
-  File "bin/vdagent_x64/vdagent.exe"
-  File "bin/vdagent_x64/vdservice.exe"
-
-  SetOutPath "$INSTDIR\drivers"
-  File /r drivers/virtio/
-  File /r drivers/qxl/
-
-  Push "vioserial"
-  Push "vioser"
-  Push "PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4"
-  Call InstallDriver
-
-  Call InstallQemuGuestAgent
-
-  ${if} ${AtLeastWin8}
-    Push "qxldod"
-    Push "qxldod"
-  ${else}
-    Push "qxl"
-    Push "qxl"
-  ${endif}
-  Push "PCI\VEN_1b36&DEV_0100&SUBSYS_11001af4"
-  Call InstallDriver
-
-  Push "Balloon"
-  Push "balloon"
-  Push "PCI\VEN_1AF4&DEV_1002&SUBSYS_00051AF4&REV_00"
-  Call InstallBalloonDriver
-
-  Push "viostor"
-  Push "viostor"
-  Push "PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00"
-  Call InstallDriver
-
-  ${If}  ${IsWinVista}
-  ${OrIf} ${IsWin2008}
-  ${OrIf} ${IsWin7}
-  ${OrIf} ${IsWin2008R2}
-  ${OrIf} ${IsWin8}
-  ${OrIf} ${IsWin2012}
-  ${OrIf} ${IsWin8.1}
-  ${OrIf} ${IsWin2012R2}
-    Push "vioscsi"
-    Push "vioscsi"
-    Push "PCI\VEN_1AF4&DEV_1004&SUBSYS_00081AF4&REV_00"
-    Call InstallDriver
-  ${EndIf}
-
-  Push "."
-  Push "qemupciserial"
-  Push "PCI\VEN_1B36&DEV_0002"
-  Call InstallDriver
-
-  Push "."
-  Push "qemupciserial"
-  Push "PCI\VEN_1B36&DEV_0003"
-  Call InstallDriver
-
-  Push "."
-  Push "qemupciserial"
-  Push "PCI\VEN_1B36&DEV_0003"
-  Call InstallDriver
-
-  Push "NetKVM"
-  Push "netkvm"
-  Push "PCI\VEN_1AF4&DEV_1000&SUBSYS_00011AF4&REV_00"
-  Call InstallDriver
-
-  Call InstallVdAgentService
-
-  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
-                 "DisplayName" "${NAME}"
-  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
-                 "DisplayVersion" "${VERSION}"
-  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
-                 "Publisher" "${PUBLISHER}"
-  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
-                 "URLInfoAbout" "${URL}"
-  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
-                 "UninstallString" "$\"$INSTDIR\Uninstall ${FILENAME}$\""
-  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
-                 "QuietUninstallString" "$\"$INSTDIR\Uninstall ${FILENAME}$\" /S"
-  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
-                 "NoModify" "1"
-  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
-                 "NoRepair" "1"
-  ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
-  IntFmt $0 "0x%08X" $0
-  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
-                 "EstimatedSize" "$0"
-SectionEnd
-
-Section "Uninstall"
-  Call un.StopServices
-  Call un.UninstallQemuGuestAgent
-
-  SetOutPath "$TEMP"
-
-  Delete /rebootok "$INSTDIR\version.txt"
-  Delete /rebootok "$INSTDIR\Uninstall ${FILENAME}.exe"
-  Delete /rebootok "$INSTDIR\32\vdagent.exe"
-  Delete /rebootok "$INSTDIR\32\vdservice.exe"
-  RMDir /rebootok "$INSTDIR\32"
-  Delete /rebootok "$INSTDIR\64\vdagent.exe"
-  Delete /rebootok "$INSTDIR\64\vdservice.exe"
-  RMDir /rebootok "$INSTDIR\64"
-  RMDir /rebootok /r "$INSTDIR\drivers"
-  RMDir /rebootok "$INSTDIR"
-
-  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}"
-SectionEnd
-
-Section -post
-  WriteUninstaller "$INSTDIR\Uninstall ${FILENAME}.exe"
-SectionEnd
-
-Function .onInit
-   ${if} ${RunningX64}
-     ${if} ${IsWinXP}
-       MessageBox MB_ICONEXCLAMATION "Windows XP 64 bit is an unsupported Windows version"
-       Abort ; causes installer to quit.
-     ${endif}
-   ${endif}
-   ${if} ${AtMostWin2000}
-       MessageBox MB_ICONEXCLAMATION "Drivers only available for Windows XP or newer"
-       Abort ; causes installer to quit.
-   ${endif}
-FunctionEnd
-
-Function GetDriverSubdir
-   Pop $0
-   ${If} ${IsWinXP}
-      StrCpy $0 "$0\xp"
-   ${ElseIf} ${IsWinVista}
-      StrCpy $0 "$0\vista"
-   ${ElseIf} ${IsWin2003}
-      StrCpy $0 "$0\2k3"
-   ${ElseIf} ${IsWin7}
-      StrCpy $0 "$0\w7"
-   ${ElseIf} ${IsWin2008}
-      StrCpy $0 "$0\w2k8"
-   ${ElseIf} ${IsWin2008R2}
-      StrCpy $0 "$0\w2k8R2"
-   ${ElseIf} ${IsWin8}
-      StrCpy $0 "$0\w8"
-   ${ElseIf} ${IsWin2012}
-      StrCpy $0 "$0\w2k12"
-   ${ElseIf} ${IsWin8.1}
-      StrCpy $0 "$0\w8.1"
-   ${ElseIf} ${IsWin2012R2}
-      StrCpy $0 "$0\w2k12r2"
-   ${Else}
-      MessageBox MB_ICONEXCLAMATION "Unsupported Windows version"
-      Abort ; causes installer to quit.
-   ${EndIf}
-
-   ${If} ${RunningX64}
-      StrCpy $0 "$0\amd64"
-   ${Else}
-      StrCpy $0 "$0\x86"
-   ${EndIf}
-
-   Push $0
-FunctionEnd
-
-Function InstallBalloonDriver
-  Call InstallDriver
-
-  Call InstallBalloonService
-
-FunctionEnd
-
-Function InstallDriver
-  Pop $R0 ; HID
-  Pop $R1 ; driver name
-  Pop $R2 ; driver path
-  Push $R2
-  Call GetDriverSubdir
-  Pop $0
-  StrCpy $1 $R1
-  Push $1
-  StrCpy $2 "$INSTDIR\drivers\$0"
-  Push $2
-  StrCpy $3 "$2\$R1.inf"
-  Push $3
-  Push $R0
-  DetailPrint "Installing $R1.inf"
-  Call InstallUpgradeDriver
-FunctionEnd
-
-!macro StopServices un
-Function ${un}StopService
-  pop $R0
-
-  SimpleSC::ServiceIsRunning $R0
-  pop $0
-  pop $1
-  ${if} $0 != 0
-    # error
-    Return
-  ${endif}
-  ${if} $1 == 0
-    # service not running
-    Return
-  ${endif}
-
-  DetailPrint "Stopping $R0"
-  SimpleSC::StopService $R0 1 30
-  pop $0
-  ${if} $0 != 0
-    DetailPrint "Failed to stop $R0: $0"
-    Return
-  ${endif}
-  DetailPrint "$R0 stopped"
-FunctionEnd
-
-Function ${un}StopServices
-  push "vdservice"
-  Call ${un}StopService
-
-  push "BalloonService"
-  Call ${un}StopService
-
-
-FunctionEnd
-!macroend
-
-!insertmacro StopServices ""
-!insertmacro StopServices "un."
-
-Function InstallService
-  pop $R0 #service name
-  pop $R1 #service path
-  pop $R2 #service pretty name
-
-  SimpleSC::ExistsService $R0
-  Pop $0
-  ${if} $0 == 0
-    DetailPrint "$R2 service already installed"
-    goto InstallService
-  ${endif}
-
-  DetailPrint "Installing $R2 service"
-  SimpleSC::InstallService $R0 $R2 16 2 $R1 "" "" ""
-  Pop $0
-  ${if} $0 != 0
-    DetailPrint "Failed to install $R2 service: $0"
-    Return
-  ${endif}
-  DetailPrint "$R2 service installed"
-
-InstallService:
-  DetailPrint "Starting $R2 service"
-  SimpleSC::StartService $R0 "" 30
-  Pop $0
-  ${if} $0 != 0
-    DetailPrint "Failed to start $R2 service: $0"
-    Return
-  ${endif}
-  DetailPrint "$R2 service started"
-FunctionEnd
-
-Function InstallQemuGuestAgent
-  ${if} ${RunningX64}
-    StrCpy $0 "$INSTDIR\guest-agent\qemu-ga-x64.msi"
-  ${else}
-    StrCpy $0 "$INSTDIR\guest-agent\qemu-ga-x86.msi"
-  ${endif}
-  ExecWait '"msiexec.exe" /qn /i "$0"'
-FunctionEnd
-
-Function un.UninstallQemuGuestAgent
-  ${if} ${RunningX64}
-    StrCpy $0 "$INSTDIR\guest-agent\qemu-ga-x64.msi"
-  ${else}
-    StrCpy $0 "$INSTDIR\guest-agent\qemu-ga-x86.msi"
-  ${endif}
-  ExecWait '"msiexec.exe" /qn /x "$0"'
-FunctionEnd
-
-Function InstallVdAgentService
-  ${if} ${RunningX64}
-    StrCpy $0 "$INSTDIR\64\vdservice.exe"
-  ${else}
-    StrCpy $0 "$INSTDIR\32\vdservice.exe"
-  ${endif}
-
-  push "SPICE VDAgent"
-  push $0
-  push "vdservice"
-  Call InstallService
-
-FunctionEnd
-
-Function InstallBalloonService
-  Push "Balloon"
-  Call GetDriverSubdir
-  Pop $0
-  StrCpy $0 "$INSTDIR\drivers\$0\blnsvr.exe"
-
-  Push "Balloon Service"
-  Push $0
-  Push "BalloonService"
-  Call InstallService
-
-FunctionEnd
diff --git a/win-guest-tools.nsis b/win-guest-tools.nsis
new file mode 100644
index 0000000..e7a3fc1
--- /dev/null
+++ b/win-guest-tools.nsis
@@ -0,0 +1,406 @@
+#!Nsis Installer Command Script
+# @configure_input@
+# To build an installer from the script you would normally do:
+#
+#   makensis -D{SPICE,OVIRT} win-guest-tools.nsis
+#
+# which will generate the output file 'spice-guest-tools-$VERSION.exe' or
+# 'ovirt-guest-tools-setup.exe' which are Windows
+# installers containing your program.
+#
+#
+#
+# Copyright (c) 2012-2015 Red Hat, Inc
+# Copyright (c) 2014 Lev Veyde <lveyde at gmail.com>
+# Copyright (c) 2012 Grant Williamson <grant.williamson at gmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+# 
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+#
+
+SetCompressor /SOLID lzma
+
+!include "driver.nsh"
+!include "FileFunc.nsh"
+!include "WinVer.nsh"
+!include "x64.nsh"
+
+!ifdef SPICE
+!define FILENAME "spice-guest-tools"
+!define NAME "SPICE Guest Tools"
+!define PUBLISHER "The SPICE Project"
+!define REGKEYNAME "SpiceGuestTools"
+!define URL "http://spice-space.org"
+!else ifdef OVIRT
+!define FILENAME "win-guest-tools"
+!define NAME "oVirt Guest Tools"
+!define PUBLISHER "The oVirt Project"
+!define REGKEYNAME "oVirtGuestTools"
+!define URL "http://www.ovirt.org/Home"
+!else
+!error "OVIRT or SPICE symbol should passed to makensis with the -D flag"
+!endif
+!define VERSION "0.103"
+
+Name "${NAME}"
+Caption "${NAME} Installer"
+OutFile "${FILENAME}-${VERSION}.exe"
+InstallDir "$PROGRAMFILES\${NAME}"
+BrandingText " "
+
+# SilentInstall silent
+ShowInstDetails nevershow
+# ShowUninstDetails hide
+
+!include "MUI2.nsh"
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_LICENSE win-driver-license.txt
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+
+!insertmacro MUI_UNPAGE_WELCOME
+!insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_UNPAGE_FINISH
+
+!insertmacro MUI_LANGUAGE "English"
+
+XPStyle on
+RequestExecutionLevel admin
+
+ComponentText "Select which optional components you want to install."
+
+DirText "Please select the installation folder."
+
+Section "install"
+  SectionIn RO
+
+  Call StopServices
+
+  SetOutPath "$INSTDIR"
+  File "version.txt"
+
+  SetOutPath "$INSTDIR\32"
+  File "bin/vdagent_x86/vdagent.exe"
+  File "bin/vdagent_x86/vdservice.exe"
+  SetOutPath "$INSTDIR\64"
+  File "bin/vdagent_x64/vdagent.exe"
+  File "bin/vdagent_x64/vdservice.exe"
+
+  SetOutPath "$INSTDIR\drivers"
+  File /r drivers/virtio/
+  File /r drivers/qxl/
+
+  Push "vioserial"
+  Push "vioser"
+  Push "PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4"
+  Call InstallDriver
+
+  Call InstallQemuGuestAgent
+
+  ${if} ${AtLeastWin8}
+    Push "qxldod"
+    Push "qxldod"
+  ${else}
+    Push "qxl"
+    Push "qxl"
+  ${endif}
+  Push "PCI\VEN_1b36&DEV_0100&SUBSYS_11001af4"
+  Call InstallDriver
+
+  Push "Balloon"
+  Push "balloon"
+  Push "PCI\VEN_1AF4&DEV_1002&SUBSYS_00051AF4&REV_00"
+  Call InstallBalloonDriver
+
+  Push "viostor"
+  Push "viostor"
+  Push "PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00"
+  Call InstallDriver
+
+  ${If}  ${IsWinVista}
+  ${OrIf} ${IsWin2008}
+  ${OrIf} ${IsWin7}
+  ${OrIf} ${IsWin2008R2}
+  ${OrIf} ${IsWin8}
+  ${OrIf} ${IsWin2012}
+  ${OrIf} ${IsWin8.1}
+  ${OrIf} ${IsWin2012R2}
+    Push "vioscsi"
+    Push "vioscsi"
+    Push "PCI\VEN_1AF4&DEV_1004&SUBSYS_00081AF4&REV_00"
+    Call InstallDriver
+  ${EndIf}
+
+  Push "."
+  Push "qemupciserial"
+  Push "PCI\VEN_1B36&DEV_0002"
+  Call InstallDriver
+
+  Push "."
+  Push "qemupciserial"
+  Push "PCI\VEN_1B36&DEV_0003"
+  Call InstallDriver
+
+  Push "."
+  Push "qemupciserial"
+  Push "PCI\VEN_1B36&DEV_0003"
+  Call InstallDriver
+
+  Push "NetKVM"
+  Push "netkvm"
+  Push "PCI\VEN_1AF4&DEV_1000&SUBSYS_00011AF4&REV_00"
+  Call InstallDriver
+
+  Call InstallVdAgentService
+
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
+                 "DisplayName" "${NAME}"
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
+                 "DisplayVersion" "${VERSION}"
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
+                 "Publisher" "${PUBLISHER}"
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
+                 "URLInfoAbout" "${URL}"
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
+                 "UninstallString" "$\"$INSTDIR\Uninstall ${FILENAME}$\""
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
+                 "QuietUninstallString" "$\"$INSTDIR\Uninstall ${FILENAME}$\" /S"
+  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
+                 "NoModify" "1"
+  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
+                 "NoRepair" "1"
+  ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
+  IntFmt $0 "0x%08X" $0
+  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}" \
+                 "EstimatedSize" "$0"
+SectionEnd
+
+Section "Uninstall"
+  Call un.StopServices
+  Call un.UninstallQemuGuestAgent
+
+  SetOutPath "$TEMP"
+
+  Delete /rebootok "$INSTDIR\version.txt"
+  Delete /rebootok "$INSTDIR\Uninstall ${FILENAME}.exe"
+  Delete /rebootok "$INSTDIR\32\vdagent.exe"
+  Delete /rebootok "$INSTDIR\32\vdservice.exe"
+  RMDir /rebootok "$INSTDIR\32"
+  Delete /rebootok "$INSTDIR\64\vdagent.exe"
+  Delete /rebootok "$INSTDIR\64\vdservice.exe"
+  RMDir /rebootok "$INSTDIR\64"
+  RMDir /rebootok /r "$INSTDIR\drivers"
+  RMDir /rebootok "$INSTDIR"
+
+  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${REGKEYNAME}"
+SectionEnd
+
+Section -post
+  WriteUninstaller "$INSTDIR\Uninstall ${FILENAME}.exe"
+SectionEnd
+
+Function .onInit
+   ${if} ${RunningX64}
+     ${if} ${IsWinXP}
+       MessageBox MB_ICONEXCLAMATION "Windows XP 64 bit is an unsupported Windows version"
+       Abort ; causes installer to quit.
+     ${endif}
+   ${endif}
+   ${if} ${AtMostWin2000}
+       MessageBox MB_ICONEXCLAMATION "Drivers only available for Windows XP or newer"
+       Abort ; causes installer to quit.
+   ${endif}
+FunctionEnd
+
+Function GetDriverSubdir
+   Pop $0
+   ${If} ${IsWinXP}
+      StrCpy $0 "$0\xp"
+   ${ElseIf} ${IsWinVista}
+      StrCpy $0 "$0\vista"
+   ${ElseIf} ${IsWin2003}
+      StrCpy $0 "$0\2k3"
+   ${ElseIf} ${IsWin7}
+      StrCpy $0 "$0\w7"
+   ${ElseIf} ${IsWin2008}
+      StrCpy $0 "$0\w2k8"
+   ${ElseIf} ${IsWin2008R2}
+      StrCpy $0 "$0\w2k8R2"
+   ${ElseIf} ${IsWin8}
+      StrCpy $0 "$0\w8"
+   ${ElseIf} ${IsWin2012}
+      StrCpy $0 "$0\w2k12"
+   ${ElseIf} ${IsWin8.1}
+      StrCpy $0 "$0\w8.1"
+   ${ElseIf} ${IsWin2012R2}
+      StrCpy $0 "$0\w2k12r2"
+   ${Else}
+      MessageBox MB_ICONEXCLAMATION "Unsupported Windows version"
+      Abort ; causes installer to quit.
+   ${EndIf}
+
+   ${If} ${RunningX64}
+      StrCpy $0 "$0\amd64"
+   ${Else}
+      StrCpy $0 "$0\x86"
+   ${EndIf}
+
+   Push $0
+FunctionEnd
+
+Function InstallBalloonDriver
+  Call InstallDriver
+
+  Call InstallBalloonService
+
+FunctionEnd
+
+Function InstallDriver
+  Pop $R0 ; HID
+  Pop $R1 ; driver name
+  Pop $R2 ; driver path
+  Push $R2
+  Call GetDriverSubdir
+  Pop $0
+  StrCpy $1 $R1
+  Push $1
+  StrCpy $2 "$INSTDIR\drivers\$0"
+  Push $2
+  StrCpy $3 "$2\$R1.inf"
+  Push $3
+  Push $R0
+  DetailPrint "Installing $R1.inf"
+  Call InstallUpgradeDriver
+FunctionEnd
+
+!macro StopServices un
+Function ${un}StopService
+  pop $R0
+
+  SimpleSC::ServiceIsRunning $R0
+  pop $0
+  pop $1
+  ${if} $0 != 0
+    # error
+    Return
+  ${endif}
+  ${if} $1 == 0
+    # service not running
+    Return
+  ${endif}
+
+  DetailPrint "Stopping $R0"
+  SimpleSC::StopService $R0 1 30
+  pop $0
+  ${if} $0 != 0
+    DetailPrint "Failed to stop $R0: $0"
+    Return
+  ${endif}
+  DetailPrint "$R0 stopped"
+FunctionEnd
+
+Function ${un}StopServices
+  push "vdservice"
+  Call ${un}StopService
+
+  push "BalloonService"
+  Call ${un}StopService
+
+
+FunctionEnd
+!macroend
+
+!insertmacro StopServices ""
+!insertmacro StopServices "un."
+
+Function InstallService
+  pop $R0 #service name
+  pop $R1 #service path
+  pop $R2 #service pretty name
+
+  SimpleSC::ExistsService $R0
+  Pop $0
+  ${if} $0 == 0
+    DetailPrint "$R2 service already installed"
+    goto InstallService
+  ${endif}
+
+  DetailPrint "Installing $R2 service"
+  SimpleSC::InstallService $R0 $R2 16 2 $R1 "" "" ""
+  Pop $0
+  ${if} $0 != 0
+    DetailPrint "Failed to install $R2 service: $0"
+    Return
+  ${endif}
+  DetailPrint "$R2 service installed"
+
+InstallService:
+  DetailPrint "Starting $R2 service"
+  SimpleSC::StartService $R0 "" 30
+  Pop $0
+  ${if} $0 != 0
+    DetailPrint "Failed to start $R2 service: $0"
+    Return
+  ${endif}
+  DetailPrint "$R2 service started"
+FunctionEnd
+
+Function InstallQemuGuestAgent
+  ${if} ${RunningX64}
+    StrCpy $0 "$INSTDIR\guest-agent\qemu-ga-x64.msi"
+  ${else}
+    StrCpy $0 "$INSTDIR\guest-agent\qemu-ga-x86.msi"
+  ${endif}
+  ExecWait '"msiexec.exe" /qn /i "$0"'
+FunctionEnd
+
+Function un.UninstallQemuGuestAgent
+  ${if} ${RunningX64}
+    StrCpy $0 "$INSTDIR\guest-agent\qemu-ga-x64.msi"
+  ${else}
+    StrCpy $0 "$INSTDIR\guest-agent\qemu-ga-x86.msi"
+  ${endif}
+  ExecWait '"msiexec.exe" /qn /x "$0"'
+FunctionEnd
+
+Function InstallVdAgentService
+  ${if} ${RunningX64}
+    StrCpy $0 "$INSTDIR\64\vdservice.exe"
+  ${else}
+    StrCpy $0 "$INSTDIR\32\vdservice.exe"
+  ${endif}
+
+  push "SPICE VDAgent"
+  push $0
+  push "vdservice"
+  Call InstallService
+
+FunctionEnd
+
+Function InstallBalloonService
+  Push "Balloon"
+  Call GetDriverSubdir
+  Pop $0
+  StrCpy $0 "$INSTDIR\drivers\$0\blnsvr.exe"
+
+  Push "Balloon Service"
+  Push $0
+  Push "BalloonService"
+  Call InstallService
+
+FunctionEnd
-- 
2.1.4



More information about the Spice-devel mailing list