# # TightVNC 2.0 NSIS install script. # Copyright (C) 2008-2010 GlavSoft LLC. All Rights Reserved. # # # General Symbol Definitions # !define APP_NAME "TightVNC" !define PKG_NAME "tightvnc" !define VERSION "2.0.4" !define NUMERIC_VERSION 2.0.4.0 !define FULL_APP_NAME "${APP_NAME} ${VERSION}" !define REGKEY "SOFTWARE\${APP_NAME}" !define COMPANY "GlavSoft LLC." !define URL http://www.tightvnc.com/ !define COPYRIGHT "Copyright (C) 2008-2011 GlavSoft LLC." # # Shortcuts # !define SC_TIGHTVNC_VIEWER "TightVNC Viewer" !define SC_VISIT_TIGHTVNC_WEB_SITE "Visit TightVNC Web Site" !define SC_APP_FOLDER "TightVNC Server (Application Mode)" !define SC_TIGHTVNC_SERVER_APPLICATION_MODE "Run TightVNC Server" !define SC_CONTROL_TIGHTVNC_SERVER_APPLICATION "TightVNC Server - Control Interface" !define SC_CONFIGURE_TIGHTVNC_SERVER_APPLICATION "TightVNC Server - Offline Configuration" !define SC_SERVICE_FOLDER "TightVNC Server (Service Mode)" !define SC_REGISTER_TIGHTVNC_SERVICE "Register TightVNC Service" !define SC_START_TIGHTVNC_SERVICE "Start TightVNC Service" !define SC_STOP_TIGHTVNC_SERVICE "Stop TightVNC Service" !define SC_CONTROL_TIGHTVNC_SERVICE "TightVNC Service - Control Interface" !define SC_CONFIGURE_TIGHTVNC_SERVICE "TightVNC Service - Offline Configuration" !define SC_UNREGISTER_TIGHTVNC_SERVICE "Unregister TightVNC Service" # Set name of application. Name "${FULL_APP_NAME}" # Use best compression. SetCompressor /SOLID lzma # # MUI Symbol Definitions # !define MUI_ICON "tvnserver.ico" !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM !define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY} !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup !define MUI_STARTMENUPAGE_DEFAULTFOLDER "${APP_NAME}" !define MUI_UNICON "tvnserver.ico" !define MUI_UNFINISHPAGE_NOAUTOCLOSE # Require admin privileges, install for all users. !define MULTIUSER_EXECUTIONLEVEL Admin # Included files !include FileFunc.nsh !include MultiUser.nsh !include Sections.nsh !include MUI2.nsh !include WinVer.nsh # Variables Var StartMenuGroup # Installer pages !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE LICENSE.txt !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup # Additional task page page custom createTaskPage leaveTaskPage # Configure service page page custom createConfigPage leaveConfigPage !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH # Installer languages !insertmacro MUI_LANGUAGE English # Installer attributes OutFile "${PKG_NAME}-${VERSION}-setup.exe" BrandingText " " InstallDir "$PROGRAMFILES\${APP_NAME}" CRCCheck on XPStyle on ShowInstDetails show VIProductVersion ${NUMERIC_VERSION} VIAddVersionKey ProductName ${APP_NAME} VIAddVersionKey ProductVersion "${VERSION}" VIAddVersionKey CompanyName "${COMPANY}" VIAddVersionKey CompanyWebsite "${URL}" VIAddVersionKey FileVersion "${VERSION}" VIAddVersionKey FileDescription "${APP_NAME} ${VERSION} Installer" VIAddVersionKey LegalCopyright "${COPYRIGHT}" InstallDirRegKey HKLM "${REGKEY}" Path ShowUninstDetails show !define SHCNE_ASSOCCHANGED 0x08000000 !define SHCNF_IDLIST 0 InstType "Full" InstType "Viewer Only" # # Installer sections # # # Hidden section that detects and removes old TightVNC. # Section "-Detect and uninstall old TightVNC" SECTION_DELETE_OLD_TIGHTVNC ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TightVNC_is1" "QuietUninstallString" ${If} $0 != "" DetailPrint "Uninstalling old version of TightVNC" ExecWait "$0" ${EndIf} SectionEnd # # Hidden section that installs files that should always be installed. # Section "-Common Files" SECTION_INSTALL_COMMON_FILES SetOutPath $INSTDIR SetOverwrite on File LICENSE.txt File "TightVNC Web Site.url" !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory "$SMPROGRAMS\$StartMenuGroup" CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_VISIT_TIGHTVNC_WEB_SITE}.lnk" "$INSTDIR\TightVNC Web Site.url" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd # # Server section. # Section "!TightVNC Server" SECTION_SERVER SectionIn 1 SetOutPath $INSTDIR ClearErrors SetOverwrite try File tvnserver.exe SetOverwrite on ${If} ${Errors} ExecWait "$INSTDIR\tvnserver.exe -stop -silent" DetailPrint "Waiting for the service to shut down" Sleep 2000 ClearErrors File /oname=tvnserver.exe.new tvnserver.exe Delete tvnserver.exe Rename /REBOOTOK tvnserver.exe.new tvnserver.exe ${Endif} File /oname=screenhooks.dll.new screenhooks.dll Delete screenhooks.dll Rename /REBOOTOK screenhooks.dll.new screenhooks.dll ${If} ${IsWinVista} ${OrIf} ${IsWin2008} File /oname=sas.dll.new sas.dll Delete sas.dll Rename /REBOOTOK sas.dll.new sas.dll ${EndIf} WriteRegStr HKLM "${REGKEY}\Components" "TightVNC Server" 1 # # Create shortcuts. # !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}" CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_REGISTER_TIGHTVNC_SERVICE}.lnk" "$INSTDIR\tvnserver.exe" "-install" CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_START_TIGHTVNC_SERVICE}.lnk" "$INSTDIR\tvnserver.exe" "-start" CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_STOP_TIGHTVNC_SERVICE}.lnk" "$INSTDIR\tvnserver.exe" "-stop" CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_CONTROL_TIGHTVNC_SERVICE}.lnk" "$INSTDIR\tvnserver.exe" "-controlservice" CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_CONFIGURE_TIGHTVNC_SERVICE}.lnk" "$INSTDIR\tvnserver.exe" "-configservice" CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_UNREGISTER_TIGHTVNC_SERVICE}.lnk" "$INSTDIR\tvnserver.exe" "-remove" CreateDirectory "$SMPROGRAMS\$StartMenuGroup\${SC_APP_FOLDER}" CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_APP_FOLDER}\${SC_TIGHTVNC_SERVER_APPLICATION_MODE}.lnk" "$INSTDIR\tvnserver.exe" CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_APP_FOLDER}\${SC_CONTROL_TIGHTVNC_SERVER_APPLICATION}.lnk" "$INSTDIR\tvnserver.exe" "-controlapp" CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_APP_FOLDER}\${SC_CONFIGURE_TIGHTVNC_SERVER_APPLICATION}.lnk" "$INSTDIR\tvnserver.exe" "-configapp" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd # # Hidden section that register and start TightVNC as system service. # Section "-Register service" SECTION_REGISTER_SERVICE DetailPrint "Registering service" # FIXME: This may be a wrong binary if the installer could not replace it! # Register the service by different means, not via tvncserver.exe. ExecWait '"$INSTDIR\tvnserver.exe" -reinstall -silent' DetailPrint "Starting service" # FIXME: This may be wrong binary if the installer could not replace it! # Do not try to start the service if the binary is not there yet. ExecWait '"$INSTDIR\tvnserver.exe" -start -silent' SectionEnd # # Hidden section which enables Ctrl-Alt-Del simulation by services in Vista # and higher. # Section "-Allow SAS generation" SECTION_ALLOW_SAS_GENERATION ${If} ${AtLeastWinVista} DetailPrint "Allowing software SAS generation" ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "SoftwareSASGeneration" IntOp $0 $0 | 1 WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "SoftwareSASGeneration" $0 ${EndIf} SectionEnd # # Viewer section. # Section "!TightVNC Viewer" SECTION_VIEWER SectionIn 1 SectionIn 2 SetOutPath $INSTDIR SetOverwrite on File /oname=vncviewer.exe.new vncviewer.exe Delete vncviewer.exe Rename /REBOOTOK vncviewer.exe.new vncviewer.exe WriteRegStr HKLM "${REGKEY}\Components" "TightVNC Viewer" 1 # # Create Viewer shortcut # !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateShortCut "$SMPROGRAMS\$StartMenuGroup\${SC_TIGHTVNC_VIEWER}.lnk" "$INSTDIR\vncviewer.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd # # Hidden section that associates .vnc extension with newly installed TightVNC Viewer. # Section "-Associate vnc extension with TightVNC Viewer" SECTION_REGISTER_VNC_FILE_EXTENSION DetailPrint "Associating .vnc file extension with TightVNC Viewer" WriteRegStr HKCR ".vnc" "" "VncViewer.Config" WriteRegStr HKCR "VncViewer.Config" "" "VNCviewer Config File" WriteRegStr HKCR "VncViewer.Config\DefaultIcon" "" "$INSTDIR\vncviewer.exe,0" WriteRegStr HKCR "VncViewer.Config\shell\open\command" "" '"$INSTDIR\vncviewer.exe" -config "%1"' ${RefreshShellIcons} SectionEnd # # Adding a rule to Windows Firewall via special plugin # Section "-Add exception to Windows Firewall" SECTION_CONFIGURE_WINDOWS_FIREWALL # Windows XP SP2 or Windows 2003 Server or higher. ${If} ${IsWinXP} ${AndIf} ${AtLeastServicePack} 2 ${OrIf} ${AtLeastWin2003} SimpleFC::IsFirewallServiceRunning Pop $0 ; return error(1)/success(0) Pop $1 ; return 1=IsRunning/0=Not Running ${If} $0 == 0 ${AndIf} $1 == 1 DetailPrint "Adding exception to Windows Firewall" SectionGetFlags ${SECTION_SERVER} $0 IntOp $0 $0 & ${SF_SELECTED} ${If} $0 > 0 # SimpleFC::AddApplication [name] [path] [scope] [ip_version] [remote_addresses] [status] SimpleFC::AddApplication "TightVNC Server" "$INSTDIR\tvnserver.exe" 0 2 "" 1 ${EndIf} SectionGetFlags ${SECTION_VIEWER} $0 IntOp $0 $0 & ${SF_SELECTED} ${If} $0 > 0 SimpleFC::AddApplication "TightVNC Viewer" "$INSTDIR\vncviewer.exe" 0 2 "" 1 ${EndIf} Pop $0 ; return error(1)/success(0) ${If} $0 == 1 MessageBox MB_OK|MB_ICONEXCLAMATION "Could not add exception to Windows Firewall." ${EndIf} ${EndIf} ${EndIf} SectionEnd # # This function deletes old unistall entries which had been created by old version of installer # FIXME: This function must be deleted in future. # Function DeleteOldUninstallEntries DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TightVNC 2.0beta2.2" DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TightVNC 2.0beta2.1" DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TightVNC 2.0beta2" DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TightVNC 2.0beta1.2" DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TightVNC 2.0beta1.1" DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TightVNC 2.0beta1" FunctionEnd # # This function sets correct access right to the HKLM\SOFTWARE\TightVNC\Server reg key, # which had been created by the incorrect versions of installer. # Function FixRegKeyPermissions # Disabling inheritance of reg key AccessControl::DisableRegKeyInheritance "HKLM" "SOFTWARE\TightVNC\Server" Pop $0 # Ignoring any errors # Replacing all users that has access rights by Administartors Group (SID:S-1-5-32-544) AccessControl::ClearOnRegKey /NOINHERIT "HKLM" "SOFTWARE\TightVNC\Server" "(S-1-5-32-544)" "FullAccess" Pop $0 # Ignoring any errors # Setting Full Access for SYSTEM (SID:S-1-5-18) AccessControl::GrantOnRegKey /NOINHERIT "HKLM" "SOFTWARE\TightVNC\Server" "(S-1-5-18)" "FullAccess" Pop $0 # Ignoring any errors # Setting Full Access for Administartors Group (SID:S-1-5-32-544) AccessControl::GrantOnRegKey /NOINHERIT "HKLM" "SOFTWARE\TightVNC\Server" "(S-1-5-32-544)" "FullAccess" Pop $0 # Ignoring any errors FunctionEnd # # Autogenerated hidden section, that creates uninstaller, writes uninstaller entries to # program menu and add TigthVNC to install/uninstall programs. # Section -post SECTION_POST_INSTALL # Deleting all entries call DeleteOldUninstallEntries # Fixing reg key permissions call FixRegKeyPermissions # Write install dir WriteRegStr HKLM "${REGKEY}" Path $INSTDIR # Write uninstaller SetOutPath $INSTDIR WriteUninstaller $INSTDIR\uninstall.exe # Create uninstall entry in add/remove programs registry WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" DisplayName "$(^Name)" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" DisplayVersion "${VERSION}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" Publisher "${COMPANY}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" URLInfoAbout "${URL}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" DisplayIcon $INSTDIR\uninstall.exe WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" UninstallString $INSTDIR\uninstall.exe WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" NoModify 1 WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" NoRepair 1 SectionEnd # # Trick for disabling "Next" button when no public sections are # selected. # Function .onSelChange Push $0 Push $1 SectionGetFlags ${SECTION_SERVER} $0 IntOp $0 ${SF_SELECTED} & $0 SectionGetFlags ${SECTION_VIEWER} $1 IntOp $1 ${SF_SELECTED} & $1 IntOp $0 $1 | $0 GetDlgItem $1 $HWNDPARENT 1 EnableWindow $1 $0 Pop $1 Pop $0 FunctionEnd # # Macro for selecting uninstaller sections # !macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID Push $R0 ReadRegStr $R0 HKLM "${REGKEY}\Components" "${SECTION_NAME}" StrCmp $R0 1 0 next${UNSECTION_ID} !insertmacro SelectSection "${UNSECTION_ID}" GoTo done${UNSECTION_ID} next${UNSECTION_ID}: !insertmacro UnselectSection "${UNSECTION_ID}" done${UNSECTION_ID}: Pop $R0 !macroend # # Macro allows check if a specified registry key exists # $R0 contains 0 (not present) or 1 (present) # For additional details see http://nsis.sourceforge.net/Check_for_a_Registry_Key # !macro IfKeyExists ROOT MAIN_KEY KEY push $R0 push $R1 !define Index 'Line${__LINE__}' StrCpy $R1 "0" "${Index}-Loop:" ClearErrors ; Check for Key EnumRegValue $R0 "${ROOT}" "${MAIN_KEY}" $R1 StrCmp $R0 "" "${Index}-False" IntOp $R1 $R1 + 1 StrCmp $R0 "${KEY}" "${Index}-True" "${Index}-Loop" "${Index}-True:" ;Return 1 if found push "1" goto "${Index}-End" "${Index}-False:" ;Return 0 if not found push "0" goto "${Index}-End" "${Index}-End:" !undef Index exch 2 pop $R0 pop $R1 !macroend # # Uninstaller sections # # # Removing viewer. # Section /o "-un.TightVNC Viewer" UN_SECTION_VIEWER Delete $INSTDIR\vncviewer.exe DeleteRegValue HKLM "${REGKEY}\Components" "TightVNC Viewer" # # Delete registry entries for .vnc extension # # FIXME: Check open command (if must be path to our viewer) before # delete it. # DeleteRegKey HKCR ".vnc" DeleteRegKey HKCR "VncViewer.Config" DeleteRegKey HKCR "VncViewer.Config\DefaultIcon" DeleteRegKey HKCR "VncViewer.Config\shell\open\command" ${RefreshShellIcons} # # Delete shortcuts # Delete "$SMPROGRAMS\$StartMenuGroup\${SC_TIGHTVNC_VIEWER}.lnk" SectionEnd Section /o "-un.TightVNC Server" UN_SECTION_SERVER # # Stop and unregister TightVNC Service # DetailPrint "Stopping and unregistering service" ExecWait "$INSTDIR\tvnserver.exe -remove -silent" Delete $INSTDIR\tvnserver.exe Delete $INSTDIR\screenhooks.dll DeleteRegValue HKLM "${REGKEY}\Components" "TightVNC Server" # # Delete shortcuts # Delete "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_REGISTER_TIGHTVNC_SERVICE}.lnk" Delete "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_START_TIGHTVNC_SERVICE}.lnk" Delete "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_STOP_TIGHTVNC_SERVICE}.lnk" Delete "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_CONTROL_TIGHTVNC_SERVICE}.lnk" Delete "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_CONFIGURE_TIGHTVNC_SERVICE}.lnk" Delete "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}\${SC_UNREGISTER_TIGHTVNC_SERVICE}.lnk" Delete "$SMPROGRAMS\$StartMenuGroup\${SC_APP_FOLDER}\${SC_TIGHTVNC_SERVER_APPLICATION_MODE}.lnk" Delete "$SMPROGRAMS\$StartMenuGroup\${SC_APP_FOLDER}\${SC_CONTROL_TIGHTVNC_SERVER_APPLICATION}.lnk" Delete "$SMPROGRAMS\$StartMenuGroup\${SC_APP_FOLDER}\${SC_CONFIGURE_TIGHTVNC_SERVER_APPLICATION}.lnk" RmDir "$SMPROGRAMS\$StartMenuGroup\${SC_SERVICE_FOLDER}" RmDir "$SMPROGRAMS\$StartMenuGroup\${SC_APP_FOLDER}" SectionEnd Section -un.post UN_SECTION_POST_UNINSTALL DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" Delete "$INSTDIR\LICENSE.txt" Delete "$INSTDIR\TightVNC Web Site.url" Delete $INSTDIR\uninstall.exe DeleteRegValue HKLM "${REGKEY}" StartMenuGroup DeleteRegValue HKLM "${REGKEY}" Path DeleteRegKey /IfEmpty HKLM "${REGKEY}\Components" DeleteRegKey /IfEmpty HKLM "${REGKEY}" Delete "$SMPROGRAMS\$StartMenuGroup\${SC_VISIT_TIGHTVNC_WEB_SITE}.lnk" RmDir $SMPROGRAMS\$StartMenuGroup RmDir $INSTDIR Push $R0 StrCpy $R0 $StartMenuGroup 1 StrCmp $R0 ">" no_smgroup no_smgroup: Pop $R0 SectionEnd # These variables will contain HWND handles for checkbox controls # or zero values if the corresponding controls will not be created. var CheckBox_RegisterService var CheckBox_ConfigureService var CheckBox_AllowSasGeneration var CheckBox_AssociateVncExtension var CheckBox_ConfigureFirewall var EnterPasswords # -------------------------------------------------------------------------- # Task page definitions # -------------------------------------------------------------------------- LangString TASK_PAGE_TITLE ${LANG_ENGLISH} "Select Additional Tasks" LangString TASK_PAGE_SUBTITLE ${LANG_ENGLISH} "Which additional tasks should be performed?" # Task page functions Function createTaskPage # Clear variables linked to checkboxes. StrCpy $CheckBox_RegisterService 0 StrCpy $CheckBox_ConfigureService 0 StrCpy $CheckBox_AllowSasGeneration 0 StrCpy $CheckBox_AssociateVncExtension 0 StrCpy $CheckBox_ConfigureFirewall 0 # Unselect all sections corresponding to additional tasks. !insertmacro UnSelectSection ${SECTION_DELETE_OLD_TIGHTVNC} !insertmacro UnSelectSection ${SECTION_REGISTER_SERVICE} !insertmacro UnSelectSection ${SECTION_ALLOW_SAS_GENERATION} !insertmacro UnSelectSection ${SECTION_REGISTER_VNC_FILE_EXTENSION} !insertmacro UnSelectSection ${SECTION_CONFIGURE_WINDOWS_FIREWALL} # # If neither viewer nor server sections are selected, # don't show this dialog and don't perform any additional tasks. # SectionGetFlags ${SECTION_SERVER} $R0 SectionGetFlags ${SECTION_VIEWER} $R1 IntOp $R0 $R0 & ${SF_SELECTED} IntOp $R1 $R1 & ${SF_SELECTED} ${If} $R0 == 0 ${AndIf} $R1 == 0 Abort ${EndIf} # # Dialog code. # !insertmacro MUI_HEADER_TEXT $(TASK_PAGE_TITLE) $(TASK_PAGE_SUBTITLE) nsDialogs::Create 1018 Pop $0 ${NSD_CreateLabel} 0 0 100% 20u "Select additional tasks you would like Setup to perform while installing ${APP_NAME} ${VERSION}, then click Next." Pop $0 ${If} $R1 == ${SF_SELECTED} ${NSD_CreateLabel} 0 40 100% 10u "File associations:" Pop $0 ${NSD_CreateCheckBox} 10 60 100% 10u "Associate .vnc files with TightVNC Viewer" Pop $CheckBox_AssociateVncExtension ${NSD_SetState} $CheckBox_AssociateVncExtension 1 ${EndIf} ${If} $R0 == ${SF_SELECTED} ${NSD_CreateLabel} 0 90 100% 10u "TightVNC Service configuration:" Pop $0 ${NSD_CreateCheckBox} 10 110 100% 10u "Register TightVNC Server as a system service (recommended)" Pop $CheckBox_RegisterService ${NSD_SetState} $CheckBox_RegisterService 1 ${NSD_OnClick} $CheckBox_RegisterService onClickRegisterCB ${NSD_CreateCheckBox} 10 130 100% 10u "Set passwords for the service before finishing the installation" Pop $CheckBox_ConfigureService # Check if the server is configured already, set initial checkbox state. Call CheckConfigureService # Create a checkbox to allow software SAS generation, but only if it was not allowed already. ${If} ${AtLeastWinVista} ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "SoftwareSASGeneration" IntOp $0 $0 & 1 ${If} $0 != 1 ${NSD_CreateCheckBox} 10 150 100% 10u "Configure system to allow services simulate Ctrl-Alt-Del" Pop $CheckBox_AllowSasGeneration ${NSD_SetState} $CheckBox_AllowSasGeneration 1 ${EndIf} ${EndIf} ${EndIf} # Windows XP SP2 or Windows 2003 Server or higher. ${If} ${IsWinXP} ${AndIf} ${AtLeastServicePack} 2 ${OrIf} ${AtLeastWin2003} ${NSD_CreateLabel} 0 180 100% 10u "Windows Firewall configuration:" Pop $0 ${NSD_CreateCheckBox} 10 200 100% 10u "Add exception for TightVNC to Windows Firewall" Pop $CheckBox_ConfigureFirewall ${NSD_SetState} $CheckBox_ConfigureFirewall 1 ${EndIf} nsDialogs::Show FunctionEnd Function leaveTaskPage ${If} $CheckBox_AssociateVncExtension != 0 ${NSD_GetState} $CheckBox_AssociateVncExtension $0 IntOp $1 0 + 0 ${If} $0 == ${BST_CHECKED} IntOp $1 ${SF_SELECTED} | ${SF_RO} ${EndIf} SectionSetFlags ${SECTION_REGISTER_VNC_FILE_EXTENSION} $1 ${EndIf} ${If} $CheckBox_RegisterService != 0 ${NSD_GetState} $CheckBox_RegisterService $0 IntOp $1 0 + 0 ${If} $0 == ${BST_CHECKED} IntOp $1 ${SF_SELECTED} | ${SF_RO} ${EndIf} SectionSetFlags ${SECTION_REGISTER_SERVICE} $1 ${EndIf} ${If} $CheckBox_ConfigureService != 0 ${NSD_GetState} $CheckBox_ConfigureService $0 IntOp $1 0 + 0 ${If} $0 == ${BST_CHECKED} IntOp $1 ${SF_SELECTED} | ${SF_RO} ${EndIf} IntOp $EnterPasswords $1 + 0 ${EndIf} ${If} $CheckBox_AllowSasGeneration != 0 ${NSD_GetState} $CheckBox_AllowSasGeneration $0 IntOp $1 0 + 0 ${If} $0 == ${BST_CHECKED} IntOp $1 ${SF_SELECTED} | ${SF_RO} ${EndIf} SectionSetFlags ${SECTION_ALLOW_SAS_GENERATION} $1 ${EndIf} ${If} $CheckBox_ConfigureFirewall != 0 ${NSD_GetState} $CheckBox_ConfigureFirewall $0 IntOp $1 0 + 0 ${If} $0 == ${BST_CHECKED} IntOp $1 ${SF_SELECTED} | ${SF_RO} ${EndIf} SectionSetFlags ${SECTION_CONFIGURE_WINDOWS_FIREWALL} $1 ${EndIf} # # Try to detect old TightVNC # ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TightVNC_is1" "QuietUninstallString" ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TightVNC_is1" "DisplayName" ${If} $0 != "" MessageBox MB_YESNO "$1 has been detected on your system, do you want to remove it?" IDYES true IDNO false true: !insertmacro SelectSection ${SECTION_DELETE_OLD_TIGHTVNC} goto next false: !insertmacro UnSelectSection ${SECTION_DELETE_OLD_TIGHTVNC} goto next next: ${EndIf} FunctionEnd Function onClickRegisterCB Pop $0 # control HWND ${NSD_GetState} $0 $1 ${If} $CheckBox_ConfigureService != 0 ${If} $1 == 0 ${NSD_Setstate} $CheckBox_ConfigureService 0 ${Else} Call CheckConfigureService ${EndIf} EnableWindow $CheckBox_ConfigureService $1 ${EndIf} ${If} $CheckBox_AllowSasGeneration != 0 ${NSD_Setstate} $CheckBox_AllowSasGeneration $1 EnableWindow $CheckBox_AllowSasGeneration $1 ${EndIf} FunctionEnd Function CheckConfigureService Push $0 Push $1 ${NSD_SetState} $CheckBox_ConfigureService 1 ReadRegDWORD $0 HKLM "Software\TightVNC\Server" "UseVncAuthentication" ReadRegDWORD $1 HKLM "Software\TightVNC\Server" "UseControlAuthentication" ${If} $0 == 1 ${AndIf} $1 == 1 # Both keys are are set to 1. !insertmacro IfKeyExists HKLM Software\TightVNC\Server "Password" Pop $0 !insertmacro IfKeyExists HKLM Software\TightVNC\Server "ControlPassword" Pop $1 ${If} $0 == 1 ${AndIf} $1 == 1 # Both keys exist, passwords already set. ${NSD_SetState} $CheckBox_ConfigureService 0 ${Endif} ${EndIf} Pop $1 Pop $0 FunctionEnd # -------------------------------------------------------------------------- # Config page definitions # -------------------------------------------------------------------------- LangString CONFIG_PAGE_TITLE ${LANG_ENGLISH} "Service Configuration" LangString CONFIG_PAGE_SUBTITLE ${LANG_ENGLISH} "Secure the TightVNC Server (service mode)" var UseVncAuthCB var UseControlAuthCB var SkipConfigCB var VncPassTB var VncPassConfirmTB var ControlPassTB var ControlPassConfirmTB Function createConfigPage !insertmacro MUI_HEADER_TEXT $(CONFIG_PAGE_TITLE) $(CONFIG_PAGE_SUBTITLE) # # Don't show this page if register service isn't selected. # ${if} $EnterPasswords == 0 Abort ${EndIf} SectionGetFlags ${SECTION_REGISTER_SERVICE} $R0 IntOp $R0 $R0 & ${SF_SELECTED} ${If} $R0 == 0 Abort ${EndIf} nsDialogs::Create 1018 Pop $0 # # Password for VNC authentication # ${NSD_CreateCheckBox} 0 0 100% 10u "Use authentication for RFB connections (make sure this box is always checked!)" Pop $UseVncAuthCB ${NSD_OnClick} $UseVncAuthCB onAuthCBChange ${NSD_CreateLabel} 16 28 100 10u "Enter password:" Pop $0 ${NSD_CreatePassword} 120 25 100 12u "" Pop $VncPassTB ${NSD_SetTextLimit} $VncPassTB 8 ${NSD_CreateLabel} 16 54 100 10u "Confirm password:" Pop $0 ${NSD_CreatePassword} 120 51 100 12u "" Pop $VncPassConfirmTB ${NSD_SetTextLimit} $VncPassConfirmTB 8 # # Control password # ${NSD_CreateCheckBox} 0 90 100% 10u "Protect control interface with an administrative password" Pop $UseControlAuthCB ${NSD_OnClick} $UseControlAuthCB onAuthCBChange ${NSD_CreateLabel} 16 118 170 10u "Enter administrative password:" Pop $0 ${NSD_CreatePassword} 190 115 100 12u "" Pop $ControlPassTB ${NSD_SetTextLimit} $ControlPassTB 8 ${NSD_CreateLabel} 16 144 170 10u "Confirm administrative password:" Pop $0 ${NSD_CreatePassword} 190 141 100 12u "" Pop $ControlPassConfirmTB ${NSD_SetTextLimit} $ControlPassConfirmTB 8 # # Skip config checkbox # ${NSD_CreateCheckBox} 0 210 100% 10u "Skip this step, set passwords after the installation" Pop $SkipConfigCB ${NSD_OnClick} $SkipConfigCB onSkipConfigCBChange # # Set checked state to checkboxes # ${NSD_SetState} $UseVncAuthCB ${BST_CHECKED} ${NSD_SetState} $UseControlAuthCB ${BST_CHECKED} ${NSD_SetState} $SkipConfigCB ${BST_UNCHECKED} # # Update controls on page like when user clicks on "Skip config" check box. # Push $SkipConfigCB Call onSkipConfigCBChange nsDialogs::Show FunctionEnd Function leaveConfigPage # # Skip saving config if "Skip config" checbox is selected # ${NSD_GetState} $SkipConfigCB $0 ${If} $0 == ${BST_CHECKED} Return ${EndIf} # # Saving configuration. # IntOp $1 0 + 0 IntOp $2 0 + 0 SetOutPath $TEMP File tvnserver.exe ${NSD_GetState} $UseVncAuthCB $3 ${If} $3 == ${BST_CHECKED} ${NSD_GetText} $VncPassTB $4 ${NSD_GetText} $VncPassConfirmTB $5 ${If} $4 == "" MessageBox MB_OK|MB_ICONEXCLAMATION "Password is empty." Abort ${EndIf} ${If} $4 != $5 MessageBox MB_OK|MB_ICONEXCLAMATION "Passwords do not match." Abort ${EndIf} ExecWait '"$TEMP\tvnserver.exe" -setservicevncpass "$4"' IntOp $1 0 + 1 ${EndIf} ${NSD_GetState} $UseControlAuthCB $3 ${If} $3 == ${BST_CHECKED} ${NSD_GetText} $ControlPassTB $4 ${NSD_GetText} $ControlPassConfirmTB $5 ${If} $4 == "" MessageBox MB_OK|MB_ICONEXCLAMATION "Administrative password is empty." Abort ${EndIf} ${If} $4 != $5 MessageBox MB_OK|MB_ICONEXCLAMATION "Administrative passwords do not match." Abort ${EndIf} ExecWait '"$TEMP\tvnserver.exe" -setservicecontrolpass "$4"' IntOp $2 0 + 1 ${EndIf} WriteRegDWORD HKLM "Software\TightVNC\Server" "UseVncAuthentication" $1 WriteRegDWORD HKLM "Software\TightVNC\Server" "UseControlAuthentication" $2 Delete "$TEMP\tvnserver.exe" FunctionEnd Function onAuthCBChange Pop $0 # Hwnd IntOp $2 0 + 1 # Initial state - enabled ${NSD_GetState} $0 $1 # Checkbox state # If not checked than state - disabled ${If} $1 == ${BST_UNCHECKED} IntOp $2 0 + 0 ${EndIf} ${If} $0 == $UseControlAuthCB EnableWindow $ControlPassTB $2 EnableWindow $ControlPassConfirmTB $2 ${EndIf} ${If} $0 == $UseVncAuthCB EnableWindow $VncPassTB $2 EnableWindow $VncPassConfirmTB $2 ${EndIf} FunctionEnd Function onSkipConfigCBChange Pop $0 # Sender hwnd IntOp $1 0 + 1 # State for dependent controls ${NSD_GetState} $0 $2 ${If} $2 == ${BST_CHECKED} IntOp $1 0 + 0 ${EndIf} EnableWindow $ControlPassTB $1 EnableWindow $ControlPassConfirmTB $1 EnableWindow $VncPassTB $1 EnableWindow $VncPassConfirmTB $1 EnableWindow $UseVncAuthCB $1 EnableWindow $UseControlAuthCB $1 FunctionEnd # --------------------------------------------------------------------------- # Other stuff # --------------------------------------------------------------------------- # Installer functions Function .onInit !insertmacro MULTIUSER_INIT InitPluginsDir FunctionEnd # Uninstaller functions Function un.onInit !insertmacro MULTIUSER_UNINIT ReadRegStr $INSTDIR HKLM "${REGKEY}" Path !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup !insertmacro SELECT_UNSECTION "TightVNC Server" ${UN_SECTION_SERVER} !insertmacro SELECT_UNSECTION "TightVNC Viewer" ${UN_SECTION_VIEWER} FunctionEnd # Section Descriptions !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SECTION_SERVER} "TightVNC Server makes a computer accessible for remote viewers" !insertmacro MUI_DESCRIPTION_TEXT ${SECTION_VIEWER} "TightVNC Viewer is used to view and control other computers remotely" !insertmacro MUI_FUNCTION_DESCRIPTION_END