2 ; smartmontools install NSIS script
4 ; Home page of code is: http://smartmontools.sourceforge.net
6 ; Copyright (C) 2006-14 Christian Franke <smartmontools-support@lists.sourceforge.net>
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 3912 2014-06-18 19:03:30Z 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 SetCompressor /solid lzma
42 InstallColors /windows
45 ;InstallDir "$PROGRAMFILES\smartmontools"
46 ;InstallDirRegKey HKLM "Software\smartmontools" "Install_Dir"
56 LicenseData "${INPDIR}\doc\COPYING.txt"
58 !include "FileFunc.nsh"
59 !include "Sections.nsh"
61 !insertmacro GetParameters
62 !insertmacro GetOptions
64 RequestExecutionLevel admin
66 ;--------------------------------------------------------------------
72 Page directory CheckX64
78 UninstPage uninstConfirm
82 InstType "Extract files only"
86 ;--------------------------------------------------------------------
90 Section "64-bit version" X64_SECTION
91 ; Handled in Function CheckX64
95 SectionGroup "!Program files"
97 !macro FileExe path option
99 ; Use dummy SetOutPath to control archive location of executables
102 SetOutPath "$INSTDIR\bin64"
103 File ${option} '${INPDIR64}\${path}'
106 SetOutPath "$INSTDIR\bin"
107 File ${option} '${INPDIR}\${path}'
109 File ${option} '${INPDIR}\${path}'
113 Section "smartctl" SMARTCTL_SECTION
117 SetOutPath "$INSTDIR\bin"
118 !insertmacro FileExe "bin\smartctl.exe" ""
122 Section "smartd" SMARTD_SECTION
126 SetOutPath "$INSTDIR\bin"
130 IfFileExists "$INSTDIR\bin\smartd.exe" 0 nosrv
131 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
133 ExecWait "net stop smartd" $1
135 !insertmacro FileExe "bin\smartd.exe" ""
137 IfFileExists "$INSTDIR\bin\smartd.conf" 0 +2
138 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Replace existing configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO +2
139 File "${INPDIR}\doc\smartd.conf"
141 File "${INPDIR}\bin\smartd_warning.cmd"
142 !insertmacro FileExe "bin\wtssendmsg.exe" ""
146 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Restart smartd service ?" /SD IDNO IDYES 0 IDNO +2
147 ExecWait "net start smartd"
151 Section "smartctl-nc (GSmartControl)" SMARTCTL_NC_SECTION
155 SetOutPath "$INSTDIR\bin"
156 !insertmacro FileExe "bin\smartctl-nc.exe" ""
160 Section "drivedb.h (Drive Database)" DRIVEDB_SECTION
164 SetOutPath "$INSTDIR\bin"
165 File "${INPDIR}\bin\drivedb.h"
166 File "${INPDIR}\bin\update-smart-drivedb.exe"
172 Section "!Documentation" DOC_SECTION
176 SetOutPath "$INSTDIR\doc"
177 File "${INPDIR}\doc\AUTHORS.txt"
178 File "${INPDIR}\doc\ChangeLog.txt"
179 File "${INPDIR}\doc\ChangeLog-5.0-6.0.txt"
180 File "${INPDIR}\doc\COPYING.txt"
181 File "${INPDIR}\doc\INSTALL.txt"
182 File "${INPDIR}\doc\NEWS.txt"
183 File "${INPDIR}\doc\README.txt"
184 File "${INPDIR}\doc\TODO.txt"
185 File "${INPDIR}\doc\WARNINGS.txt"
188 File "${INPDIR64}\doc\checksums64.txt"
190 File "${INPDIR}\doc\checksums32.txt"
192 File "${INPDIR}\doc\checksums??.txt"
194 File "${INPDIR}\doc\smartctl.8.html"
195 File "${INPDIR}\doc\smartctl.8.txt"
196 File "${INPDIR}\doc\smartd.8.html"
197 File "${INPDIR}\doc\smartd.8.txt"
198 File "${INPDIR}\doc\smartd.conf"
199 File "${INPDIR}\doc\smartd.conf.5.html"
200 File "${INPDIR}\doc\smartd.conf.5.txt"
204 Section "Uninstaller" UNINST_SECTION
209 CreateDirectory "$INSTDIR"
211 ; Keep old Install_Dir registry entry for GSmartControl
212 ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GSmartControl" "InstallLocation"
213 ReadRegStr $1 HKLM "Software\smartmontools" "Install_Dir"
214 StrCmp "$0$1" "" +2 0
215 WriteRegStr HKLM "Software\smartmontools" "Install_Dir" "$INSTDIR"
217 ; Write uninstall keys and program
218 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayName" "smartmontools"
220 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayVersion" "${VERSTR}"
222 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation" "$INSTDIR"
223 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "UninstallString" '"$INSTDIR\uninst-smartmontools.exe"'
224 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "Publisher" "smartmontools.org"
225 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLInfoAbout" "http://www.smartmontools.org/"
226 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "HelpLink" "http://sourceforge.net/projects/smartmontools/support"
227 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLUpdateInfo" "http://smartmontools.no-ip.org/"
228 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoModify" 1
229 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoRepair" 1
230 WriteUninstaller "uninst-smartmontools.exe"
234 Section "Start Menu Shortcuts" MENU_SECTION
238 SetShellVarContext all
240 CreateDirectory "$SMPROGRAMS\smartmontools"
242 !macro CreateAdminShortCut link target args
243 CreateShortCut '${link}' '${target}' '${args}'
245 Call ShellLinkSetRunAs
249 IfFileExists "$INSTDIR\bin\smartctl.exe" 0 +2
250 IfFileExists "$INSTDIR\bin\smartd.exe" 0 noruncmd
251 SetOutPath "$INSTDIR\bin"
252 !insertmacro FileExe "bin\runcmdu.exe" ""
253 File "${INPDIR}\bin\runcmdu.exe.manifest"
257 IfFileExists "$INSTDIR\bin\smartctl.exe" 0 noctl
258 SetOutPath "$INSTDIR\bin"
259 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl (Admin CMD).lnk" "$WINDIR\system32\cmd.exe" '/k PATH=$INSTDIR\bin;%PATH%&cd /d "$INSTDIR\bin"'
260 CreateDirectory "$SMPROGRAMS\smartmontools\smartctl Examples"
261 FileOpen $0 "$SMPROGRAMS\smartmontools\smartctl Examples\!Read this first!.txt" "w"
262 FileWrite $0 "All the example commands in this directory$\r$\napply to the first drive (sda).$\r$\n"
264 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\All info (-x).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -x sda"
265 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Identify drive (-i).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -i sda"
266 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART attributes (-A -f brief).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -A -f brief sda"
267 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART capabilities (-c).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -c sda"
268 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART health status (-H).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -H sda"
269 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART error log (-l error).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l error sda"
270 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART selftest log (-l selftest).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l selftest sda"
271 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start long selftest (-t long).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t long sda"
272 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start offline test (-t offline).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t offline sda"
273 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start short selftest (-t short).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t short sda"
274 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Stop(Abort) selftest (-X).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -X sda"
275 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART off (-s off).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s off sda"
276 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART on (-s on).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s on sda"
280 IfFileExists "$INSTDIR\bin\smartd.exe" 0 nod
281 SetOutPath "$INSTDIR\bin"
282 CreateDirectory "$SMPROGRAMS\smartmontools\smartd Examples"
283 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, smartd.log.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -l local0"
284 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, eventlog.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd"
285 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon stop.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd stop"
286 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Do all tests once (-q onecheck).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -q onecheck"
287 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Debug mode (-d).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -d"
288 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (edit).lnk" "$EDITOR" "$INSTDIR\bin\smartd.conf"
289 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (view).lnk" "$EDITOR" "$INSTDIR\bin\smartd.conf"
290 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.log (view).lnk" "$EDITOR" "$INSTDIR\bin\smartd.log"
293 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, eventlog, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install"
294 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 10min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0 -i 600"
295 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0"
296 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service remove.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd remove"
297 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service start.lnk" "$INSTDIR\bin\runcmdu.exe" "net start smartd"
298 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service stop.lnk" "$INSTDIR\bin\runcmdu.exe" "net stop smartd"
302 IfFileExists "$INSTDIR\doc\README.TXT" 0 nodoc
303 SetOutPath "$INSTDIR\doc"
304 CreateDirectory "$SMPROGRAMS\smartmontools\Documentation"
305 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (html).lnk" "$INSTDIR\doc\smartctl.8.html"
306 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (html).lnk" "$INSTDIR\doc\smartd.8.html"
307 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (html).lnk" "$INSTDIR\doc\smartd.conf.5.html"
308 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (txt).lnk" "$INSTDIR\doc\smartctl.8.txt"
309 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (txt).lnk" "$INSTDIR\doc\smartd.8.txt"
310 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (txt).lnk" "$INSTDIR\doc\smartd.conf.5.txt"
311 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf sample.lnk" "$EDITOR" "$INSTDIR\doc\smartd.conf"
312 IfFileExists "$INSTDIR\bin\drivedb.h" 0 nodb
313 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb.h (view).lnk" "$EDITOR" "$INSTDIR\bin\drivedb.h"
314 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb-add.h (create, edit).lnk" "$EDITOR" "$INSTDIR\bin\drivedb-add.h"
316 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\ChangeLog.lnk" "$INSTDIR\doc\ChangeLog.txt"
317 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\COPYING.lnk" "$INSTDIR\doc\COPYING.txt"
318 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\NEWS.lnk" "$INSTDIR\doc\NEWS.txt"
319 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\Windows version download page.lnk" "http://smartmontools.no-ip.org/"
323 CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Home Page.lnk" "http://www.smartmontools.org/"
326 IfFileExists "$INSTDIR\bin\update-smart-drivedb.exe" 0 noupdb
327 SetOutPath "$INSTDIR\bin"
328 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\drivedb.h update.lnk" "$INSTDIR\bin\update-smart-drivedb.exe" ""
332 IfFileExists "$INSTDIR\uninst-smartmontools.exe" 0 noinst
333 SetOutPath "$INSTDIR"
334 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Uninstall smartmontools.lnk" "$INSTDIR\uninst-smartmontools.exe" ""
339 Section "Add install dir to PATH" PATH_SECTION
348 SectionGroup "Add smartctl to drive menu"
350 !macro DriveMenuRemove
351 DetailPrint "Remove drive menu entries"
352 DeleteRegKey HKCR "Drive\shell\smartctl0"
353 DeleteRegKey HKCR "Drive\shell\smartctl1"
354 DeleteRegKey HKCR "Drive\shell\smartctl2"
355 DeleteRegKey HKCR "Drive\shell\smartctl3"
356 DeleteRegKey HKCR "Drive\shell\smartctl4"
357 DeleteRegKey HKCR "Drive\shell\smartctl5"
360 Section "Remove existing entries first" DRIVE_REMOVE_SECTION
362 !insertmacro DriveMenuRemove
365 !macro DriveSection id name args
366 Section 'smartctl ${args} ...' DRIVE_${id}_SECTION
369 DetailPrint 'Add drive menu entry "${name}": smartctl ${args} ...'
370 WriteRegStr HKCR "Drive\shell\smartctl${id}" "" "${name}"
371 WriteRegStr HKCR "Drive\shell\smartctl${id}\command" "" '"$INSTDIR\bin\runcmda.exe" "$INSTDIR\bin\smartctl.exe" ${args} %L'
375 !insertmacro DriveSection 0 "SMART all info" "-x"
376 !insertmacro DriveSection 1 "SMART status" "-Hc"
377 !insertmacro DriveSection 2 "SMART attributes" "-A -f brief"
378 !insertmacro DriveSection 3 "SMART short selftest" "-t short"
379 !insertmacro DriveSection 4 "SMART long selftest" "-t long"
380 !insertmacro DriveSection 5 "SMART continue selective selftest" '-t "selective,cont"'
384 ;--------------------------------------------------------------------
388 ; Stop & remove service
389 IfFileExists "$INSTDIR\bin\smartd.exe" 0 nosrv
390 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
392 ExecWait "net stop smartd"
393 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Remove smartd service ?" /SD IDNO IDYES 0 IDNO nosrv
394 ExecWait "$INSTDIR\bin\smartd.exe remove"
397 ; Remove installer registry keys
398 DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools"
399 DeleteRegKey HKLM "Software\smartmontools"
402 IfFileExists "$INSTDIR\bin\smartd.conf" 0 noconf
403 ; Assume unchanged if timestamp is equal to sample file
404 GetFileTime "$INSTDIR\bin\smartd.conf" $0 $1
405 GetFileTime "$INSTDIR\doc\smartd.conf" $2 $3
406 StrCmp "$0:$1" "$2:$3" +2 0
407 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO noconf
408 Delete "$INSTDIR\bin\smartd.conf"
412 IfFileExists "$INSTDIR\bin\smartd.log" 0 +3
413 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete log file$\n$INSTDIR\bin\smartd.log ?" /SD IDNO IDYES 0 IDNO +2
414 Delete "$INSTDIR\bin\smartd.log"
416 ; Remove drivedb-add file ?
417 IfFileExists "$INSTDIR\bin\drivedb-add.h" 0 +3
418 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete local drive database file$\n$INSTDIR\bin\drivedb-add.h ?" /SD IDNO IDYES 0 IDNO +2
419 Delete "$INSTDIR\bin\drivedb-add.h"
422 Delete "$INSTDIR\bin\smartctl.exe"
423 Delete "$INSTDIR\bin\smartctl-nc.exe"
424 Delete "$INSTDIR\bin\smartd.exe"
425 Delete "$INSTDIR\bin\smartd_warning.cmd" ; TODO: Check for modifications?
426 Delete "$INSTDIR\bin\drivedb.h"
427 Delete "$INSTDIR\bin\drivedb.h.error"
428 Delete "$INSTDIR\bin\drivedb.h.lastcheck"
429 Delete "$INSTDIR\bin\drivedb.h.old"
430 Delete "$INSTDIR\bin\update-smart-drivedb.exe"
431 Delete "$INSTDIR\bin\smartctl-run.bat"
432 Delete "$INSTDIR\bin\smartd-run.bat"
433 Delete "$INSTDIR\bin\net-run.bat"
434 Delete "$INSTDIR\bin\runcmda.exe"
435 Delete "$INSTDIR\bin\runcmda.exe.manifest"
436 Delete "$INSTDIR\bin\runcmdu.exe"
437 Delete "$INSTDIR\bin\runcmdu.exe.manifest"
438 Delete "$INSTDIR\bin\wtssendmsg.exe"
439 Delete "$INSTDIR\doc\AUTHORS.txt"
440 Delete "$INSTDIR\doc\ChangeLog.txt"
441 Delete "$INSTDIR\doc\ChangeLog-5.0-6.0.txt"
442 Delete "$INSTDIR\doc\COPYING.txt"
443 Delete "$INSTDIR\doc\INSTALL.txt"
444 Delete "$INSTDIR\doc\NEWS.txt"
445 Delete "$INSTDIR\doc\README.txt"
446 Delete "$INSTDIR\doc\TODO.txt"
447 Delete "$INSTDIR\doc\WARNINGS.txt"
448 Delete "$INSTDIR\doc\checksums*.txt"
449 Delete "$INSTDIR\doc\smartctl.8.html"
450 Delete "$INSTDIR\doc\smartctl.8.txt"
451 Delete "$INSTDIR\doc\smartd.8.html"
452 Delete "$INSTDIR\doc\smartd.8.txt"
453 Delete "$INSTDIR\doc\smartd.conf"
454 Delete "$INSTDIR\doc\smartd.conf.5.html"
455 Delete "$INSTDIR\doc\smartd.conf.5.txt"
456 Delete "$INSTDIR\uninst-smartmontools.exe"
459 SetShellVarContext all
460 Delete "$SMPROGRAMS\smartmontools\*.*"
461 Delete "$SMPROGRAMS\smartmontools\Documentation\*.*"
462 Delete "$SMPROGRAMS\smartmontools\smartctl Examples\*.*"
463 Delete "$SMPROGRAMS\smartmontools\smartd Examples\*.*"
466 RMDir "$SMPROGRAMS\smartmontools\Documentation"
467 RMDir "$SMPROGRAMS\smartmontools\smartctl Examples"
468 RMDir "$SMPROGRAMS\smartmontools\smartd Examples"
469 RMDir "$SMPROGRAMS\smartmontools"
474 ; Remove install dir from PATH
476 Call un.RemoveFromPath
478 ; Remove drive menu registry entries
479 !insertmacro DriveMenuRemove
481 ; Check for still existing entries
482 IfFileExists "$INSTDIR\bin\smartd.exe" 0 +3
483 MessageBox MB_OK|MB_ICONEXCLAMATION "$INSTDIR\bin\smartd.exe could not be removed.$\nsmartd is possibly still running." /SD IDOK
485 IfFileExists "$INSTDIR" 0 +2
486 MessageBox MB_OK "Note: $INSTDIR could not be removed." /SD IDOK
488 IfFileExists "$SMPROGRAMS\smartmontools" 0 +2
489 MessageBox MB_OK "Note: $SMPROGRAMS\smartmontools could not be removed." /SD IDOK
493 ;--------------------------------------------------------------------
496 !macro AdjustSectionSize section
497 SectionGetSize ${section} $0
499 SectionSetSize ${section} $0
504 ; Set default install directories
505 StrCmp $INSTDIR "" 0 endinst ; /D=PATH option specified ?
506 ReadRegStr $INSTDIR HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
507 StrCmp $INSTDIR "" 0 endinst ; Already installed ?
508 ReadRegStr $INSTDIR HKLM "Software\smartmontools" "Install_Dir"
509 StrCmp $INSTDIR "" 0 endinst ; Already installed ?
510 StrCpy $INSTDIR "$PROGRAMFILES\smartmontools"
512 StrCpy $INSTDIR32 $INSTDIR
513 StrCpy $INSTDIR64 "$PROGRAMFILES64\smartmontools"
518 ; Sizes of binary sections include 32-bit and 64-bit executables
519 !insertmacro AdjustSectionSize ${SMARTCTL_SECTION}
520 !insertmacro AdjustSectionSize ${SMARTD_SECTION}
521 !insertmacro AdjustSectionSize ${SMARTCTL_NC_SECTION}
524 ; Use Notepad++ if installed
525 StrCpy $EDITOR "$PROGRAMFILES\Notepad++\notepad++.exe"
526 IfFileExists "$EDITOR" +2 0
527 StrCpy $EDITOR "notepad.exe"
532 ; Check x64 section and update INSTDIR accordingly
536 SectionGetFlags ${X64_SECTION} $0
537 IntOp $0 $0 & ${SF_SELECTED}
538 IntCmp $0 ${SF_SELECTED} x64
540 StrCmp $INSTDIR32 "" +3
541 StrCpy $INSTDIR $INSTDIR32
546 StrCmp $INSTDIR64 "" +3
547 StrCpy $INSTDIR $INSTDIR64
553 ; Command line parsing
554 !macro CheckCmdLineOption name section
555 StrCpy $allopts "$allopts,${name}"
560 StrCmp $0 "" 0 sel_${name}
561 !insertmacro UnselectSection ${section}
564 !insertmacro SelectSection ${section}
569 Function ParseCmdLine
573 ${GetOptions} $R0 "/SO" $opts
580 ; turn sections on or off
582 !insertmacro CheckCmdLineOption "x64" ${X64_SECTION}
584 StrCmp $opts "x64" 0 +2
585 Return ; leave sections unchanged if only "x64" is specified
587 !insertmacro CheckCmdLineOption "smartctl" ${SMARTCTL_SECTION}
588 !insertmacro CheckCmdLineOption "smartd" ${SMARTD_SECTION}
589 !insertmacro CheckCmdLineOption "smartctlnc" ${SMARTCTL_NC_SECTION}
590 !insertmacro CheckCmdLineOption "drivedb" ${DRIVEDB_SECTION}
591 !insertmacro CheckCmdLineOption "doc" ${DOC_SECTION}
592 !insertmacro CheckCmdLineOption "uninst" ${UNINST_SECTION}
593 !insertmacro CheckCmdLineOption "menu" ${MENU_SECTION}
594 !insertmacro CheckCmdLineOption "path" ${PATH_SECTION}
595 !insertmacro CheckCmdLineOption "driveremove" ${DRIVE_REMOVE_SECTION}
596 !insertmacro CheckCmdLineOption "drive0" ${DRIVE_0_SECTION}
597 !insertmacro CheckCmdLineOption "drive1" ${DRIVE_1_SECTION}
598 !insertmacro CheckCmdLineOption "drive2" ${DRIVE_2_SECTION}
599 !insertmacro CheckCmdLineOption "drive3" ${DRIVE_3_SECTION}
600 !insertmacro CheckCmdLineOption "drive4" ${DRIVE_4_SECTION}
601 !insertmacro CheckCmdLineOption "drive5" ${DRIVE_5_SECTION}
602 StrCmp $opts "-" done
603 StrCmp $nomatch "" done
604 StrCpy $0 "$allopts,-" "" 1
605 MessageBox MB_OK "Usage: smartmontools-VERSION.win32-setup [/S] [/SO component,...] [/D=INSTDIR]$\n$\ncomponents:$\n $0"
610 ; Install runcmda.exe if missing
612 Function CheckRunCmdA
613 IfFileExists "$INSTDIR\bin\runcmda.exe" done 0
614 SetOutPath "$INSTDIR\bin"
615 !insertmacro FileExe "bin\runcmda.exe" ""
616 File "${INPDIR}\bin\runcmda.exe.manifest"
621 ;--------------------------------------------------------------------
624 ; Based on example from:
625 ; http://nsis.sourceforge.net/Path_Manipulation
629 !include "WinMessages.nsh"
631 ; Registry Entry for environment (NT4,2000,XP)
633 ;!define Environ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
635 !define Environ 'HKCU "Environment"'
638 ; AddToPath - Appends dir to PATH
639 ; (does not work on Win9x/ME)
651 ReadRegStr $1 ${Environ} "PATH"
663 DetailPrint "Add to PATH: $0"
666 StrCpy $1 $1 -1 ; remove trailing ';'
667 StrCmp $1 "" +2 ; no leading ';'
669 WriteRegExpandStr ${Environ} "PATH" $0
670 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
680 ; RemoveFromPath - Removes dir from PATH
684 ; Call RemoveFromPath
686 Function un.RemoveFromPath
695 ReadRegStr $1 ${Environ} "PATH"
698 StrCpy $1 "$1;" ; ensure trailing ';'
702 Pop $2 ; pos of our dir
705 DetailPrint "Remove from PATH: $0"
708 StrCpy $5 $1 -$4 ; $5 is now the part before the path to remove
709 StrCpy $6 $2 "" $3 ; $6 is now the part after the path to remove
713 StrCpy $3 $3 -1 ; remove trailing ';'
714 WriteRegExpandStr ${Environ} "PATH" $3
715 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
728 ; StrStr - find substring in a string
731 ; Push "this is some string"
734 ; Pop $0 ; "some string"
738 Exch $R1 ; $R1=substring, stack=[old$R1,string,...]
739 Exch ; stack=[string,old$R1,...]
740 Exch $R2 ; $R2=string, stack=[old$R2,old$R1,...]
746 ; $R1=substring, $R2=string, $R3=strlen(substring)
749 StrCpy $R5 $R2 $R3 $R4
755 StrCpy $R1 $R2 "" $R4
760 Exch $R1 ; $R1=old$R1, stack=[result,...]
763 !insertmacro StrStr ""
764 !insertmacro StrStr "un."
767 ;--------------------------------------------------------------------
768 ; Set Run As Administrator flag in shortcut
770 ; Slightly modified version from:
771 ; http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
774 !include "LogicLib.nsh"
776 !define IPersistFile {0000010b-0000-0000-c000-000000000046}
777 !define CLSID_ShellLink {00021401-0000-0000-C000-000000000046}
778 !define IID_IShellLinkA {000214EE-0000-0000-C000-000000000046}
779 !define IID_IShellLinkW {000214F9-0000-0000-C000-000000000046}
780 !define IShellLinkDataList {45e2b4ae-b1c3-11d0-b92f-00a0c90312e1}
782 !define IID_IShellLink ${IID_IShellLinkW}
784 !define IID_IShellLink ${IID_IShellLinkA}
787 Function ShellLinkSetRunAs
788 ; Set archive location of $PLUGINSDIR
790 SetOutPath "$INSTDIR"
792 System::Store S ; push $0-$9, $R0-$R9
794 ; $0 = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, IID_IShellLink, &$1)
795 System::Call "ole32::CoCreateInstance(g'${CLSID_ShellLink}',i0,i1,g'${IID_IShellLink}',*i.r1)i.r0"
797 System::Call "$1->0(g'${IPersistFile}',*i.r2)i.r0" ; $0 = $1->QueryInterface(IPersistFile, &$2)
799 System::Call "$2->5(w '$9',i 0)i.r0" ; $0 = $2->Load($9, STGM_READ)
801 System::Call "$1->0(g'${IShellLinkDataList}',*i.r3)i.r0" ; $0 = $1->QueryInterface(IShellLinkDataList, &$3)
803 System::Call "$3->6(*i.r4)i.r0"; $0 = $3->GetFlags(&$4)
805 System::Call "$3->7(i $4|0x2000)i.r0" ; $0 = $3->SetFlags($4|SLDF_RUNAS_USER)
807 System::Call "$2->6(w '$9',i1)i.r0" ; $2->Save($9, TRUE)
810 System::Call "$3->2()" ; $3->Release()
812 System::Call "$2->2()" ; $2->Release()
815 System::Call "$1->2()" ; $1->Release()
818 DetailPrint "Set RunAsAdmin: $9 failed ($0)"
820 DetailPrint "Set RunAsAdmin: $9"
822 System::Store L ; push $0-$9, $R0-$R9