diff --git a/packaging/nsis/AdditionalTasksPage.ini b/packaging/nsis/AdditionalTasksPage.ini new file mode 100644 index 0000000000..c920ec09f1 --- /dev/null +++ b/packaging/nsis/AdditionalTasksPage.ini @@ -0,0 +1,65 @@ +[Settings] +NumFields=7 + +[Field 1] +Type=GroupBox +Left=0 +Right=-1 +Top=0 +Bottom=45 +Text=Ethereal Shortcuts +State=1 + +[Field 2] +Type=CheckBox +Left=10 +Right=-1 +Top=10 +Bottom=18 +Text=Start Menu Group +State=1 + +[Field 3] +Type=CheckBox +Left=10 +Right=-1 +Top=20 +Bottom=28 +Text=Desktop Icon +State=1 + +[Field 4] +Type=CheckBox +Left=10 +Right=-1 +Top=30 +Bottom=38 +Text=Quick Launch Icon +State=1 + +[Field 5] +Type=GroupBox +Left=0 +Right=-1 +Top=50 +Bottom=85 +Text=File Extensions +State=1 + +[Field 6] +Type=CheckBox +Left=10 +Right=-1 +Top=60 +Bottom=68 +Text=Associate trace file extensions to Ethereal (5vw, acp, apc, atc, bfr, +State=1 + +[Field 7] +Type=Label +Left=20 +Right=280 +Top=70 +Bottom=78 +Text=cap, enc, erf, fdc, pcap, pkt, snoop, syc, tpc, tr1, trace, trc, wpc, wpz) + diff --git a/packaging/nsis/Makefile.am b/packaging/nsis/Makefile.am index 73637ea6f1..ec69028721 100644 --- a/packaging/nsis/Makefile.am +++ b/packaging/nsis/Makefile.am @@ -5,4 +5,8 @@ EXTRA_DIST = \ ethereal.nsi \ ../../COPYING \ GetWindowsVersion.nsh \ + servicelib.nsh \ + AdditionalTasksPage.ini \ + WinPcapPage.ini \ + WinPcap_3_0.exe \ Makefile.nmake diff --git a/packaging/nsis/Makefile.nmake b/packaging/nsis/Makefile.nmake index f008688657..16a068221f 100644 --- a/packaging/nsis/Makefile.nmake +++ b/packaging/nsis/Makefile.nmake @@ -42,7 +42,7 @@ EXE=../../tethereal.exe ../../editcap.exe \ !IFDEF GTK2_DIR ../../ethereal-gtk2.exe \ !ENDIF - ../../text2pcap.exe ../../mergecap.exe ../../capinfos.exe + ../../text2pcap.exe ../../mergecap.exe ../../capinfos.exe WinPcap_3_0.exe DLL=../../wiretap/wiretap-$(WTAP_VERSION).dll DOC=../../doc/ethereal.html \ ../../doc/tethereal.html \ @@ -89,6 +89,12 @@ PLUGINS=../../plugins/acn/acn.dll \ ../../plugins/v5ua/v5ua.dll \ ../../plugins/xml/xml.dll +NSI=ethereal.nsi \ + GetWindowsVersion.nsh \ + servicelib.nsh \ + AdditionalTasksPage.ini \ + WinPcapPage.ini + DELIVERABLES=$(EXE) $(DLL) $(DOC) $(DOC_dos) $(GPL) $(HELP) $(PLUGINS) all: NEWS.txt $(DEST)-setup-$(VERSION).exe @@ -96,7 +102,7 @@ all: NEWS.txt $(DEST)-setup-$(VERSION).exe NEWS.txt: ../../NEWS $(UNIX2DOS) < ../../NEWS > NEWS.txt -$(DEST)-setup-$(VERSION).exe : ethereal.nsi $(DELIVERABLES) Makefile.nmake +$(DEST)-setup-$(VERSION).exe : $(NSI) $(DELIVERABLES) Makefile.nmake $(MAKENSIS) \ /DDEST=$(DEST) \ !IF "$(MAKENSIS_MODERN_UI)" != "" diff --git a/packaging/nsis/WinPcapPage.ini b/packaging/nsis/WinPcapPage.ini new file mode 100644 index 0000000000..576a2daf74 --- /dev/null +++ b/packaging/nsis/WinPcapPage.ini @@ -0,0 +1,79 @@ +[Settings] +NumFields=9 + +[Field 1] +Type=GroupBox +Left=0 +Right=-1 +Top=0 +Bottom=25 +Text=Currently installed WinPcap version + +[Field 2] +Type=Label +Left=10 +Right=250 +Top=10 +Bottom=18 +Text=This text will be replaced with current WinPcap installer version + +[Field 3] +Type=GroupBox +Left=0 +Right=-1 +Top=30 +Bottom=65 +Text=Install + +[Field 4] +Type=CheckBox +Left=10 +Right=250 +Top=40 +Bottom=48 +Text=This text will be replaced, depending on current WinPcap version in ethereal.nsi +State=1 + +[Field 5] +Type=Label +Left=20 +Right=290 +Top=50 +Bottom=58 +Text=This text will be replaced, depending if WinPcap is already installed + +[Field 6] +Type=Button +Left=0 +Right=150 +Top=120 +Bottom=135 +Text=WinPcap info at the Ethereal Wiki +State=http://wiki.ethereal.com/WinPcap + +[Field 7] +Type=GroupBox +Left=0 +Right=-1 +Top=70 +Bottom=105 +Text=Services +State=1 + +[Field 8] +Type=CheckBox +Left=10 +Right=250 +Top=80 +Bottom=88 +Text=Start Winpcap service "NPF" at startup +State=0 + +[Field 9] +Type=Label +Left=20 +Right=250 +Top=90 +Bottom=98 +Text=(so users with restricted privileges can capture) + diff --git a/packaging/nsis/WinPcap_3_0.exe b/packaging/nsis/WinPcap_3_0.exe new file mode 100644 index 0000000000..df2259f4fe Binary files /dev/null and b/packaging/nsis/WinPcap_3_0.exe differ diff --git a/packaging/nsis/ethereal.nsi b/packaging/nsis/ethereal.nsi index 268909e993..97e1219229 100644 --- a/packaging/nsis/ethereal.nsi +++ b/packaging/nsis/ethereal.nsi @@ -6,7 +6,8 @@ !ifdef MAKENSIS_MODERN_UI ; Set the compression mechanism first -SetCompressor lzma +; as of NSIS 2.07, solid compression is no longer default, so set the /SOLID switch (saves ~1MB) +;SetCompressor /SOLID lzma !endif !ifdef GTK1_DIR & GTK2_DIR @@ -14,6 +15,9 @@ InstType "Ethereal (GTK2 user interface)" InstType "Ethereal (legacy GTK1 user interface)" !endif +InstType "un.Default (keep Personal Settings and WinPcap)" +InstType "un.All (remove all)" + ; Used to refresh the display of file association !define SHCNE_ASSOCCHANGED 0x08000000 !define SHCNF_IDLIST 0 @@ -21,7 +25,6 @@ InstType "Ethereal (legacy GTK1 user interface)" ; Used to add associations between file extensions and Ethereal !define ETHEREAL_ASSOC "ethereal-file" - ; ============================================================================ ; Header configuration ; ============================================================================ @@ -55,6 +58,7 @@ XPStyle on ; If you are using a different version, it's not predictable what will happen. !include "MUI.nsh" +;!addplugindir ".\Plugins" !define MUI_ICON "..\..\image\ethereal.ico" !define MUI_UNICON "..\..\image\ethereal.ico" @@ -63,8 +67,8 @@ XPStyle on !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_UNFINISHPAGE_NOAUTOCLOSE !define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Ethereal.\r\n\r\nBefore starting the installation, make sure Ethereal is not running.\r\n\r\nClick 'Next' to continue." -!define MUI_FINISHPAGE_LINK "Install WinPcap to be able to capture packets from a network!" -!define MUI_FINISHPAGE_LINK_LOCATION "http://winpcap.polito.it" +;!define MUI_FINISHPAGE_LINK "Install WinPcap to be able to capture packets from a network!" +;!define MUI_FINISHPAGE_LINK_LOCATION "http://www.winpcap.org" ; NSIS shows Readme files by opening the Readme file with the default application for ; the file's extension. "README.win32" won't work in most cases, because extension "win32" @@ -73,6 +77,10 @@ XPStyle on !define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\NEWS.txt" !define MUI_FINISHPAGE_SHOWREADME_TEXT "Show News" !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED +!define MUI_FINISHPAGE_RUN "$INSTDIR\ethereal.exe" +!define MUI_FINISHPAGE_RUN_NOTCHECKED + + !define MUI_PAGE_CUSTOMFUNCTION_SHOW myShowCallback @@ -83,12 +91,15 @@ XPStyle on !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "..\..\COPYING" !insertmacro MUI_PAGE_COMPONENTS +Page custom DisplayAdditionalTasksPage !insertmacro MUI_PAGE_DIRECTORY +Page custom DisplayWinPcapPage !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_COMPONENTS !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH @@ -100,6 +111,17 @@ XPStyle on !endif ; MAKENSIS_MODERN_UI +; ============================================================================ +; Reserve Files +; ============================================================================ + + ;Things that need to be extracted on first (keep these lines before any File command!) + ;Only useful for BZIP2 compression + + ReserveFile "AdditionalTasksPage.ini" + ReserveFile "WinPcapPage.ini" + !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS + ; ============================================================================ ; Section macros ; ============================================================================ @@ -130,6 +152,11 @@ XPStyle on !macroend +; ============================================================================ +; Services +; ============================================================================ +!include "servicelib.nsh" + ; ============================================================================ ; License page configuration ; ============================================================================ @@ -163,6 +190,7 @@ InstallDirRegKey HKEY_LOCAL_MACHINE SOFTWARE\Ethereal "InstallDir" ; Install page configuration ; ============================================================================ ShowInstDetails show +ShowUninstDetails show ; ============================================================================ ; Functions and macros @@ -225,10 +253,29 @@ un.unlink.end: pop $R1 FunctionEnd +Function .onInit + ;Extract InstallOptions INI files + !insertmacro MUI_INSTALLOPTIONS_EXTRACT "AdditionalTasksPage.ini" + !insertmacro MUI_INSTALLOPTIONS_EXTRACT "WinpcapPage.ini" +FunctionEnd + +Function DisplayAdditionalTasksPage + !insertmacro MUI_HEADER_TEXT "Select Additional Tasks" "Which additional tasks should be done?" + !insertmacro MUI_INSTALLOPTIONS_DISPLAY "AdditionalTasksPage.ini" +FunctionEnd + +Function DisplayWinPcapPage + !insertmacro MUI_HEADER_TEXT "Install WinPcap?" "WinPcap is required to capture live network data. Should WinPcap be installed?" + !insertmacro MUI_INSTALLOPTIONS_DISPLAY "WinPcapPage.ini" +FunctionEnd + ; ============================================================================ ; Installation execution commands ; ============================================================================ +Var WINPCAP_UNINSTALL ;declare variable for holding the value of a registry key +;Var ETHEREAL_UNINSTALL ;declare variable for holding the value of a registry key + Section "-Required" ;------------------------------------------- @@ -240,6 +287,8 @@ SectionIn 1 2 RO !endif SetShellVarContext all + + SetOutPath $INSTDIR File "..\..\wiretap\wiretap-${WTAP_VERSION}.dll" !ifdef ENABLE_LIBETHEREAL @@ -391,9 +440,114 @@ WriteUninstaller "uninstall.exe" WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\App Paths\ethereal.exe" "" '$INSTDIR\ethereal.exe' WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\App Paths\ethereal.exe" "Path" '$INSTDIR' -SectionEnd +; Create start menu entries (depending on additional tasks page) +ReadINIStr $0 "$PLUGINSDIR\AdditionalTasksPage.ini" "Field 2" "State" +StrCmp $0 "0" SecRequired_skip_StartMenu +SetOutPath $PROFILE +CreateDirectory "$SMPROGRAMS\Ethereal" +; To qoute "http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwue/html/ch11d.asp": +; "Do not include Readme, Help, or Uninstall entries on the Programs menu." +Delete "$SMPROGRAMS\Ethereal\Ethereal Web Site.lnk" +;WriteINIStr "$SMPROGRAMS\Ethereal\Ethereal Web Site.url" "InternetShortcut" "URL" "http://www.ethereal.com/" +CreateShortCut "$SMPROGRAMS\Ethereal\Ethereal.lnk" "$INSTDIR\ethereal.exe" "" "$INSTDIR\ethereal.exe" 0 "" "" "The Ethereal Network Protocol Analyzer" +;CreateShortCut "$SMPROGRAMS\Ethereal\Ethereal Manual.lnk" "$INSTDIR\ethereal.html" +;CreateShortCut "$SMPROGRAMS\Ethereal\Display Filters Manual.lnk" "$INSTDIR\ethereal-filter.html" +CreateShortCut "$SMPROGRAMS\Ethereal\Ethereal Program Directory.lnk" \ + "$INSTDIR" +;CreateShortCut "$SMPROGRAMS\Ethereal\Uninstall Ethereal.lnk" "$INSTDIR\uninstall.exe" +SecRequired_skip_StartMenu: -SectionGroup "Ethereal" + +; Create desktop icon (depending on additional tasks page) +ReadINIStr $0 "$PLUGINSDIR\AdditionalTasksPage.ini" "Field 3" "State" +StrCmp $0 "0" SecRequired_skip_DesktopIcon +CreateShortCut "$DESKTOP\Ethereal.lnk" "$INSTDIR\ethereal.exe" "" "$INSTDIR\ethereal.exe" 0 "" "" "The Ethereal Network Protocol Analyzer" +SecRequired_skip_DesktopIcon: + +; Create quick launch icon (depending on additional tasks page) +ReadINIStr $0 "$PLUGINSDIR\AdditionalTasksPage.ini" "Field 4" "State" +StrCmp $0 "0" SecRequired_skip_QuickLaunchIcon +CreateShortCut "$QUICKLAUNCH\Ethereal.lnk" "$INSTDIR\ethereal.exe" "" "$INSTDIR\ethereal.exe" 0 "" "" "The Ethereal Network Protocol Analyzer" +SecRequired_skip_QuickLaunchIcon: + +; Create File Extensions (depending on additional tasks page) +ReadINIStr $0 "$PLUGINSDIR\AdditionalTasksPage.ini" "Field 6" "State" +StrCmp $0 "0" SecRequired_skip_FileExtensions +WriteRegStr HKCR ${ETHEREAL_ASSOC} "" "Ethereal file" +WriteRegStr HKCR "${ETHEREAL_ASSOC}\Shell\open\command" "" '"$INSTDIR\ethereal.exe" "%1"' +WriteRegStr HKCR "${ETHEREAL_ASSOC}\DefaultIcon" "" '"$INSTDIR\ethereal.exe",0' +push $R0 + StrCpy $R0 ".5vw" + Call Associate + StrCpy $R0 ".acp" + Call Associate + StrCpy $R0 ".apc" + Call Associate + StrCpy $R0 ".atc" + Call Associate + StrCpy $R0 ".bfr" + Call Associate + StrCpy $R0 ".cap" + Call Associate + StrCpy $R0 ".enc" + Call Associate + StrCpy $R0 ".erf" + Call Associate + StrCpy $R0 ".fdc" + Call Associate + StrCpy $R0 ".pcap" + Call Associate + StrCpy $R0 ".pkt" + Call Associate + StrCpy $R0 ".snoop" + Call Associate + StrCpy $R0 ".syc" + Call Associate + StrCpy $R0 ".tpc" + Call Associate + StrCpy $R0 ".tr1" + Call Associate + StrCpy $R0 ".trace" + Call Associate + StrCpy $R0 ".trc" + Call Associate + StrCpy $R0 ".wpc" + Call Associate + StrCpy $R0 ".wpz" + Call Associate +; if somethings added here, add it also to the uninstall section and the AdditionalTask page +pop $R0 +!insertmacro UpdateIcons +SecRequired_skip_FileExtensions: + +; Install WinPcap (depending on winpcap page setting) +ReadINIStr $0 "$PLUGINSDIR\WinPcapPage.ini" "Field 4" "State" +StrCmp $0 "0" SecRequired_skip_Winpcap +; Uinstall old WinPcap first +ReadRegStr $WINPCAP_UNINSTALL HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "UninstallString" +IfErrors lbl_winpcap_notinstalled ;if RegKey is unavailable, WinPcap is not installed +ExecWait '$WINPCAP_UNINSTALL' $0 +DetailPrint "WinPcap uninstaller returned $0" +lbl_winpcap_notinstalled: +SetOutPath $INSTDIR +File "WinPcap_3_0.exe" +ExecWait '"$INSTDIR\WinPcap_3_0.exe"' $0 +DetailPrint "WinPcap installer returned $0" +SecRequired_skip_Winpcap: + +; Load Winpcap NPF service at startup (depending on additional tasks page) +ReadINIStr $0 "$PLUGINSDIR\WinPcapPage.ini" "Field 8" "State" +StrCmp $0 "0" SecRequired_skip_WinpcapService +WriteRegDWORD HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Services\NPF" "Start" 2 ;set NPF to (SERVICE_AUTO_START) +; we have to tell the installer, we need a reboot! +;SetRebootFlag true +!insertmacro SERVICE "start" "NPF" "" +SecRequired_skip_WinpcapService: + +SectionEnd ; "Required" + + +SectionGroup "!Ethereal" SecEtherealGroup !ifdef GTK1_DIR Section "Ethereal GTK1" SecEtherealGTK1 @@ -459,7 +613,7 @@ File "..\..\tethereal.exe" File "..\..\doc\tethereal.html" SectionEnd -SectionGroup "Plugins / Extensions" +SectionGroup "Plugins / Extensions" SecPluginsGroup Section "Dissector Plugins" SecPlugins ;------------------------------------------- @@ -521,7 +675,7 @@ SectionEnd SectionGroupEnd ; "Plugins / Extensions" -SectionGroup "Tools" +SectionGroup "Tools" SecToolsGroup Section "Editcap" SecEditcap ;------------------------------------------- @@ -566,102 +720,13 @@ SectionEnd SectionGroupEnd ; "Tools" -SectionGroup "Icons / Shortcuts" - -; SectionDivider -;------------------------------------------- - -Section "Start Menu Shortcuts" SecShortcuts -;------------------------------------------- -!ifdef GTK1_DIR & GTK2_DIR -SectionIn 1 2 -!endif -SetOutPath $PROFILE -CreateDirectory "$SMPROGRAMS\Ethereal" - -Delete "$SMPROGRAMS\Ethereal\Ethereal Web Site.lnk" -WriteINIStr "$SMPROGRAMS\Ethereal\Ethereal Web Site.url" \ - "InternetShortcut" "URL" "http://www.ethereal.com/" -CreateShortCut "$SMPROGRAMS\Ethereal\Ethereal.lnk" "$INSTDIR\ethereal.exe" "" "$INSTDIR\ethereal.exe" 0 "" "" "The Ethereal Network Protocol Analyzer" -CreateShortCut "$SMPROGRAMS\Ethereal\Ethereal Manual.lnk" "$INSTDIR\ethereal.html" -CreateShortCut "$SMPROGRAMS\Ethereal\Display Filters Manual.lnk" "$INSTDIR\ethereal-filter.html" -CreateShortCut "$SMPROGRAMS\Ethereal\Ethereal Program Directory.lnk" \ - "$INSTDIR" -CreateShortCut "$SMPROGRAMS\Ethereal\Uninstall Ethereal.lnk" "$INSTDIR\uninstall.exe" -SectionEnd - -Section "Desktop Icon" SecDesktopIcon -;------------------------------------------- -!ifdef GTK1_DIR & GTK2_DIR -SectionIn 1 2 -!endif -CreateShortCut "$DESKTOP\Ethereal.lnk" "$INSTDIR\ethereal.exe" "" "$INSTDIR\ethereal.exe" 0 "" "" "The Ethereal Network Protocol Analyzer" -SectionEnd - -Section "Associate file extensions to Ethereal" SecFileExtensions -;------------------------------------------- -!ifdef GTK1_DIR & GTK2_DIR -SectionIn 1 2 -!endif -WriteRegStr HKCR ${ETHEREAL_ASSOC} "" "Ethereal file" -WriteRegStr HKCR "${ETHEREAL_ASSOC}\Shell\open\command" "" '"$INSTDIR\ethereal.exe" "%1"' -WriteRegStr HKCR "${ETHEREAL_ASSOC}\DefaultIcon" "" '"$INSTDIR\ethereal.exe",0' -push $R0 - StrCpy $R0 ".5vw" - Call Associate - StrCpy $R0 ".acp" - Call Associate - StrCpy $R0 ".apc" - Call Associate - StrCpy $R0 ".atc" - Call Associate - StrCpy $R0 ".bfr" - Call Associate - StrCpy $R0 ".cap" - Call Associate - StrCpy $R0 ".enc" - Call Associate - StrCpy $R0 ".erf" - Call Associate - StrCpy $R0 ".fdc" - Call Associate - StrCpy $R0 ".pcap" - Call Associate - StrCpy $R0 ".pkt" - Call Associate - StrCpy $R0 ".snoop" - Call Associate - StrCpy $R0 ".syc" - Call Associate - StrCpy $R0 ".tpc" - Call Associate - StrCpy $R0 ".tr1" - Call Associate - StrCpy $R0 ".trace" - Call Associate - StrCpy $R0 ".trc" - Call Associate - StrCpy $R0 ".wpc" - Call Associate - StrCpy $R0 ".wpz" - Call Associate -pop $R0 -!insertmacro UpdateIcons -SectionEnd - -SectionGroupEnd ; "Icons / Shortcuts" - -Section "Load Winpcap NPF service at startup" SecNPFservice -;------------------------------------------- - WriteRegDWORD HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Services\NPF" "Start" 2 ;set NPF to (SERVICE_AUTO_START) -SectionEnd - -Section "Uninstall" +Section "Uninstall" un.SecUinstall ;------------------------------------------- ; ; UnInstall for every user ; +SectionIn 1 2 SetShellVarContext all Delete "$INSTDIR\tethereal.exe" @@ -739,8 +804,6 @@ Delete "$INSTDIR\lib\pango\1.2.0\modules\*.*" Delete "$INSTDIR\lib\pango\1.4.0\modules\*.*" Delete "$INSTDIR\share\themes\Default\gtk-2.0\*.*" Delete "$INSTDIR\help\*.*" -Delete "$INSTDIR\plugins\${VERSION}\*.*" -Delete "$INSTDIR\plugins\*.*" Delete "$INSTDIR\diameter\*.*" Delete "$INSTDIR\snmp\mibs\*.*" Delete "$INSTDIR\snmp\*.*" @@ -758,6 +821,7 @@ Delete "$INSTDIR\pcrepattern.3.txt" Delete "$INSTDIR\radius\*.*" Delete "$SMPROGRAMS\Ethereal\*.*" Delete "$DESKTOP\Ethereal.lnk" +Delete "$QUICKLAUNCH\Ethereal.lnk" RMDir "$INSTDIR\etc\gtk-2.0" RMDir "$INSTDIR\etc\pango" @@ -783,48 +847,101 @@ RMDir "$INSTDIR\share\themes" RMDir "$INSTDIR\share" RMDir "$SMPROGRAMS\Ethereal" RMDir "$INSTDIR\help" -RMDir "$INSTDIR\plugins\${VERSION}" -RMDir "$INSTDIR\plugins" RMDir "$INSTDIR\diameter" RMDir "$INSTDIR\snmp\mibs" RMDir "$INSTDIR\snmp" RMDir "$INSTDIR\radius" RMDir "$INSTDIR" -IfFileExists "$INSTDIR" 0 NoFinalErrorMsg - MessageBox MB_OK "Please note: The directory $INSTDIR could not be removed!" IDOK 0 ; skipped if file doesn't exist -NoFinalErrorMsg: +SectionEnd ; "Uinstall" +Section "Un.Plugins" un.SecPlugins +;------------------------------------------- +SectionIn 1 2 +;Delete "$INSTDIR\plugins\${VERSION}\*.*" +;Delete "$INSTDIR\plugins\*.*" +;RMDir "$INSTDIR\plugins\${VERSION}" +;RMDir "$INSTDIR\plugins" +RMDir /r "$INSTDIR\plugins" SectionEnd +Section "Un.Global Settings" un.SecGlobalSettings +;------------------------------------------- +SectionIn 1 2 +Delete "$INSTDIR\cfilters" +Delete "$INSTDIR\colorfilters" +Delete "$INSTDIR\dfilters" +RMDir "$INSTDIR" +SectionEnd + +Section /o "Un.Personal Settings" un.SecPersonalSettings +;------------------------------------------- +SectionIn 2 +SetShellVarContext current +Delete "$APPDATA\Ethereal\*.*" +RMDir "$APPDATA\Ethereal" +SectionEnd + +;VAR un.WINPCAP_UNINSTALL + +Section /o "Un.WinPcap" un.SecWinPcap +;------------------------------------------- +SectionIn 2 +ReadRegStr $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "UninstallString" +;IfErrors un.lbl_winpcap_notinstalled ;if RegKey is unavailable, WinPcap is not installed +;MessageBox MB_OK "WinPcap $1" +ExecWait '$1' $0 +DetailPrint "WinPcap uninstaller returned $0" +;SetRebootFlag true +;un.lbl_winpcap_notinstalled: +SectionEnd + +Section "-Un.Finally" +;------------------------------------------- +SectionIn 1 2 +; this test must be done after all other things uninstalled (e.g. Global Settings) +IfFileExists "$INSTDIR" 0 NoFinalErrorMsg + MessageBox MB_OK "Please note: The directory $INSTDIR could not be removed!" IDOK 0 ; skipped if dir doesn't exist +NoFinalErrorMsg: +SectionEnd + + ; ============================================================================ ; PLEASE MAKE SURE, THAT THE DESCRIPTIVE TEXT FITS INTO THE DESCRIPTION FIELD! ; ============================================================================ !ifdef MAKENSIS_MODERN_UI !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SecEtherealGroup} "${PROGRAM_NAME} is a GUI network protocol analyzer." !ifdef GTK1_DIR - !insertmacro MUI_DESCRIPTION_TEXT ${SecEtherealGTK1} "${PROGRAM_NAME} is a GUI network protocol analyzer." + !insertmacro MUI_DESCRIPTION_TEXT ${SecEtherealGTK1} "${PROGRAM_NAME} using the classical GTK1 user interface." !endif !ifdef GTK2_DIR - !insertmacro MUI_DESCRIPTION_TEXT ${SecEtherealGTK2} "${PROGRAM_NAME} is a GUI network protocol analyzer (using the modern GTK2 GUI toolkit)." + !insertmacro MUI_DESCRIPTION_TEXT ${SecEtherealGTK2} "${PROGRAM_NAME} using the modern GTK2 user interface." !ifdef GTK_WIMP_DIR - !insertmacro MUI_DESCRIPTION_TEXT ${SecGTKWimp} "GTKWimp is the GTK2 windows impersonator (native Win32 look and feel, for Win2000 and up)." + !insertmacro MUI_DESCRIPTION_TEXT ${SecGTKWimp} "GTK-Wimp is the GTK2 windows impersonator (native Win32 look and feel, for Win2000 and up)." !endif !endif !insertmacro MUI_DESCRIPTION_TEXT ${SecTethereal} "Tethereal is a text based network protocol analyzer." - !insertmacro MUI_DESCRIPTION_TEXT ${SecEditCap} "Editcap is a program that reads a capture file and writes some or all of the packets into another capture file." - !insertmacro MUI_DESCRIPTION_TEXT ${SecText2Pcap} "Text2pcap is a program that reads in an ASCII hex dump and writes the data into a libpcap-style capture file." - !insertmacro MUI_DESCRIPTION_TEXT ${SecMergecap} "Mergecap is a program that combines multiple saved capture files into a single output file." - !insertmacro MUI_DESCRIPTION_TEXT ${SecCapinfos} "Capinfos is a program that provides information on capture files." + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsGroup} "Some plugins and extensions for both Ethereal and Tethereal." !insertmacro MUI_DESCRIPTION_TEXT ${SecPlugins} "Plugins with some extended dissections." !insertmacro MUI_DESCRIPTION_TEXT ${SecStatsTree} "Plugin for some extended statistics." !insertmacro MUI_DESCRIPTION_TEXT ${SecMate} "Plugin - Meta Analysis and Tracing Engine (Experimental)." !insertmacro MUI_DESCRIPTION_TEXT ${SecMIBs} "SNMP MIBs for better SNMP dissection." - !insertmacro MUI_DESCRIPTION_TEXT ${SecShortcuts} "Start menu shortcuts." - !insertmacro MUI_DESCRIPTION_TEXT ${SecDesktopIcon} "Ethereal desktop icon." - !insertmacro MUI_DESCRIPTION_TEXT ${SecFileExtensions} "Associate standard network trace files to ${PROGRAM_NAME}" - !insertmacro MUI_DESCRIPTION_TEXT ${SecNPFservice} "Start WinPcap's service at startup, so users with restricted privilegies can capture. Requires a reboot." + !insertmacro MUI_DESCRIPTION_TEXT ${SecToolsGroup} "Additional command line based tools." + !insertmacro MUI_DESCRIPTION_TEXT ${SecEditCap} "Editcap is a program that reads a capture file and writes some or all of the packets into another capture file." + !insertmacro MUI_DESCRIPTION_TEXT ${SecText2Pcap} "Text2pcap is a program that reads in an ASCII hex dump and writes the data into a libpcap-style capture file." + !insertmacro MUI_DESCRIPTION_TEXT ${SecMergecap} "Mergecap is a program that combines multiple saved capture files into a single output file" + !insertmacro MUI_DESCRIPTION_TEXT ${SecCapinfos} "Capinfos is a program that provides information on capture files." !insertmacro MUI_FUNCTION_DESCRIPTION_END + +!insertmacro MUI_UNFUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${un.SecUinstall} "Uninstall all Ethereal components." + !insertmacro MUI_DESCRIPTION_TEXT ${un.SecPlugins} "Uninstall all Plugins (even from previous Ethereal versions)." + !insertmacro MUI_DESCRIPTION_TEXT ${un.SecGlobalSettings} "Uninstall global settings like: $INSTDIR\cfilters" + !insertmacro MUI_DESCRIPTION_TEXT ${un.SecPersonalSettings} "Uninstall personal settings like your preferences file from your profile: $PROFILE." + !insertmacro MUI_DESCRIPTION_TEXT ${un.SecWinPcap} "Call WinPcap's uninstall program." +!insertmacro MUI_UNFUNCTION_DESCRIPTION_END + !endif ; MAKENSIS_MODERN_UI ; ============================================================================ @@ -832,6 +949,7 @@ SectionEnd ; ============================================================================ !ifdef GTK1_DIR & GTK2_DIR ;Disable GTK-Wimp for GTK1 + Function .onSelChange Push $0 SectionGetFlags ${SecEtherealGTK1} $0 @@ -888,10 +1006,32 @@ FunctionEnd !include "GetWindowsVersion.nsh" +!include WinMessages.nsh Var NPF_START ;declare variable for holding the value of a registry key +Var WINPCAP_VERSION ;declare variable for holding the value of a registry key Function myShowCallback + +; Uinstall old Ethereal first +; XXX - doesn't work, but kept here for further experiments +;ReadRegStr $ETHEREAL_UNINSTALL HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ethereal" "UninstallString" +;IfErrors lbl_ethereal_notinstalled ;if RegKey is unavailable, WinPcap is not installed +;MessageBox MB_YESNO|MB_ICONQUESTION "Uninstall the old Ethereal version first (recommended)?" +; Hide the installer while uninstalling +;GetDlgItem $0 $HWNDPARENT 1 +;FindWindow $0 "#32770" "" $HWNDPARENT +;MessageBox MB_OK "Window $0" +;ShowWindow $0 ${SW_HIDE} +;HideWindow +;ExecWait '$ETHEREAL_UNINSTALL' $0 +;DetailPrint "WinPcap uninstaller returned $0" +;GetDlgItem $0 $HWNDPARENT 1 +;ShowWindow $0 ${SW_SHOW} +;MessageBox MB_OK "Uninstalled" +;lbl_ethereal_notinstalled: + + ; Get the Windows version Call GetWindowsVersion Pop $R0 ; Windows Version @@ -911,16 +1051,47 @@ lbl_select_wimp: lbl_ignore_wimp: !endif - ;Disable Section SecNPFservice for Win OT and if Winpcap is not installed + + ; detect if WinPcap should be installed + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 4" "Text" "Install WinPcap 3.0" + ReadRegStr $WINPCAP_VERSION HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "DisplayName" + IfErrors 0 lbl_winpcap_installed ;if RegKey is available, WinPcap is already installed + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 2" "Text" "WinPcap is currently not installed" + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 2" "Flags" "DISABLED" + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 5" "Text" "(Use Add/Remove Programs first to uninstall any undetected old WinPcap versions)" + Goto lbl_winpcap_done + +lbl_winpcap_installed: + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 2" "Text" "$WINPCAP_VERSION" + ; starts the version string with "WinPcap 2."? + StrCpy $1 "$WINPCAP_VERSION" 10 + StrCmp $1 "WinPcap 2." 0 lbl_winpcap_3+ + ; WinPcap 2.x + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 4" "State" "1" + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 5" "Text" "The currently installed $WINPCAP_VERSION will be uninstalled first." + Goto lbl_winpcap_done + +lbl_winpcap_3+: + ; WinPcap 3.x (or later) + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 4" "State" "0" + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 5" "Text" "If selected, the currently installed $WINPCAP_VERSION will be uninstalled first." +lbl_winpcap_done: + + ;Disable NPF service setting for Win OT and if Winpcap is not installed StrCmp $R0 '95' lbl_npf_disable StrCmp $R0 '98' lbl_npf_disable StrCmp $R0 'ME' lbl_npf_disable ReadRegDWORD $NPF_START HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Services\NPF" "Start" - IfErrors lbl_npf_disable ;RegKey not available, so do not set it - IntCmp $NPF_START 3 lbl_done + IfErrors lbl_npf_done ;RegKey not available, so do not set it + IntCmp $NPF_START 2 0 lbl_npf_done + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 8" "State" "1" + Goto lbl_npf_done ;disable lbl_npf_disable: - !insertmacro DisableSection ${SecNPFservice} - -lbl_done: + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 8" "State" "0" + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 8" "Flags" "DISABLED" + WriteINIStr "$PLUGINSDIR\WinPcapPage.ini" "Field 9" "Flags" "DISABLED" +lbl_npf_done: + + FunctionEnd diff --git a/packaging/nsis/servicelib.nsh b/packaging/nsis/servicelib.nsh new file mode 100644 index 0000000000..2e68a572ca --- /dev/null +++ b/packaging/nsis/servicelib.nsh @@ -0,0 +1,344 @@ +; from http://nsis.sourceforge.net/wiki/NSIS_Service_Lib +; un. functions disabled to prevent a NSIS warning +; +; NSIS SERVICE LIBRARY - servicelib.nsh +; Version 1.2 - 02/29/2004 +; Questions/Comments - dselkirk@hotmail.com +; +; Description: +; Provides an interface to window services +; +; Inputs: +; action - systemlib action ie. create, delete, start, stop, pause, +; continue, installed, running, status +; name - name of service to manipulate +; param - action parameters; usage: var1=value1;var2=value2;...etc. +; +; Actions: +; create - creates a new windows service +; Parameters: +; path - path to service executable +; autostart - automatically start with system ie. 1|0 +; interact - interact with the desktop ie. 1|0 +; machine - machine name where to install service +; user - user that runs the service +; password - password of the above user +; +; delete - deletes a windows service +; start - start a stopped windows service +; stop - stops a running windows service +; pause - pauses a running windows service +; continue - continues a paused windows service +; installed - is the provided service installed +; Parameters: +; action - if true then invokes the specified action +; running - is the provided service running +; Parameters: +; action - if true then invokes the specified action +; status - check the status of the provided service +; +; If run from uninstall define "UN" as "un." gefore running. +; +; Usage: +; Method 1: +; Push "action" +; Push "name" +; Push "param" +; Call Service +; Pop $0 ;response +; +; Method 2: +; !insertmacro SERVICE "action" "name" "param" +; +; History: +; 1.0 - 09/15/2003 - Initial release +; 1.1 - 09/16/2003 - Changed &l to i, thx brainsucker +; 1.2 - 02/29/2004 - Fixed documentation. + +!ifndef SERVICELIB + !define SERVICELIB + + !define SC_MANAGER_ALL_ACCESS 0x3F + !define SERVICE_ALL_ACCESS 0xF01FF + + !define SERVICE_CONTROL_STOP 1 + !define SERVICE_CONTROL_PAUSE 2 + !define SERVICE_CONTROL_CONTINUE 3 + + !define SERVICE_STOPPED 0x1 + !define SERVICE_START_PENDING 0x2 + !define SERVICE_STOP_PENDING 0x3 + !define SERVICE_RUNNING 0x4 + !define SERVICE_CONTINUE_PENDING 0x5 + !define SERVICE_PAUSE_PENDING 0x6 + !define SERVICE_PAUSED 0x7 + + !ifndef UN + !define UN "" + !endif + + !macro SERVICE ACTION NAME PARAM + Push '${ACTION}' + Push '${NAME}' + Push '${PARAM}' + Call ${UN}Service + !macroend + + !macro FUNC_GETPARAM + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Exch 8 + Pop $1 ;name + Exch 8 + Pop $2 ;source + StrCpy $0 "" + StrLen $7 $2 + StrCpy $3 0 + lbl_loop: + IntCmp $3 $7 0 0 lbl_done + StrLen $4 "$1=" + StrCpy $5 $2 $4 $3 + StrCmp $5 "$1=" 0 lbl_next + IntOp $5 $3 + $4 + StrCpy $3 $5 + lbl_loop2: + IntCmp $3 $7 0 0 lbl_done + StrCpy $6 $2 1 $3 + StrCmp $6 ";" 0 lbl_next2 + IntOp $6 $3 - $5 + StrCpy $0 $2 $6 $5 + Goto lbl_done + lbl_next2: + IntOp $3 $3 + 1 + Goto lbl_loop2 + lbl_next: + IntOp $3 $3 + 1 + Goto lbl_loop + lbl_done: + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch 2 + Pop $6 + Pop $7 + Exch $0 + !macroend + + !macro CALL_GETPARAM VAR NAME DEFAULT LABEL + Push $1 + Push ${NAME} + Call ${UN}GETPARAM + Pop $6 + StrCpy ${VAR} "${DEFAULT}" + StrCmp $6 "" "${LABEL}" 0 + StrCpy ${VAR} $6 + !macroend + + !macro FUNC_SERVICE UN + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Exch 8 + Pop $1 ;param + Exch 8 + Pop $2 ;name + Exch 8 + Pop $3 ;action + ;$0 return + ;$4 OpenSCManager + ;$5 OpenService + + + StrCpy $0 "false" + System::Call 'advapi32::OpenSCManagerA(n, n, i ${SC_MANAGER_ALL_ACCESS}) i.r4' + IntCmp $4 0 lbl_done + StrCmp $3 "create" lbl_create + System::Call 'advapi32::OpenServiceA(i r4, t r2, i ${SERVICE_ALL_ACCESS}) i.r5' + IntCmp $5 0 lbl_done + + lbl_select: + StrCmp $3 "delete" lbl_delete + StrCmp $3 "start" lbl_start + StrCmp $3 "stop" lbl_stop + StrCmp $3 "pause" lbl_pause + StrCmp $3 "continue" lbl_continue + StrCmp $3 "installed" lbl_installed + StrCmp $3 "running" lbl_running + StrCmp $3 "status" lbl_status + Goto lbl_done + + ; create service + lbl_create: + Push $R1 ;machine + Push $R2 ;user + Push $R3 ;password + Push $R4 ;interact + Push $R5 ;autostart + Push $R6 ;path + + !insertmacro CALL_GETPARAM $R1 "machine" "n" "lbl_machine" + lbl_machine: + + !insertmacro CALL_GETPARAM $R2 "user" "n" "lbl_user" + lbl_user: + + !insertmacro CALL_GETPARAM $R3 "password" "n" "lbl_password" + lbl_password: + + !insertmacro CALL_GETPARAM $R4 "interact" "0x10" "lbl_interact" + StrCpy $6 0x10 + IntCmp $R4 0 +2 + IntOp $R4 $6 | 0x100 + StrCpy $R4 $6 + lbl_interact: + + !insertmacro CALL_GETPARAM $R5 "autostart" "0x3" "lbl_autostart" + StrCpy $6 0x3 + IntCmp $R5 0 +2 + StrCpy $6 0x2 + StrCpy $R5 $6 + lbl_autostart: + + !insertmacro CALL_GETPARAM $R6 "path" "n" "lbl_path" + lbl_path: + + System::Call 'advapi32::CreateServiceA(i r4, t r2, t r2, i ${SERVICE_ALL_ACCESS}, i R4, i R5, i 0, t R6, n, n, R1, R2, R3) i.r6' + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + StrCmp $6 0 lbl_done lbl_good + + ; delete service + lbl_delete: + System::Call 'advapi32::DeleteService(i r5) i.r6' + StrCmp $6 0 lbl_done lbl_good + + ; start service + lbl_start: + System::Call 'advapi32::StartServiceA(i r5, i 0, i 0) i.r6' + StrCmp $6 0 lbl_done lbl_good + + ; stop service + lbl_stop: + Push $R1 + System::Call '*(i,i,i,i,i,i,i) i.R1' + System::Call 'advapi32::ControlService(i r5, i ${SERVICE_CONTROL_STOP}, i $R1) i' + System::Free $R1 + Pop $R1 + StrCmp $6 0 lbl_done lbl_good + + ; pause service + lbl_pause: + Push $R1 + System::Call '*(i,i,i,i,i,i,i) i.R1' + System::Call 'advapi32::ControlService(i r5, i ${SERVICE_CONTROL_PAUSE}, i $R1) i' + System::Free $R1 + Pop $R1 + StrCmp $6 0 lbl_done lbl_good + + ; continue service + lbl_continue: + Push $R1 + System::Call '*(i,i,i,i,i,i,i) i.R1' + System::Call 'advapi32::ControlService(i r5, i ${SERVICE_CONTROL_CONTINUE}, i $R1) i' + System::Free $R1 + Pop $R1 + StrCmp $6 0 lbl_done lbl_good + + ; is installed + lbl_installed: + !insertmacro CALL_GETPARAM $7 "action" "" "lbl_good" + StrCpy $3 $7 + Goto lbl_select + + ; is service running + lbl_running: + Push $R1 + System::Call '*(i,i,i,i,i,i,i) i.R1' + System::Call 'advapi32::QueryServiceStatus(i r5, i $R1) i' + System::Call '*$R1(i, i.r6)' + System::Free $R1 + Pop $R1 + IntFmt $6 "0x%X" $6 + StrCmp $6 ${SERVICE_RUNNING} 0 lbl_done + !insertmacro CALL_GETPARAM $7 "action" "" "lbl_good" + StrCpy $3 $7 + Goto lbl_select + + lbl_status: + Push $R1 + System::Call '*(i,i,i,i,i,i,i) i.R1' + System::Call 'advapi32::QueryServiceStatus(i r5, i $R1) i' + System::Call '*$R1(i, i .r6)' + System::Free $R1 + Pop $R1 + IntFmt $6 "0x%X" $6 + StrCpy $0 "running" + IntCmp $6 ${SERVICE_RUNNING} lbl_done + StrCpy $0 "stopped" + IntCmp $6 ${SERVICE_STOPPED} lbl_done + StrCpy $0 "start_pending" + IntCmp $6 ${SERVICE_START_PENDING} lbl_done + StrCpy $0 "stop_pending" + IntCmp $6 ${SERVICE_STOP_PENDING} lbl_done + StrCpy $0 "running" + IntCmp $6 ${SERVICE_RUNNING} lbl_done + StrCpy $0 "continue_pending" + IntCmp $6 ${SERVICE_CONTINUE_PENDING} lbl_done + StrCpy $0 "pause_pending" + IntCmp $6 ${SERVICE_PAUSE_PENDING} lbl_done + StrCpy $0 "paused" + IntCmp $6 ${SERVICE_PAUSED} lbl_done + StrCpy $0 "unknown" + + lbl_good: + StrCpy $0 "true" + lbl_done: + IntCmp $5 0 +2 + System::Call 'advapi32::CloseServiceHandle(i r5) n' + IntCmp $4 0 +2 + System::Call 'advapi32::CloseServiceHandle(i r4) n' + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch 3 + Pop $5 + Pop $6 + Pop $7 + Exch $0 + !macroend + + Function Service + !insertmacro FUNC_SERVICE "" + FunctionEnd + +; Function un.Service +; !insertmacro FUNC_SERVICE "un." +; FunctionEnd + + Function GetParam + !insertmacro FUNC_GETPARAM + FunctionEnd + +; Function un.GetParam +; !insertmacro FUNC_GETPARAM +; FunctionEnd + +!endif