2 ; os_win32/installer.nsi - smartmontools install NSIS script
4 ; Home page of code is: http://www.smartmontools.org
6 ; Copyright (C) 2006-17 Christian Franke
8 ; This program is free software; you can redistribute it and/or modify
9 ; it under the terms of the GNU General Public License as published by
10 ; the Free Software Foundation; either version 2, or (at your option)
13 ; You should have received a copy of the GNU General Public License
14 ; (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
16 ; $Id: installer.nsi 4575 2017-10-29 16:06:18Z chrfranke $
20 ;--------------------------------------------------------------------
21 ; Command line arguments:
22 ; makensis -DINPDIR=<input-dir> -DINPDIR64=<input-dir-64-bit> \
23 ; -DOUTFILE=<output-file> -DVERSTR=<version-string> installer.nsi
30 !define OUTFILE "smartmontools.win32-setup.exe"
33 ;--------------------------------------------------------------------
39 RequestExecutionLevel admin
41 SetCompressor /solid lzma
44 InstallColors /windows
47 ;InstallDir "$PROGRAMFILES\smartmontools"
48 ;InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
58 LicenseData "${INPDIR}\doc\COPYING.txt"
60 !include "FileFunc.nsh"
61 !include "LogicLib.nsh"
62 !include "Sections.nsh"
65 ;--------------------------------------------------------------------
71 Page directory CheckX64
77 UninstPage uninstConfirm
81 InstType "Extract files only"
85 InstType "Extract files only (x64)"
86 InstType "Drive menu (x64)"
90 ;--------------------------------------------------------------------
94 Section "64-bit version" X64_SECTION
96 ; Handled in Function CheckX64
99 !define FULL_TYPES "1 4"
100 !define EXTRACT_TYPES "2 5"
101 !define DRIVEMENU_TYPE "3 6"
103 !define FULL_TYPES "1"
104 !define EXTRACT_TYPES "2"
105 !define DRIVEMENU_TYPE "3"
108 SectionGroup "!Program files"
110 !macro FileExe path option
112 ; Use dummy SetOutPath to control archive location of executables
115 SetOutPath "$INSTDIR\bin64"
116 File ${option} '${INPDIR64}\${path}'
119 SetOutPath "$INSTDIR\bin"
120 File ${option} '${INPDIR}\${path}'
123 File ${option} '${INPDIR}\${path}'
127 Section "smartctl" SMARTCTL_SECTION
129 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
131 SetOutPath "$INSTDIR\bin"
132 !insertmacro FileExe "bin\smartctl.exe" ""
136 Section "smartd" SMARTD_SECTION
138 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
140 SetOutPath "$INSTDIR\bin"
144 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
145 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
147 ExecWait "net stop smartd" $1
150 !insertmacro FileExe "bin\smartd.exe" ""
152 IfFileExists "$INSTDIR\bin\smartd.conf" 0 +2
153 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Replace existing configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO +2
154 File "${INPDIR}\doc\smartd.conf"
156 File "${INPDIR}\bin\smartd_mailer.ps1"
157 File "${INPDIR}\bin\smartd_mailer.conf.sample.ps1"
158 File "${INPDIR}\bin\smartd_warning.cmd"
159 !insertmacro FileExe "bin\wtssendmsg.exe" ""
163 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Restart smartd service ?" /SD IDNO IDYES 0 IDNO +2
164 ExecWait "net start smartd"
169 Section "smartctl-nc (GSmartControl)" SMARTCTL_NC_SECTION
171 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
173 SetOutPath "$INSTDIR\bin"
174 !insertmacro FileExe "bin\smartctl-nc.exe" ""
178 Section "drivedb.h (Drive Database)" DRIVEDB_SECTION
180 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
182 SetOutPath "$INSTDIR\bin"
183 File "${INPDIR}\bin\drivedb.h"
184 File "${INPDIR}\bin\update-smart-drivedb.exe"
190 Section "!Documentation" DOC_SECTION
192 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
194 SetOutPath "$INSTDIR\doc"
195 File "${INPDIR}\doc\AUTHORS.txt"
196 File "${INPDIR}\doc\ChangeLog.txt"
197 File "${INPDIR}\doc\ChangeLog-5.0-6.0.txt"
198 File "${INPDIR}\doc\COPYING.txt"
199 File "${INPDIR}\doc\INSTALL.txt"
200 File "${INPDIR}\doc\NEWS.txt"
201 File "${INPDIR}\doc\README.txt"
202 File "${INPDIR}\doc\TODO.txt"
205 File "${INPDIR64}\doc\checksums64.txt"
207 File "${INPDIR}\doc\checksums32.txt"
210 File "${INPDIR}\doc\checksums??.txt"
212 File "${INPDIR}\doc\smartctl.8.html"
213 File "${INPDIR}\doc\smartctl.8.pdf"
214 Delete "$INSTDIR\doc\smartctl.8.txt" ; TODO: Remove after smartmontools 6.6
215 File "${INPDIR}\doc\smartd.8.html"
216 File "${INPDIR}\doc\smartd.8.pdf"
217 Delete "$INSTDIR\doc\smartd.8.txt" ; TODO: Remove after smartmontools 6.6
218 File "${INPDIR}\doc\smartd.conf"
219 File "${INPDIR}\doc\smartd.conf.5.html"
220 File "${INPDIR}\doc\smartd.conf.5.pdf"
221 Delete "$INSTDIR\doc\smartd.conf.5.txt" ; TODO: Remove after smartmontools 6.6
225 Section "Uninstaller" UNINST_SECTION
227 SectionIn ${FULL_TYPES}
230 CreateDirectory "$INSTDIR"
232 ; Keep old Install_Dir registry entry for GSmartControl
233 ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GSmartControl" "InstallLocation"
234 ReadRegStr $1 HKLM "Software\smartmontools" "Install_Dir"
236 WriteRegStr HKLM "Software\smartmontools" "Install_Dir" "$INSTDIR"
239 ; Write uninstall keys and program
240 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayName" "smartmontools"
242 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayVersion" "${VERSTR}"
244 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation" "$INSTDIR"
245 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "UninstallString" '"$INSTDIR\uninst-smartmontools.exe"'
246 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "Publisher" "smartmontools.org"
247 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLInfoAbout" "https://www.smartmontools.org/"
248 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "HelpLink" "https://www.smartmontools.org/wiki/Help"
249 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLUpdateInfo" "https://builds.smartmontools.org/"
250 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoModify" 1
251 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoRepair" 1
252 WriteUninstaller "uninst-smartmontools.exe"
256 Section "Start Menu Shortcuts" MENU_SECTION
258 SectionIn ${FULL_TYPES}
260 SetShellVarContext all
262 CreateDirectory "$SMPROGRAMS\smartmontools"
264 !macro CreateAdminShortCut link target args
265 CreateShortCut '${link}' '${target}' '${args}'
267 Call ShellLinkSetRunAs
271 ${If} ${FileExists} "$INSTDIR\bin\smartctl.exe"
272 ${OrIf} ${FileExists} "$INSTDIR\bin\smartd.exe"
273 SetOutPath "$INSTDIR\bin"
274 !insertmacro FileExe "bin\runcmdu.exe" ""
275 Delete "$INSTDIR\bin\runcmdu.exe.manifest" ; TODO: Remove after smartmontools 6.5
279 ${If} ${FileExists} "$INSTDIR\bin\smartctl.exe"
280 SetOutPath "$INSTDIR\bin"
281 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl (Admin CMD).lnk" "$WINDIR\system32\cmd.exe" '/k PATH=$INSTDIR\bin;%PATH%&cd /d "$INSTDIR\bin"'
282 CreateDirectory "$SMPROGRAMS\smartmontools\smartctl Examples"
283 FileOpen $0 "$SMPROGRAMS\smartmontools\smartctl Examples\!Read this first!.txt" "w"
284 FileWrite $0 "All the example commands in this directory$\r$\napply to the first drive (sda).$\r$\n"
286 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\All info (-x).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -x sda"
287 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Identify drive (-i).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -i sda"
288 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART attributes (-A -f brief).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -A -f brief sda"
289 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART capabilities (-c).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -c sda"
290 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART health status (-H).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -H sda"
291 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART error log (-l error).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l error sda"
292 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART selftest log (-l selftest).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l selftest sda"
293 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start long selftest (-t long).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t long sda"
294 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start offline test (-t offline).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t offline sda"
295 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start short selftest (-t short).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t short sda"
296 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Stop(Abort) selftest (-X).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -X sda"
297 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART off (-s off).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s off sda"
298 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART on (-s on).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s on sda"
302 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
303 SetOutPath "$INSTDIR\bin"
304 CreateDirectory "$SMPROGRAMS\smartmontools\smartd Examples"
305 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, smartd.log.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -l local0"
306 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, eventlog.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd"
307 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon stop.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd stop"
308 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Do all tests once (-q onecheck).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -q onecheck"
309 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Debug mode (-d).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -d"
310 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (edit).lnk" "$EDITOR" '"$INSTDIR\bin\smartd.conf"'
311 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (view).lnk" "$EDITOR" '"$INSTDIR\bin\smartd.conf"'
312 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.log (view).lnk" "$EDITOR" '"$INSTDIR\bin\smartd.log"'
313 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd_mailer.conf.sample.ps1 (view).lnk" "$EDITOR" '"$INSTDIR\bin\smartd_mailer.conf.sample.ps1"'
314 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd_mailer.conf.ps1 (create, edit).lnk" "$EDITOR" '"$INSTDIR\bin\smartd_mailer.conf.ps1"'
317 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, eventlog, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install"
318 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 10min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0 -i 600"
319 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0"
320 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service remove.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd remove"
321 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service start.lnk" "$INSTDIR\bin\runcmdu.exe" "net start smartd"
322 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service stop.lnk" "$INSTDIR\bin\runcmdu.exe" "net stop smartd"
326 ${If} ${FileExists} "$INSTDIR\doc\README.TXT"
327 SetOutPath "$INSTDIR\doc"
328 CreateDirectory "$SMPROGRAMS\smartmontools\Documentation"
329 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (html).lnk" "$INSTDIR\doc\smartctl.8.html"
330 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (html).lnk" "$INSTDIR\doc\smartd.8.html"
331 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (html).lnk" "$INSTDIR\doc\smartd.conf.5.html"
332 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (pdf).lnk" "$INSTDIR\doc\smartctl.8.pdf"
333 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (pdf).lnk" "$INSTDIR\doc\smartd.8.pdf"
334 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (pdf).lnk" "$INSTDIR\doc\smartd.conf.5.pdf"
335 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf sample.lnk" "$EDITOR" '"$INSTDIR\doc\smartd.conf"'
336 ${If} ${FileExists} "$INSTDIR\bin\drivedb.h"
337 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb.h (view).lnk" "$EDITOR" '"$INSTDIR\bin\drivedb.h"'
338 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb-add.h (create, edit).lnk" "$EDITOR" '"$INSTDIR\bin\drivedb-add.h"'
340 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\ChangeLog.lnk" "$INSTDIR\doc\ChangeLog.txt"
341 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\COPYING.lnk" "$INSTDIR\doc\COPYING.txt"
342 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\NEWS.lnk" "$INSTDIR\doc\NEWS.txt"
346 CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Home Page.lnk" "https://www.smartmontools.org/"
347 CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Daily Builds.lnk" "https://builds.smartmontools.org/"
350 ${If} ${FileExists} "$INSTDIR\bin\update-smart-drivedb.exe"
351 SetOutPath "$INSTDIR\bin"
352 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\drivedb.h update.lnk" "$INSTDIR\bin\update-smart-drivedb.exe" ""
356 ${If} ${FileExists} "$INSTDIR\uninst-smartmontools.exe"
357 SetOutPath "$INSTDIR"
358 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Uninstall smartmontools.lnk" "$INSTDIR\uninst-smartmontools.exe" ""
363 Section "Add install dir to PATH" PATH_SECTION
365 SectionIn ${FULL_TYPES}
372 SectionGroup "Add smartctl to drive menu"
374 !macro DriveMenuRemove
375 DetailPrint "Remove drive menu entries"
376 DeleteRegKey HKCR "Drive\shell\smartctl0"
377 DeleteRegKey HKCR "Drive\shell\smartctl1"
378 DeleteRegKey HKCR "Drive\shell\smartctl2"
379 DeleteRegKey HKCR "Drive\shell\smartctl3"
380 DeleteRegKey HKCR "Drive\shell\smartctl4"
381 DeleteRegKey HKCR "Drive\shell\smartctl5"
384 Section "Remove existing entries first" DRIVE_REMOVE_SECTION
385 SectionIn ${DRIVEMENU_TYPE}
386 !insertmacro DriveMenuRemove
389 !macro DriveSection id name args
390 Section 'smartctl ${args} ...' DRIVE_${id}_SECTION
391 SectionIn ${DRIVEMENU_TYPE}
393 DetailPrint 'Add drive menu entry "${name}": smartctl ${args} ...'
394 WriteRegStr HKCR "Drive\shell\smartctl${id}" "" "${name}"
395 WriteRegStr HKCR "Drive\shell\smartctl${id}\command" "" '"$INSTDIR\bin\runcmda.exe" "$INSTDIR\bin\smartctl.exe" ${args} %L'
399 !insertmacro DriveSection 0 "SMART all info" "-x"
400 !insertmacro DriveSection 1 "SMART status" "-Hc"
401 !insertmacro DriveSection 2 "SMART attributes" "-A -f brief"
402 !insertmacro DriveSection 3 "SMART short selftest" "-t short"
403 !insertmacro DriveSection 4 "SMART long selftest" "-t long"
404 !insertmacro DriveSection 5 "SMART continue selective selftest" '-t "selective,cont"'
408 ;--------------------------------------------------------------------
412 ; Stop & remove service
413 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
414 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
416 ExecWait "net stop smartd"
417 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Remove smartd service ?" /SD IDNO IDYES 0 IDNO +2
418 ExecWait "$INSTDIR\bin\smartd.exe remove"
422 ; Remove installer registry keys
423 DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools"
424 DeleteRegKey HKLM "Software\smartmontools"
427 ${If} ${FileExists} "$INSTDIR\bin\smartd.conf"
428 ; Assume unchanged if timestamp is equal to sample file
429 GetFileTime "$INSTDIR\bin\smartd.conf" $0 $1
430 GetFileTime "$INSTDIR\doc\smartd.conf" $2 $3
431 StrCmp "$0:$1" "$2:$3" +2 0
432 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO +2
433 Delete "$INSTDIR\bin\smartd.conf"
437 ${If} ${FileExists} "$INSTDIR\bin\smartd.log"
438 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete log file$\n$INSTDIR\bin\smartd.log ?" /SD IDNO IDYES 0 IDNO +2
439 Delete "$INSTDIR\bin\smartd.log"
442 ; Remove drivedb-add file ?
443 ${If} ${FileExists} "$INSTDIR\bin\drivedb-add.h"
444 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete local drive database file$\n$INSTDIR\bin\drivedb-add.h ?" /SD IDNO IDYES 0 IDNO +2
445 Delete "$INSTDIR\bin\drivedb-add.h"
448 ; Remove smartd_mailer.conf.ps1 file ?
449 ${If} ${FileExists} "$INSTDIR\bin\smartd_mailer.conf.ps1"
450 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete mailer configuration file$\n$INSTDIR\bin\smartd_mailer.conf.ps1 ?" /SD IDNO IDYES 0 IDNO +2
451 Delete "$INSTDIR\bin\smartd_mailer.conf.ps1"
455 Delete "$INSTDIR\bin\smartctl.exe"
456 Delete "$INSTDIR\bin\smartctl-nc.exe"
457 Delete "$INSTDIR\bin\smartd.exe"
458 Delete "$INSTDIR\bin\smartd_mailer.ps1"
459 Delete "$INSTDIR\bin\smartd_mailer.conf.sample.ps1"
460 Delete "$INSTDIR\bin\smartd_warning.cmd" ; TODO: Check for modifications?
461 Delete "$INSTDIR\bin\drivedb.h"
462 Delete "$INSTDIR\bin\drivedb.h.error"
463 Delete "$INSTDIR\bin\drivedb.h.lastcheck"
464 Delete "$INSTDIR\bin\drivedb.h.old"
465 Delete "$INSTDIR\bin\update-smart-drivedb.exe"
466 Delete "$INSTDIR\bin\runcmda.exe"
467 Delete "$INSTDIR\bin\runcmda.exe.manifest" ; TODO: Remove after smartmontools 6.5
468 Delete "$INSTDIR\bin\runcmdu.exe"
469 Delete "$INSTDIR\bin\runcmdu.exe.manifest" ; TODO: Remove after smartmontools 6.5
470 Delete "$INSTDIR\bin\wtssendmsg.exe"
471 Delete "$INSTDIR\doc\AUTHORS.txt"
472 Delete "$INSTDIR\doc\ChangeLog.txt"
473 Delete "$INSTDIR\doc\ChangeLog-5.0-6.0.txt"
474 Delete "$INSTDIR\doc\COPYING.txt"
475 Delete "$INSTDIR\doc\INSTALL.txt"
476 Delete "$INSTDIR\doc\NEWS.txt"
477 Delete "$INSTDIR\doc\README.txt"
478 Delete "$INSTDIR\doc\TODO.txt"
479 Delete "$INSTDIR\doc\checksums*.txt"
480 Delete "$INSTDIR\doc\smartctl.8.html"
481 Delete "$INSTDIR\doc\smartctl.8.pdf"
482 Delete "$INSTDIR\doc\smartctl.8.txt" ; TODO: Remove after smartmontools 6.6
483 Delete "$INSTDIR\doc\smartd.8.html"
484 Delete "$INSTDIR\doc\smartd.8.pdf"
485 Delete "$INSTDIR\doc\smartd.8.txt" ; TODO: Remove after smartmontools 6.6
486 Delete "$INSTDIR\doc\smartd.conf"
487 Delete "$INSTDIR\doc\smartd.conf.5.html"
488 Delete "$INSTDIR\doc\smartd.conf.5.pdf"
489 Delete "$INSTDIR\doc\smartd.conf.5.txt" ; TODO: Remove after smartmontools 6.6
490 Delete "$INSTDIR\uninst-smartmontools.exe"
493 SetShellVarContext all
494 Delete "$SMPROGRAMS\smartmontools\*.*"
495 Delete "$SMPROGRAMS\smartmontools\Documentation\*.*"
496 Delete "$SMPROGRAMS\smartmontools\smartctl Examples\*.*"
497 Delete "$SMPROGRAMS\smartmontools\smartd Examples\*.*"
500 RMDir "$SMPROGRAMS\smartmontools\Documentation"
501 RMDir "$SMPROGRAMS\smartmontools\smartctl Examples"
502 RMDir "$SMPROGRAMS\smartmontools\smartd Examples"
503 RMDir "$SMPROGRAMS\smartmontools"
508 ; Remove install dir from PATH
510 Call un.RemoveFromPath
512 ; Remove drive menu registry entries
513 !insertmacro DriveMenuRemove
515 ; Check for still existing entries
516 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
517 MessageBox MB_OK|MB_ICONEXCLAMATION "$INSTDIR\bin\smartd.exe could not be removed.$\nsmartd is possibly still running." /SD IDOK
518 ${ElseIf} ${FileExists} "$INSTDIR"
519 MessageBox MB_OK "Note: $INSTDIR could not be removed." /SD IDOK
522 ${If} ${FileExists} "$SMPROGRAMS\smartmontools"
523 MessageBox MB_OK "Note: $SMPROGRAMS\smartmontools could not be removed." /SD IDOK
528 ;--------------------------------------------------------------------
531 !macro AdjustSectionSize section
532 SectionGetSize ${section} $0
534 SectionSetSize ${section} $0
539 ; Set default install directories
540 ${If} $INSTDIR == "" ; /D=PATH option not specified ?
541 ReadRegStr $INSTDIR HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
542 ${If} $INSTDIR == "" ; Not already installed ?
543 ReadRegStr $INSTDIR HKLM "Software\smartmontools" "Install_Dir"
544 ${If} $INSTDIR == "" ; Not already installed (smartmontools < r3911/6.3) ?
545 StrCpy $INSTDIR "$PROGRAMFILES\smartmontools"
547 StrCpy $INSTDIR32 $INSTDIR
548 StrCpy $INSTDIR64 "$PROGRAMFILES64\smartmontools"
555 ; Check for 64-bit unless already installed in 32-bit location
556 ${If} $INSTDIR64 != ""
557 ${OrIf} $INSTDIR != "$PROGRAMFILES\smartmontools"
558 ; $1 = IsWow64Process(GetCurrentProcess(), ($0=FALSE, &$0))
559 System::Call "kernel32::GetCurrentProcess() i.s"
560 System::Call "kernel32::IsWow64Process(i s, *i 0 r0) i.r1"
561 ${If} "$0 $1" == "1 1" ; 64-bit Windows ?
562 !insertmacro SelectSection ${X64_SECTION}
566 ; Sizes of binary sections include 32-bit and 64-bit executables
567 !insertmacro AdjustSectionSize ${SMARTCTL_SECTION}
568 !insertmacro AdjustSectionSize ${SMARTD_SECTION}
569 !insertmacro AdjustSectionSize ${SMARTCTL_NC_SECTION}
572 ; Use Notepad++ if installed
573 StrCpy $EDITOR "$PROGRAMFILES\Notepad++\notepad++.exe"
574 ${IfNot} ${FileExists} "$EDITOR"
575 StrCpy $EDITOR "notepad.exe"
585 ; Check x64 section and update INSTDIR accordingly
589 ${IfNot} ${SectionIsSelected} ${X64_SECTION}
591 ${If} $INSTDIR32 != ""
592 ${AndIf} $INSTDIR == $INSTDIR64
593 StrCpy $INSTDIR $INSTDIR32
597 ${If} $INSTDIR64 != ""
598 ${AndIf} $INSTDIR == $INSTDIR32
599 StrCpy $INSTDIR $INSTDIR64
605 ; Command line parsing
607 !macro GetCmdLineOption var name
617 !macro CheckCmdLineOption name section
618 StrCpy $allopts "$allopts,${name}"
619 !insertmacro GetCmdLineOption $0 ${name}
621 !insertmacro UnselectSection ${section}
623 !insertmacro SelectSection ${section}
627 Function ParseCmdLine
631 ${GetOptions} $R0 "/SO" $opts
639 ; Change previous 64-bit setting
640 StrCpy $allopts ",x32|x64"
641 !insertmacro GetCmdLineOption $0 "x32"
643 !insertmacro UnselectSection ${X64_SECTION}
645 !insertmacro GetCmdLineOption $0 "x64"
647 !insertmacro SelectSection ${X64_SECTION}
649 ; Leave other sections unchanged if only "x32" or "x64" is specified
651 ${OrIf} $opts == "x64"
655 ; Turn sections on or off
656 !insertmacro CheckCmdLineOption "smartctl" ${SMARTCTL_SECTION}
657 !insertmacro CheckCmdLineOption "smartd" ${SMARTD_SECTION}
658 !insertmacro CheckCmdLineOption "smartctlnc" ${SMARTCTL_NC_SECTION}
659 !insertmacro CheckCmdLineOption "drivedb" ${DRIVEDB_SECTION}
660 !insertmacro CheckCmdLineOption "doc" ${DOC_SECTION}
661 !insertmacro CheckCmdLineOption "uninst" ${UNINST_SECTION}
662 !insertmacro CheckCmdLineOption "menu" ${MENU_SECTION}
663 !insertmacro CheckCmdLineOption "path" ${PATH_SECTION}
664 !insertmacro CheckCmdLineOption "driveremove" ${DRIVE_REMOVE_SECTION}
665 !insertmacro CheckCmdLineOption "drive0" ${DRIVE_0_SECTION}
666 !insertmacro CheckCmdLineOption "drive1" ${DRIVE_1_SECTION}
667 !insertmacro CheckCmdLineOption "drive2" ${DRIVE_2_SECTION}
668 !insertmacro CheckCmdLineOption "drive3" ${DRIVE_3_SECTION}
669 !insertmacro CheckCmdLineOption "drive4" ${DRIVE_4_SECTION}
670 !insertmacro CheckCmdLineOption "drive5" ${DRIVE_5_SECTION}
673 StrCpy $0 "$allopts,-" "" 1
674 MessageBox MB_OK "Usage: smartmontools-VERSION.win32-setup [/S] [/SO component,...] [/D=INSTDIR]$\n$\ncomponents:$\n $0"
680 ; Install runcmda.exe only once
682 Function CheckRunCmdA
686 SetOutPath "$INSTDIR\bin"
687 !insertmacro FileExe "bin\runcmda.exe" ""
688 Delete "$INSTDIR\bin\runcmda.exe.manifest" ; TODO: Remove after smartmontools 6.5
693 ;--------------------------------------------------------------------
696 ; Based on example from:
697 ; http://nsis.sourceforge.net/Path_Manipulation
701 !include "WinMessages.nsh"
703 ; Registry Entry for environment (NT4,2000,XP)
705 ;!define Environ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
707 !define Environ 'HKCU "Environment"'
710 ; AddToPath - Appends dir to PATH
711 ; (does not work on Win9x/ME)
724 ; NSIS ReadRegStr returns empty string on string overflow
725 ; Native calls are used here to check actual length of PATH
727 ; $4 = RegOpenKey(HKEY_CURRENT_USER, "Environment", &$3)
728 System::Call "advapi32::RegOpenKey(i 0x80000001, t'Environment', *i.r3) i.r4"
729 IntCmp $4 0 0 done done
730 ; $4 = RegQueryValueEx($3, "PATH", (DWORD*)0, (DWORD*)0, &$1, ($2=NSIS_MAX_STRLEN, &$2))
732 System::Call "advapi32::RegQueryValueEx(i $3, t'PATH', i 0, i 0, t.r1, *i ${NSIS_MAX_STRLEN} r2) i.r4"
733 System::Call "advapi32::RegCloseKey(i $3)"
735 ${If} $4 = 234 ; ERROR_MORE_DATA
736 DetailPrint "AddToPath: original length $2 > ${NSIS_MAX_STRLEN}"
737 MessageBox MB_OK "PATH not updated, original length $2 > ${NSIS_MAX_STRLEN}" /SD IDOK
741 ${If} $4 <> 0 ; NO_ERROR
742 ${If} $4 <> 2 ; ERROR_FILE_NOT_FOUND
743 DetailPrint "AddToPath: unexpected error code $4"
749 ; Check if already in PATH
761 ; Prevent NSIS string overflow
765 IntOp $2 $2 + 2 ; $2 = strlen(dir) + strlen(PATH) + sizeof(";")
766 ${If} $2 > ${NSIS_MAX_STRLEN}
767 DetailPrint "AddToPath: new length $2 > ${NSIS_MAX_STRLEN}"
768 MessageBox MB_OK "PATH not updated, new length $2 > ${NSIS_MAX_STRLEN}." /SD IDOK
773 DetailPrint "Add to PATH: $0"
776 StrCpy $1 $1 -1 ; remove trailing ';'
778 ${If} $1 != "" ; no leading ';'
781 WriteRegExpandStr ${Environ} "PATH" $0
782 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
793 ; RemoveFromPath - Removes dir from PATH
797 ; Call RemoveFromPath
799 Function un.RemoveFromPath
808 ReadRegStr $1 ${Environ} "PATH"
811 StrCpy $1 "$1;" ; ensure trailing ';'
816 Pop $2 ; pos of our dir
819 DetailPrint "Remove from PATH: $0"
822 StrCpy $5 $1 -$4 ; $5 is now the part before the path to remove
823 StrCpy $6 $2 "" $3 ; $6 is now the part after the path to remove
827 StrCpy $3 $3 -1 ; remove trailing ';'
829 WriteRegExpandStr ${Environ} "PATH" $3
830 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
843 ; StrStr - find substring in a string
846 ; Push "this is some string"
849 ; Pop $0 ; "some string"
853 Exch $R1 ; $R1=substring, stack=[old$R1,string,...]
854 Exch ; stack=[string,old$R1,...]
855 Exch $R2 ; $R2=string, stack=[old$R2,old$R1,...]
861 ; $R1=substring, $R2=string, $R3=strlen(substring)
864 StrCpy $R5 $R2 $R3 $R4
865 ${IfThen} $R5 == $R1 ${|} ${ExitDo} ${|}
866 ${IfThen} $R5 == "" ${|} ${ExitDo} ${|}
869 StrCpy $R1 $R2 "" $R4
874 Exch $R1 ; $R1=old$R1, stack=[result,...]
877 !insertmacro StrStr ""
878 !insertmacro StrStr "un."
881 ;--------------------------------------------------------------------
882 ; Set Run As Administrator flag in shortcut
884 ; Slightly modified version from:
885 ; http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
888 !define IPersistFile {0000010b-0000-0000-c000-000000000046}
889 !define CLSID_ShellLink {00021401-0000-0000-C000-000000000046}
890 !define IID_IShellLinkA {000214EE-0000-0000-C000-000000000046}
891 !define IID_IShellLinkW {000214F9-0000-0000-C000-000000000046}
892 !define IShellLinkDataList {45e2b4ae-b1c3-11d0-b92f-00a0c90312e1}
894 !define IID_IShellLink ${IID_IShellLinkW}
896 !define IID_IShellLink ${IID_IShellLinkA}
899 Function ShellLinkSetRunAs
900 ; Set archive location of $PLUGINSDIR
902 SetOutPath "$INSTDIR"
904 System::Store S ; push $0-$9, $R0-$R9
906 ; $0 = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, IID_IShellLink, &$1)
907 System::Call "ole32::CoCreateInstance(g'${CLSID_ShellLink}',i0,i1,g'${IID_IShellLink}',*i.r1)i.r0"
909 System::Call "$1->0(g'${IPersistFile}',*i.r2)i.r0" ; $0 = $1->QueryInterface(IPersistFile, &$2)
911 System::Call "$2->5(w '$9',i 0)i.r0" ; $0 = $2->Load($9, STGM_READ)
913 System::Call "$1->0(g'${IShellLinkDataList}',*i.r3)i.r0" ; $0 = $1->QueryInterface(IShellLinkDataList, &$3)
915 System::Call "$3->6(*i.r4)i.r0"; $0 = $3->GetFlags(&$4)
917 System::Call "$3->7(i $4|0x2000)i.r0" ; $0 = $3->SetFlags($4|SLDF_RUNAS_USER)
919 System::Call "$2->6(w '$9',i1)i.r0" ; $2->Save($9, TRUE)
922 System::Call "$3->2()" ; $3->Release()
924 System::Call "$2->2()" ; $2->Release()
927 System::Call "$1->2()" ; $1->Release()
930 DetailPrint "Set RunAsAdmin: $9 failed ($0)"
932 DetailPrint "Set RunAsAdmin: $9"
934 System::Store L ; pop $R9-$R0, $9-$0