2 ; smartmontools install NSIS script
4 ; Home page of code is: http://smartmontools.sourceforge.net
6 ; Copyright (C) 2006-13 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 3759 2013-01-26 21:11:02Z 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 ; Save installation location
212 WriteRegStr HKLM "Software\smartmontools" "Install_Dir" "$INSTDIR"
214 ; Write uninstall keys and program
215 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayName" "smartmontools"
217 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayVersion" "${VERSTR}"
219 ;WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "Publisher" "smartmontools"
220 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "UninstallString" '"$INSTDIR\uninst-smartmontools.exe"'
221 ;WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLInfoAbout" "http://smartmontools.sourceforge.net/"
222 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "HelpLink" "http://smartmontools.sourceforge.net/"
223 ;WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLUpdateInfo" "http://sourceforge.net/project/showfiles.php?group_id=64297"
224 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLUpdateInfo" "http://smartmontools-win32.dyndns.org/"
225 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoModify" 1
226 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoRepair" 1
227 WriteUninstaller "uninst-smartmontools.exe"
231 Section "Start Menu Shortcuts" MENU_SECTION
235 SetShellVarContext all
237 CreateDirectory "$SMPROGRAMS\smartmontools"
239 !macro CreateAdminShortCut link target args
240 CreateShortCut '${link}' '${target}' '${args}'
242 Call ShellLinkSetRunAs
246 IfFileExists "$INSTDIR\bin\smartctl.exe" 0 +2
247 IfFileExists "$INSTDIR\bin\smartd.exe" 0 noruncmd
248 SetOutPath "$INSTDIR\bin"
249 !insertmacro FileExe "bin\runcmdu.exe" ""
250 File "${INPDIR}\bin\runcmdu.exe.manifest"
254 IfFileExists "$INSTDIR\bin\smartctl.exe" 0 noctl
255 SetOutPath "$INSTDIR\bin"
256 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl (Admin CMD).lnk" "$WINDIR\system32\cmd.exe" '/k PATH=$INSTDIR\bin;%PATH%&cd /d "$INSTDIR\bin"'
257 CreateDirectory "$SMPROGRAMS\smartmontools\smartctl Examples"
258 FileOpen $0 "$SMPROGRAMS\smartmontools\smartctl Examples\!Read this first!.txt" "w"
259 FileWrite $0 "All the example commands in this directory$\r$\napply to the first drive (sda).$\r$\n"
261 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\All info (-x).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -x sda"
262 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Identify drive (-i).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -i sda"
263 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART attributes (-A -f brief).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -A -f brief sda"
264 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART capabilities (-c).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -c sda"
265 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART health status (-H).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -H sda"
266 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART error log (-l error).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l error sda"
267 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART selftest log (-l selftest).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l selftest sda"
268 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start long selftest (-t long).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t long sda"
269 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start offline test (-t offline).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t offline sda"
270 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start short selftest (-t short).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t short sda"
271 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Stop(Abort) selftest (-X).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -X sda"
272 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART off (-s off).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s off sda"
273 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART on (-s on).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s on sda"
277 IfFileExists "$INSTDIR\bin\smartd.exe" 0 nod
278 SetOutPath "$INSTDIR\bin"
279 CreateDirectory "$SMPROGRAMS\smartmontools\smartd Examples"
280 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, smartd.log.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -l local0"
281 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, eventlog.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd"
282 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon stop.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd stop"
283 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Do all tests once (-q onecheck).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -q onecheck"
284 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Debug mode (-d).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -d"
285 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (edit).lnk" "$EDITOR" "$INSTDIR\bin\smartd.conf"
286 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (view).lnk" "$EDITOR" "$INSTDIR\bin\smartd.conf"
287 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.log (view).lnk" "$EDITOR" "$INSTDIR\bin\smartd.log"
290 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, eventlog, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install"
291 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 10min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0 -i 600"
292 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0"
293 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service remove.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd remove"
294 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service start.lnk" "$INSTDIR\bin\runcmdu.exe" "net start smartd"
295 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service stop.lnk" "$INSTDIR\bin\runcmdu.exe" "net stop smartd"
299 IfFileExists "$INSTDIR\doc\README.TXT" 0 nodoc
300 SetOutPath "$INSTDIR\doc"
301 CreateDirectory "$SMPROGRAMS\smartmontools\Documentation"
302 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (html).lnk" "$INSTDIR\doc\smartctl.8.html"
303 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (html).lnk" "$INSTDIR\doc\smartd.8.html"
304 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (html).lnk" "$INSTDIR\doc\smartd.conf.5.html"
305 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (txt).lnk" "$INSTDIR\doc\smartctl.8.txt"
306 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (txt).lnk" "$INSTDIR\doc\smartd.8.txt"
307 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (txt).lnk" "$INSTDIR\doc\smartd.conf.5.txt"
308 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf sample.lnk" "$EDITOR" "$INSTDIR\doc\smartd.conf"
309 IfFileExists "$INSTDIR\bin\drivedb.h" 0 nodb
310 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb.h (view).lnk" "$EDITOR" "$INSTDIR\bin\drivedb.h"
311 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb-add.h (create, edit).lnk" "$EDITOR" "$INSTDIR\bin\drivedb-add.h"
313 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\ChangeLog.lnk" "$INSTDIR\doc\ChangeLog.txt"
314 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\COPYING.lnk" "$INSTDIR\doc\COPYING.txt"
315 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\NEWS.lnk" "$INSTDIR\doc\NEWS.txt"
316 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\Windows version download page.lnk" "http://smartmontools-win32.dyndns.org/smartmontools/"
320 CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Home Page.lnk" "http://smartmontools.sourceforge.net/"
323 IfFileExists "$INSTDIR\bin\update-smart-drivedb.exe" 0 noupdb
324 SetOutPath "$INSTDIR\bin"
325 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\drivedb.h update.lnk" "$INSTDIR\bin\update-smart-drivedb.exe" ""
329 IfFileExists "$INSTDIR\uninst-smartmontools.exe" 0 noinst
330 SetOutPath "$INSTDIR"
331 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Uninstall smartmontools.lnk" "$INSTDIR\uninst-smartmontools.exe" ""
336 Section "Add install dir to PATH" PATH_SECTION
345 SectionGroup "Add smartctl to drive menu"
347 !macro DriveMenuRemove
348 DetailPrint "Remove drive menu entries"
349 DeleteRegKey HKCR "Drive\shell\smartctl0"
350 DeleteRegKey HKCR "Drive\shell\smartctl1"
351 DeleteRegKey HKCR "Drive\shell\smartctl2"
352 DeleteRegKey HKCR "Drive\shell\smartctl3"
353 DeleteRegKey HKCR "Drive\shell\smartctl4"
354 DeleteRegKey HKCR "Drive\shell\smartctl5"
357 Section "Remove existing entries first" DRIVE_REMOVE_SECTION
359 !insertmacro DriveMenuRemove
362 !macro DriveSection id name args
363 Section 'smartctl ${args} ...' DRIVE_${id}_SECTION
366 DetailPrint 'Add drive menu entry "${name}": smartctl ${args} ...'
367 WriteRegStr HKCR "Drive\shell\smartctl${id}" "" "${name}"
368 WriteRegStr HKCR "Drive\shell\smartctl${id}\command" "" '"$INSTDIR\bin\runcmda.exe" "$INSTDIR\bin\smartctl.exe" ${args} %L'
372 !insertmacro DriveSection 0 "SMART all info" "-x"
373 !insertmacro DriveSection 1 "SMART status" "-Hc"
374 !insertmacro DriveSection 2 "SMART attributes" "-A -f brief"
375 !insertmacro DriveSection 3 "SMART short selftest" "-t short"
376 !insertmacro DriveSection 4 "SMART long selftest" "-t long"
377 !insertmacro DriveSection 5 "SMART continue selective selftest" '-t "selective,cont"'
381 ;--------------------------------------------------------------------
385 ; Stop & remove service
386 IfFileExists "$INSTDIR\bin\smartd.exe" 0 nosrv
387 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
389 ExecWait "net stop smartd"
390 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Remove smartd service ?" /SD IDNO IDYES 0 IDNO nosrv
391 ExecWait "$INSTDIR\bin\smartd.exe remove"
394 ; Remove installer registry keys
395 DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools"
396 DeleteRegKey HKLM "Software\smartmontools"
399 IfFileExists "$INSTDIR\bin\smartd.conf" 0 noconf
400 ; Assume unchanged if timestamp is equal to sample file
401 GetFileTime "$INSTDIR\bin\smartd.conf" $0 $1
402 GetFileTime "$INSTDIR\doc\smartd.conf" $2 $3
403 StrCmp "$0:$1" "$2:$3" +2 0
404 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO noconf
405 Delete "$INSTDIR\bin\smartd.conf"
409 IfFileExists "$INSTDIR\bin\smartd.log" 0 +3
410 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete log file$\n$INSTDIR\bin\smartd.log ?" /SD IDNO IDYES 0 IDNO +2
411 Delete "$INSTDIR\bin\smartd.log"
413 ; Remove drivedb-add file ?
414 IfFileExists "$INSTDIR\bin\drivedb-add.h" 0 +3
415 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete local drive database file$\n$INSTDIR\bin\drivedb-add.h ?" /SD IDNO IDYES 0 IDNO +2
416 Delete "$INSTDIR\bin\drivedb-add.h"
419 Delete "$INSTDIR\bin\smartctl.exe"
420 Delete "$INSTDIR\bin\smartctl-nc.exe"
421 Delete "$INSTDIR\bin\smartd.exe"
422 Delete "$INSTDIR\bin\smartd_warning.cmd" ; TODO: Check for modifications?
423 Delete "$INSTDIR\bin\drivedb.h"
424 Delete "$INSTDIR\bin\drivedb.h.error"
425 Delete "$INSTDIR\bin\drivedb.h.lastcheck"
426 Delete "$INSTDIR\bin\drivedb.h.old"
427 Delete "$INSTDIR\bin\update-smart-drivedb.exe"
428 Delete "$INSTDIR\bin\smartctl-run.bat"
429 Delete "$INSTDIR\bin\smartd-run.bat"
430 Delete "$INSTDIR\bin\net-run.bat"
431 Delete "$INSTDIR\bin\runcmda.exe"
432 Delete "$INSTDIR\bin\runcmda.exe.manifest"
433 Delete "$INSTDIR\bin\runcmdu.exe"
434 Delete "$INSTDIR\bin\runcmdu.exe.manifest"
435 Delete "$INSTDIR\bin\wtssendmsg.exe"
436 Delete "$INSTDIR\doc\AUTHORS.txt"
437 Delete "$INSTDIR\doc\ChangeLog.txt"
438 Delete "$INSTDIR\doc\ChangeLog-5.0-6.0.txt"
439 Delete "$INSTDIR\doc\COPYING.txt"
440 Delete "$INSTDIR\doc\INSTALL.txt"
441 Delete "$INSTDIR\doc\NEWS.txt"
442 Delete "$INSTDIR\doc\README.txt"
443 Delete "$INSTDIR\doc\TODO.txt"
444 Delete "$INSTDIR\doc\WARNINGS.txt"
445 Delete "$INSTDIR\doc\checksums*.txt"
446 Delete "$INSTDIR\doc\smartctl.8.html"
447 Delete "$INSTDIR\doc\smartctl.8.txt"
448 Delete "$INSTDIR\doc\smartd.8.html"
449 Delete "$INSTDIR\doc\smartd.8.txt"
450 Delete "$INSTDIR\doc\smartd.conf"
451 Delete "$INSTDIR\doc\smartd.conf.5.html"
452 Delete "$INSTDIR\doc\smartd.conf.5.txt"
453 Delete "$INSTDIR\uninst-smartmontools.exe"
456 SetShellVarContext all
457 Delete "$SMPROGRAMS\smartmontools\*.*"
458 Delete "$SMPROGRAMS\smartmontools\Documentation\*.*"
459 Delete "$SMPROGRAMS\smartmontools\smartctl Examples\*.*"
460 Delete "$SMPROGRAMS\smartmontools\smartd Examples\*.*"
463 RMDir "$SMPROGRAMS\smartmontools\Documentation"
464 RMDir "$SMPROGRAMS\smartmontools\smartctl Examples"
465 RMDir "$SMPROGRAMS\smartmontools\smartd Examples"
466 RMDir "$SMPROGRAMS\smartmontools"
471 ; Remove install dir from PATH
473 Call un.RemoveFromPath
475 ; Remove drive menu registry entries
476 !insertmacro DriveMenuRemove
478 ; Check for still existing entries
479 IfFileExists "$INSTDIR\bin\smartd.exe" 0 +3
480 MessageBox MB_OK|MB_ICONEXCLAMATION "$INSTDIR\bin\smartd.exe could not be removed.$\nsmartd is possibly still running." /SD IDOK
482 IfFileExists "$INSTDIR" 0 +2
483 MessageBox MB_OK "Note: $INSTDIR could not be removed." /SD IDOK
485 IfFileExists "$SMPROGRAMS\smartmontools" 0 +2
486 MessageBox MB_OK "Note: $SMPROGRAMS\smartmontools could not be removed." /SD IDOK
490 ;--------------------------------------------------------------------
493 !macro AdjustSectionSize section
494 SectionGetSize ${section} $0
496 SectionSetSize ${section} $0
501 ; Set default install directories
502 StrCmp $INSTDIR "" 0 endinst ; /D=PATH option specified ?
503 ReadRegStr $INSTDIR HKLM "Software\smartmontools" "Install_Dir"
504 StrCmp $INSTDIR "" 0 endinst ; Already installed ?
505 StrCpy $INSTDIR "$PROGRAMFILES\smartmontools"
507 StrCpy $INSTDIR32 $INSTDIR
508 StrCpy $INSTDIR64 "$PROGRAMFILES64\smartmontools"
513 ; Sizes of binary sections include 32-bit and 64-bit executables
514 !insertmacro AdjustSectionSize ${SMARTCTL_SECTION}
515 !insertmacro AdjustSectionSize ${SMARTD_SECTION}
516 !insertmacro AdjustSectionSize ${SMARTCTL_NC_SECTION}
519 ; Use Notepad++ if installed
520 StrCpy $EDITOR "$PROGRAMFILES\Notepad++\notepad++.exe"
521 IfFileExists "$EDITOR" +2 0
522 StrCpy $EDITOR "notepad.exe"
527 ; Check x64 section and update INSTDIR accordingly
531 SectionGetFlags ${X64_SECTION} $0
532 IntOp $0 $0 & ${SF_SELECTED}
533 IntCmp $0 ${SF_SELECTED} x64
535 StrCmp $INSTDIR32 "" +3
536 StrCpy $INSTDIR $INSTDIR32
541 StrCmp $INSTDIR64 "" +3
542 StrCpy $INSTDIR $INSTDIR64
548 ; Command line parsing
549 !macro CheckCmdLineOption name section
550 StrCpy $allopts "$allopts,${name}"
555 StrCmp $0 "" 0 sel_${name}
556 !insertmacro UnselectSection ${section}
559 !insertmacro SelectSection ${section}
564 Function ParseCmdLine
568 ${GetOptions} $R0 "/SO" $opts
575 ; turn sections on or off
577 !insertmacro CheckCmdLineOption "x64" ${X64_SECTION}
579 StrCmp $opts "x64" 0 +2
580 Return ; leave sections unchanged if only "x64" is specified
582 !insertmacro CheckCmdLineOption "smartctl" ${SMARTCTL_SECTION}
583 !insertmacro CheckCmdLineOption "smartd" ${SMARTD_SECTION}
584 !insertmacro CheckCmdLineOption "smartctlnc" ${SMARTCTL_NC_SECTION}
585 !insertmacro CheckCmdLineOption "drivedb" ${DRIVEDB_SECTION}
586 !insertmacro CheckCmdLineOption "doc" ${DOC_SECTION}
587 !insertmacro CheckCmdLineOption "uninst" ${UNINST_SECTION}
588 !insertmacro CheckCmdLineOption "menu" ${MENU_SECTION}
589 !insertmacro CheckCmdLineOption "path" ${PATH_SECTION}
590 !insertmacro CheckCmdLineOption "driveremove" ${DRIVE_REMOVE_SECTION}
591 !insertmacro CheckCmdLineOption "drive0" ${DRIVE_0_SECTION}
592 !insertmacro CheckCmdLineOption "drive1" ${DRIVE_1_SECTION}
593 !insertmacro CheckCmdLineOption "drive2" ${DRIVE_2_SECTION}
594 !insertmacro CheckCmdLineOption "drive3" ${DRIVE_3_SECTION}
595 !insertmacro CheckCmdLineOption "drive4" ${DRIVE_4_SECTION}
596 !insertmacro CheckCmdLineOption "drive5" ${DRIVE_5_SECTION}
597 StrCmp $opts "-" done
598 StrCmp $nomatch "" done
599 StrCpy $0 "$allopts,-" "" 1
600 MessageBox MB_OK "Usage: smartmontools-VERSION.win32-setup [/S] [/SO component,...] [/D=INSTDIR]$\n$\ncomponents:$\n $0"
605 ; Install runcmda.exe if missing
607 Function CheckRunCmdA
608 IfFileExists "$INSTDIR\bin\runcmda.exe" done 0
609 SetOutPath "$INSTDIR\bin"
610 !insertmacro FileExe "bin\runcmda.exe" ""
611 File "${INPDIR}\bin\runcmda.exe.manifest"
616 ;--------------------------------------------------------------------
619 ; Based on example from:
620 ; http://nsis.sourceforge.net/Path_Manipulation
624 !include "WinMessages.nsh"
626 ; Registry Entry for environment (NT4,2000,XP)
628 ;!define Environ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
630 !define Environ 'HKCU "Environment"'
633 ; AddToPath - Appends dir to PATH
634 ; (does not work on Win9x/ME)
646 ReadRegStr $1 ${Environ} "PATH"
658 DetailPrint "Add to PATH: $0"
661 StrCpy $1 $1 -1 ; remove trailing ';'
662 StrCmp $1 "" +2 ; no leading ';'
664 WriteRegExpandStr ${Environ} "PATH" $0
665 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
675 ; RemoveFromPath - Removes dir from PATH
679 ; Call RemoveFromPath
681 Function un.RemoveFromPath
690 ReadRegStr $1 ${Environ} "PATH"
693 StrCpy $1 "$1;" ; ensure trailing ';'
697 Pop $2 ; pos of our dir
700 DetailPrint "Remove from PATH: $0"
703 StrCpy $5 $1 -$4 ; $5 is now the part before the path to remove
704 StrCpy $6 $2 "" $3 ; $6 is now the part after the path to remove
708 StrCpy $3 $3 -1 ; remove trailing ';'
709 WriteRegExpandStr ${Environ} "PATH" $3
710 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
723 ; StrStr - find substring in a string
726 ; Push "this is some string"
729 ; Pop $0 ; "some string"
733 Exch $R1 ; $R1=substring, stack=[old$R1,string,...]
734 Exch ; stack=[string,old$R1,...]
735 Exch $R2 ; $R2=string, stack=[old$R2,old$R1,...]
741 ; $R1=substring, $R2=string, $R3=strlen(substring)
744 StrCpy $R5 $R2 $R3 $R4
750 StrCpy $R1 $R2 "" $R4
755 Exch $R1 ; $R1=old$R1, stack=[result,...]
758 !insertmacro StrStr ""
759 !insertmacro StrStr "un."
762 ;--------------------------------------------------------------------
763 ; Set Run As Administrator flag in shortcut
765 ; Slightly modified version from:
766 ; http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
769 !include "LogicLib.nsh"
771 !define IPersistFile {0000010b-0000-0000-c000-000000000046}
772 !define CLSID_ShellLink {00021401-0000-0000-C000-000000000046}
773 !define IID_IShellLinkA {000214EE-0000-0000-C000-000000000046}
774 !define IID_IShellLinkW {000214F9-0000-0000-C000-000000000046}
775 !define IShellLinkDataList {45e2b4ae-b1c3-11d0-b92f-00a0c90312e1}
777 !define IID_IShellLink ${IID_IShellLinkW}
779 !define IID_IShellLink ${IID_IShellLinkA}
782 Function ShellLinkSetRunAs
783 ; Set archive location of $PLUGINSDIR
785 SetOutPath "$INSTDIR"
787 System::Store S ; push $0-$9, $R0-$R9
789 ; $0 = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, IID_IShellLink, &$1)
790 System::Call "ole32::CoCreateInstance(g'${CLSID_ShellLink}',i0,i1,g'${IID_IShellLink}',*i.r1)i.r0"
792 System::Call "$1->0(g'${IPersistFile}',*i.r2)i.r0" ; $0 = $1->QueryInterface(IPersistFile, &$2)
794 System::Call "$2->5(w '$9',i 0)i.r0" ; $0 = $2->Load($9, STGM_READ)
796 System::Call "$1->0(g'${IShellLinkDataList}',*i.r3)i.r0" ; $0 = $1->QueryInterface(IShellLinkDataList, &$3)
798 System::Call "$3->6(*i.r4)i.r0"; $0 = $3->GetFlags(&$4)
800 System::Call "$3->7(i $4|0x2000)i.r0" ; $0 = $3->SetFlags($4|SLDF_RUNAS_USER)
802 System::Call "$2->6(w '$9',i1)i.r0" ; $2->Save($9, TRUE)
805 System::Call "$3->2()" ; $3->Release()
807 System::Call "$2->2()" ; $2->Release()
810 System::Call "$1->2()" ; $1->Release()
813 DetailPrint "Set RunAsAdmin: $9 failed ($0)"
815 DetailPrint "Set RunAsAdmin: $9"
817 System::Store L ; push $0-$9, $R0-$R9