]> git.proxmox.com Git - mirror_smartmontools-debian.git/blame - os_win32/installer.nsi
import smartmontools 7.0
[mirror_smartmontools-debian.git] / os_win32 / installer.nsi
CommitLineData
4d59bff9 1;
a86ec89e 2; os_win32/installer.nsi - smartmontools install NSIS script
4d59bff9 3;
a86ec89e 4; Home page of code is: http://www.smartmontools.org
4d59bff9 5;
f9e10201 6; Copyright (C) 2006-17 Christian Franke
4d59bff9 7;
ff28b140 8; SPDX-License-Identifier: GPL-2.0-or-later
4d59bff9 9;
ff28b140 10; $Id: installer.nsi 4760 2018-08-19 18:45:53Z chrfranke $
4d59bff9
GG
11;
12
13
14;--------------------------------------------------------------------
15; Command line arguments:
f4e463df
GI
16; makensis -DINPDIR=<input-dir> -DINPDIR64=<input-dir-64-bit> \
17; -DOUTFILE=<output-file> -DVERSTR=<version-string> installer.nsi
4d59bff9
GG
18
19!ifndef INPDIR
20 !define INPDIR "."
21!endif
22
23!ifndef OUTFILE
24 !define OUTFILE "smartmontools.win32-setup.exe"
25!endif
26
27;--------------------------------------------------------------------
28; General
29
30Name "smartmontools"
31OutFile "${OUTFILE}"
32
a86ec89e
GI
33RequestExecutionLevel admin
34
4d59bff9
GG
35SetCompressor /solid lzma
36
37XPStyle on
38InstallColors /windows
39
f4e463df
GI
40; Set in .onInit
41;InstallDir "$PROGRAMFILES\smartmontools"
a86ec89e 42;InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
d008864d 43
ff28b140
TL
44!ifdef VERSION
45 VIProductVersion "${VERSION}"
46 VIAddVersionKey /LANG=1033-English "CompanyName" "www.smartmontools.org"
47 VIAddVersionKey /LANG=1033-English "FileDescription" "SMART Monitoring Tools"
48 VIAddVersionKey /LANG=1033-English "FileVersion" "${VERSION}"
49 !ifdef YY
50 VIAddVersionKey /LANG=1033-English "LegalCopyright" "(C) 2002-20${YY}, Bruce Allen, Christian Franke, www.smartmontools.org"
51 !endif
52 VIAddVersionKey /LANG=1033-English "OriginalFilename" "${OUTFILE}"
53 VIAddVersionKey /LANG=1033-English "ProductName" "smartmontools"
54 VIAddVersionKey /LANG=1033-English "ProductVersion" "${VERSION}"
55!endif
56
d008864d 57Var EDITOR
f4e463df
GI
58
59!ifdef INPDIR64
60 Var X64
61 Var INSTDIR32
62 Var INSTDIR64
63!endif
4d59bff9
GG
64
65LicenseData "${INPDIR}\doc\COPYING.txt"
66
a7e8ffec 67!include "FileFunc.nsh"
a86ec89e 68!include "LogicLib.nsh"
a7e8ffec
GI
69!include "Sections.nsh"
70
a7e8ffec 71
4d59bff9
GG
72;--------------------------------------------------------------------
73; Pages
74
75Page license
76Page components
f4e463df
GI
77!ifdef INPDIR64
78 Page directory CheckX64
79!else
80 Page directory
81!endif
4d59bff9
GG
82Page instfiles
83
84UninstPage uninstConfirm
85UninstPage instfiles
86
87InstType "Full"
88InstType "Extract files only"
a37e7145 89InstType "Drive menu"
a86ec89e
GI
90!ifdef INPDIR64
91InstType "Full (x64)"
92InstType "Extract files only (x64)"
93InstType "Drive menu (x64)"
94!endif
4d59bff9
GG
95
96
97;--------------------------------------------------------------------
98; Sections
99
f4e463df 100!ifdef INPDIR64
ee38a438 101 Section "64-bit version" X64_SECTION
a86ec89e 102 SectionIn 4 5 6
f4e463df
GI
103 ; Handled in Function CheckX64
104 SectionEnd
a86ec89e
GI
105
106 !define FULL_TYPES "1 4"
107 !define EXTRACT_TYPES "2 5"
108 !define DRIVEMENU_TYPE "3 6"
109!else
110 !define FULL_TYPES "1"
111 !define EXTRACT_TYPES "2"
112 !define DRIVEMENU_TYPE "3"
f4e463df
GI
113!endif
114
a37e7145 115SectionGroup "!Program files"
4d59bff9 116
f4e463df
GI
117 !macro FileExe path option
118 !ifdef INPDIR64
119 ; Use dummy SetOutPath to control archive location of executables
a86ec89e 120 ${If} $X64 != ""
f4e463df
GI
121 Goto +2
122 SetOutPath "$INSTDIR\bin64"
123 File ${option} '${INPDIR64}\${path}'
a86ec89e 124 ${Else}
f4e463df
GI
125 Goto +2
126 SetOutPath "$INSTDIR\bin"
127 File ${option} '${INPDIR}\${path}'
a86ec89e 128 ${EndIf}
f4e463df
GI
129 !else
130 File ${option} '${INPDIR}\${path}'
131 !endif
132 !macroend
133
a37e7145 134 Section "smartctl" SMARTCTL_SECTION
4d59bff9 135
a86ec89e 136 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
4d59bff9
GG
137
138 SetOutPath "$INSTDIR\bin"
f4e463df 139 !insertmacro FileExe "bin\smartctl.exe" ""
4d59bff9
GG
140
141 SectionEnd
142
a37e7145 143 Section "smartd" SMARTD_SECTION
4d59bff9 144
a86ec89e 145 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
4d59bff9
GG
146
147 SetOutPath "$INSTDIR\bin"
a37e7145
GG
148
149 ; Stop service ?
150 StrCpy $1 ""
a86ec89e 151 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
a37e7145 152 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
a86ec89e 153 ${If} $0 != ""
a37e7145 154 ExecWait "net stop smartd" $1
a86ec89e
GI
155 ${EndIf}
156 ${EndIf}
f4e463df 157 !insertmacro FileExe "bin\smartd.exe" ""
4d59bff9
GG
158
159 IfFileExists "$INSTDIR\bin\smartd.conf" 0 +2
ee38a438 160 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Replace existing configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO +2
4d59bff9
GG
161 File "${INPDIR}\doc\smartd.conf"
162
f9e10201
JD
163 File "${INPDIR}\bin\smartd_mailer.ps1"
164 File "${INPDIR}\bin\smartd_mailer.conf.sample.ps1"
ee38a438
GI
165 File "${INPDIR}\bin\smartd_warning.cmd"
166 !insertmacro FileExe "bin\wtssendmsg.exe" ""
4d59bff9 167
a37e7145 168 ; Restart service ?
a86ec89e 169 ${If} $1 == "0"
ee38a438 170 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Restart smartd service ?" /SD IDNO IDYES 0 IDNO +2
a37e7145 171 ExecWait "net start smartd"
a86ec89e 172 ${EndIf}
a37e7145 173
4d59bff9
GG
174 SectionEnd
175
2127e193
GI
176 Section "smartctl-nc (GSmartControl)" SMARTCTL_NC_SECTION
177
a86ec89e 178 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
2127e193
GI
179
180 SetOutPath "$INSTDIR\bin"
f4e463df 181 !insertmacro FileExe "bin\smartctl-nc.exe" ""
2127e193
GI
182
183 SectionEnd
184
cfbba5b9
GI
185 Section "drivedb.h (Drive Database)" DRIVEDB_SECTION
186
a86ec89e 187 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
cfbba5b9
GI
188
189 SetOutPath "$INSTDIR\bin"
190 File "${INPDIR}\bin\drivedb.h"
191 File "${INPDIR}\bin\update-smart-drivedb.exe"
192
193 SectionEnd
194
4d59bff9
GG
195SectionGroupEnd
196
a37e7145 197Section "!Documentation" DOC_SECTION
4d59bff9 198
a86ec89e 199 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
4d59bff9
GG
200
201 SetOutPath "$INSTDIR\doc"
202 File "${INPDIR}\doc\AUTHORS.txt"
ee38a438
GI
203 File "${INPDIR}\doc\ChangeLog.txt"
204 File "${INPDIR}\doc\ChangeLog-5.0-6.0.txt"
4d59bff9
GG
205 File "${INPDIR}\doc\COPYING.txt"
206 File "${INPDIR}\doc\INSTALL.txt"
207 File "${INPDIR}\doc\NEWS.txt"
208 File "${INPDIR}\doc\README.txt"
209 File "${INPDIR}\doc\TODO.txt"
f4e463df 210!ifdef INPDIR64
a86ec89e 211 ${If} $X64 != ""
f4e463df 212 File "${INPDIR64}\doc\checksums64.txt"
a86ec89e 213 ${Else}
f4e463df 214 File "${INPDIR}\doc\checksums32.txt"
a86ec89e 215 ${EndIf}
f4e463df
GI
216!else
217 File "${INPDIR}\doc\checksums??.txt"
218!endif
4d59bff9 219 File "${INPDIR}\doc\smartctl.8.html"
f9e10201
JD
220 File "${INPDIR}\doc\smartctl.8.pdf"
221 Delete "$INSTDIR\doc\smartctl.8.txt" ; TODO: Remove after smartmontools 6.6
4d59bff9 222 File "${INPDIR}\doc\smartd.8.html"
f9e10201
JD
223 File "${INPDIR}\doc\smartd.8.pdf"
224 Delete "$INSTDIR\doc\smartd.8.txt" ; TODO: Remove after smartmontools 6.6
4d59bff9
GG
225 File "${INPDIR}\doc\smartd.conf"
226 File "${INPDIR}\doc\smartd.conf.5.html"
f9e10201
JD
227 File "${INPDIR}\doc\smartd.conf.5.pdf"
228 Delete "$INSTDIR\doc\smartd.conf.5.txt" ; TODO: Remove after smartmontools 6.6
4d59bff9
GG
229
230SectionEnd
231
a37e7145 232Section "Uninstaller" UNINST_SECTION
4d59bff9 233
a86ec89e 234 SectionIn ${FULL_TYPES}
f4e463df 235 AddSize 40
4d59bff9
GG
236
237 CreateDirectory "$INSTDIR"
238
ff28b140
TL
239 ; Remove old "Install_Dir" registry entry (smartmontools < r3911/6.3)
240 ; No longer needed for GSmartControl
241 DeleteRegKey HKLM "Software\smartmontools" ; TODO: Remove after smartmontools 6.7
4d59bff9
GG
242
243 ; Write uninstall keys and program
244 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayName" "smartmontools"
2127e193
GI
245!ifdef VERSTR
246 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayVersion" "${VERSTR}"
247!endif
ff28b140 248 ; Important: GSmartControl (>= 1.0.0) reads "InstallLocation" to detect location of bin\smartctl-nc.exe
d2e702cf 249 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation" "$INSTDIR"
4d59bff9 250 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "UninstallString" '"$INSTDIR\uninst-smartmontools.exe"'
d2e702cf 251 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "Publisher" "smartmontools.org"
a86ec89e 252 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLInfoAbout" "https://www.smartmontools.org/"
f9e10201
JD
253 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "HelpLink" "https://www.smartmontools.org/wiki/Help"
254 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLUpdateInfo" "https://builds.smartmontools.org/"
4d59bff9
GG
255 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoModify" 1
256 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoRepair" 1
257 WriteUninstaller "uninst-smartmontools.exe"
258
259SectionEnd
260
a37e7145 261Section "Start Menu Shortcuts" MENU_SECTION
4d59bff9 262
a86ec89e 263 SectionIn ${FULL_TYPES}
4d59bff9 264
a7e8ffec
GI
265 SetShellVarContext all
266
4d59bff9
GG
267 CreateDirectory "$SMPROGRAMS\smartmontools"
268
d008864d
GI
269 !macro CreateAdminShortCut link target args
270 CreateShortCut '${link}' '${target}' '${args}'
271 push '${link}'
272 Call ShellLinkSetRunAs
273 !macroend
274
275 ; runcmdu
a86ec89e
GI
276 ${If} ${FileExists} "$INSTDIR\bin\smartctl.exe"
277 ${OrIf} ${FileExists} "$INSTDIR\bin\smartd.exe"
d008864d 278 SetOutPath "$INSTDIR\bin"
f4e463df 279 !insertmacro FileExe "bin\runcmdu.exe" ""
a86ec89e 280 ${EndIf}
d008864d 281
4d59bff9 282 ; smartctl
a86ec89e 283 ${If} ${FileExists} "$INSTDIR\bin\smartctl.exe"
4d59bff9 284 SetOutPath "$INSTDIR\bin"
ee38a438 285 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl (Admin CMD).lnk" "$WINDIR\system32\cmd.exe" '/k PATH=$INSTDIR\bin;%PATH%&cd /d "$INSTDIR\bin"'
4d59bff9
GG
286 CreateDirectory "$SMPROGRAMS\smartmontools\smartctl Examples"
287 FileOpen $0 "$SMPROGRAMS\smartmontools\smartctl Examples\!Read this first!.txt" "w"
a37e7145 288 FileWrite $0 "All the example commands in this directory$\r$\napply to the first drive (sda).$\r$\n"
4d59bff9 289 FileClose $0
ee38a438 290 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\All info (-x).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -x sda"
d008864d 291 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Identify drive (-i).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -i sda"
ee38a438 292 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART attributes (-A -f brief).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -A -f brief sda"
d008864d
GI
293 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART capabilities (-c).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -c sda"
294 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART health status (-H).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -H sda"
295 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART error log (-l error).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l error sda"
296 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART selftest log (-l selftest).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l selftest sda"
297 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start long selftest (-t long).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t long sda"
298 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start offline test (-t offline).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t offline sda"
299 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start short selftest (-t short).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t short sda"
300 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Stop(Abort) selftest (-X).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -X sda"
301 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART off (-s off).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s off sda"
302 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART on (-s on).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s on sda"
a86ec89e 303 ${EndIf}
4d59bff9
GG
304
305 ; smartd
a86ec89e 306 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
4d59bff9 307 SetOutPath "$INSTDIR\bin"
4d59bff9 308 CreateDirectory "$SMPROGRAMS\smartmontools\smartd Examples"
d008864d
GI
309 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, smartd.log.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -l local0"
310 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, eventlog.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd"
311 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon stop.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd stop"
312 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Do all tests once (-q onecheck).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -q onecheck"
313 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Debug mode (-d).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -d"
f9e10201
JD
314 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (edit).lnk" "$EDITOR" '"$INSTDIR\bin\smartd.conf"'
315 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (view).lnk" "$EDITOR" '"$INSTDIR\bin\smartd.conf"'
316 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.log (view).lnk" "$EDITOR" '"$INSTDIR\bin\smartd.log"'
317 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd_mailer.conf.sample.ps1 (view).lnk" "$EDITOR" '"$INSTDIR\bin\smartd_mailer.conf.sample.ps1"'
318 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd_mailer.conf.ps1 (create, edit).lnk" "$EDITOR" '"$INSTDIR\bin\smartd_mailer.conf.ps1"'
4d59bff9 319
ee38a438
GI
320 ; smartd service
321 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, eventlog, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install"
322 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 10min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0 -i 600"
323 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0"
324 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service remove.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd remove"
325 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service start.lnk" "$INSTDIR\bin\runcmdu.exe" "net start smartd"
326 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service stop.lnk" "$INSTDIR\bin\runcmdu.exe" "net stop smartd"
a86ec89e 327 ${EndIf}
4d59bff9
GG
328
329 ; Documentation
a86ec89e 330 ${If} ${FileExists} "$INSTDIR\doc\README.TXT"
4d59bff9
GG
331 SetOutPath "$INSTDIR\doc"
332 CreateDirectory "$SMPROGRAMS\smartmontools\Documentation"
333 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (html).lnk" "$INSTDIR\doc\smartctl.8.html"
334 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (html).lnk" "$INSTDIR\doc\smartd.8.html"
335 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (html).lnk" "$INSTDIR\doc\smartd.conf.5.html"
f9e10201
JD
336 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (pdf).lnk" "$INSTDIR\doc\smartctl.8.pdf"
337 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (pdf).lnk" "$INSTDIR\doc\smartd.8.pdf"
338 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (pdf).lnk" "$INSTDIR\doc\smartd.conf.5.pdf"
339 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf sample.lnk" "$EDITOR" '"$INSTDIR\doc\smartd.conf"'
a86ec89e 340 ${If} ${FileExists} "$INSTDIR\bin\drivedb.h"
f9e10201
JD
341 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb.h (view).lnk" "$EDITOR" '"$INSTDIR\bin\drivedb.h"'
342 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb-add.h (create, edit).lnk" "$EDITOR" '"$INSTDIR\bin\drivedb-add.h"'
a86ec89e 343 ${EndIf}
ee38a438 344 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\ChangeLog.lnk" "$INSTDIR\doc\ChangeLog.txt"
4d59bff9 345 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\COPYING.lnk" "$INSTDIR\doc\COPYING.txt"
4d59bff9 346 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\NEWS.lnk" "$INSTDIR\doc\NEWS.txt"
a86ec89e 347 ${EndIf}
4d59bff9
GG
348
349 ; Homepage
a86ec89e 350 CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Home Page.lnk" "https://www.smartmontools.org/"
f9e10201 351 CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Daily Builds.lnk" "https://builds.smartmontools.org/"
4d59bff9 352
cfbba5b9 353 ; drivedb.h update
a86ec89e 354 ${If} ${FileExists} "$INSTDIR\bin\update-smart-drivedb.exe"
d008864d
GI
355 SetOutPath "$INSTDIR\bin"
356 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\drivedb.h update.lnk" "$INSTDIR\bin\update-smart-drivedb.exe" ""
a86ec89e 357 ${EndIf}
cfbba5b9 358
4d59bff9 359 ; Uninstall
a86ec89e 360 ${If} ${FileExists} "$INSTDIR\uninst-smartmontools.exe"
d008864d
GI
361 SetOutPath "$INSTDIR"
362 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Uninstall smartmontools.lnk" "$INSTDIR\uninst-smartmontools.exe" ""
a86ec89e 363 ${EndIf}
4d59bff9
GG
364
365SectionEnd
366
a37e7145 367Section "Add install dir to PATH" PATH_SECTION
4d59bff9 368
a86ec89e 369 SectionIn ${FULL_TYPES}
4d59bff9 370
ee38a438
GI
371 Push "$INSTDIR\bin"
372 Call AddToPath
4d59bff9
GG
373
374SectionEnd
375
a37e7145
GG
376SectionGroup "Add smartctl to drive menu"
377
378!macro DriveMenuRemove
379 DetailPrint "Remove drive menu entries"
380 DeleteRegKey HKCR "Drive\shell\smartctl0"
381 DeleteRegKey HKCR "Drive\shell\smartctl1"
382 DeleteRegKey HKCR "Drive\shell\smartctl2"
383 DeleteRegKey HKCR "Drive\shell\smartctl3"
384 DeleteRegKey HKCR "Drive\shell\smartctl4"
385 DeleteRegKey HKCR "Drive\shell\smartctl5"
386!macroend
387
a7e8ffec 388 Section "Remove existing entries first" DRIVE_REMOVE_SECTION
a86ec89e 389 SectionIn ${DRIVEMENU_TYPE}
a37e7145
GG
390 !insertmacro DriveMenuRemove
391 SectionEnd
392
393!macro DriveSection id name args
394 Section 'smartctl ${args} ...' DRIVE_${id}_SECTION
a86ec89e 395 SectionIn ${DRIVEMENU_TYPE}
d008864d 396 Call CheckRunCmdA
a37e7145
GG
397 DetailPrint 'Add drive menu entry "${name}": smartctl ${args} ...'
398 WriteRegStr HKCR "Drive\shell\smartctl${id}" "" "${name}"
d008864d 399 WriteRegStr HKCR "Drive\shell\smartctl${id}\command" "" '"$INSTDIR\bin\runcmda.exe" "$INSTDIR\bin\smartctl.exe" ${args} %L'
a37e7145
GG
400 SectionEnd
401!macroend
402
ee38a438 403 !insertmacro DriveSection 0 "SMART all info" "-x"
a37e7145 404 !insertmacro DriveSection 1 "SMART status" "-Hc"
ee38a438 405 !insertmacro DriveSection 2 "SMART attributes" "-A -f brief"
a37e7145
GG
406 !insertmacro DriveSection 3 "SMART short selftest" "-t short"
407 !insertmacro DriveSection 4 "SMART long selftest" "-t long"
408 !insertmacro DriveSection 5 "SMART continue selective selftest" '-t "selective,cont"'
409
410SectionGroupEnd
411
4d59bff9
GG
412;--------------------------------------------------------------------
413
414Section "Uninstall"
415
a37e7145 416 ; Stop & remove service
a86ec89e 417 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
a37e7145 418 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
a86ec89e 419 ${If} $0 != ""
a37e7145 420 ExecWait "net stop smartd"
a86ec89e 421 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Remove smartd service ?" /SD IDNO IDYES 0 IDNO +2
a37e7145 422 ExecWait "$INSTDIR\bin\smartd.exe remove"
a86ec89e
GI
423 ${EndIf}
424 ${EndIf}
a37e7145 425
ff28b140 426 ; Remove installer registry key
4d59bff9 427 DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools"
4d59bff9 428
cfbba5b9 429 ; Remove conf file ?
a86ec89e 430 ${If} ${FileExists} "$INSTDIR\bin\smartd.conf"
4d59bff9
GG
431 ; Assume unchanged if timestamp is equal to sample file
432 GetFileTime "$INSTDIR\bin\smartd.conf" $0 $1
433 GetFileTime "$INSTDIR\doc\smartd.conf" $2 $3
434 StrCmp "$0:$1" "$2:$3" +2 0
a86ec89e 435 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO +2
4d59bff9 436 Delete "$INSTDIR\bin\smartd.conf"
a86ec89e 437 ${EndIf}
4d59bff9 438
cfbba5b9 439 ; Remove log file ?
a86ec89e 440 ${If} ${FileExists} "$INSTDIR\bin\smartd.log"
ee38a438 441 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete log file$\n$INSTDIR\bin\smartd.log ?" /SD IDNO IDYES 0 IDNO +2
4d59bff9 442 Delete "$INSTDIR\bin\smartd.log"
a86ec89e 443 ${EndIf}
4d59bff9 444
cfbba5b9 445 ; Remove drivedb-add file ?
a86ec89e 446 ${If} ${FileExists} "$INSTDIR\bin\drivedb-add.h"
ee38a438 447 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete local drive database file$\n$INSTDIR\bin\drivedb-add.h ?" /SD IDNO IDYES 0 IDNO +2
cfbba5b9 448 Delete "$INSTDIR\bin\drivedb-add.h"
a86ec89e 449 ${EndIf}
cfbba5b9 450
f9e10201
JD
451 ; Remove smartd_mailer.conf.ps1 file ?
452 ${If} ${FileExists} "$INSTDIR\bin\smartd_mailer.conf.ps1"
453 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete mailer configuration file$\n$INSTDIR\bin\smartd_mailer.conf.ps1 ?" /SD IDNO IDYES 0 IDNO +2
454 Delete "$INSTDIR\bin\smartd_mailer.conf.ps1"
455 ${EndIf}
456
4d59bff9
GG
457 ; Remove files
458 Delete "$INSTDIR\bin\smartctl.exe"
2127e193 459 Delete "$INSTDIR\bin\smartctl-nc.exe"
4d59bff9 460 Delete "$INSTDIR\bin\smartd.exe"
f9e10201
JD
461 Delete "$INSTDIR\bin\smartd_mailer.ps1"
462 Delete "$INSTDIR\bin\smartd_mailer.conf.sample.ps1"
ee38a438 463 Delete "$INSTDIR\bin\smartd_warning.cmd" ; TODO: Check for modifications?
cfbba5b9
GI
464 Delete "$INSTDIR\bin\drivedb.h"
465 Delete "$INSTDIR\bin\drivedb.h.error"
466 Delete "$INSTDIR\bin\drivedb.h.lastcheck"
467 Delete "$INSTDIR\bin\drivedb.h.old"
468 Delete "$INSTDIR\bin\update-smart-drivedb.exe"
d008864d 469 Delete "$INSTDIR\bin\runcmda.exe"
d008864d 470 Delete "$INSTDIR\bin\runcmdu.exe"
ee38a438 471 Delete "$INSTDIR\bin\wtssendmsg.exe"
4d59bff9 472 Delete "$INSTDIR\doc\AUTHORS.txt"
ee38a438
GI
473 Delete "$INSTDIR\doc\ChangeLog.txt"
474 Delete "$INSTDIR\doc\ChangeLog-5.0-6.0.txt"
4d59bff9
GG
475 Delete "$INSTDIR\doc\COPYING.txt"
476 Delete "$INSTDIR\doc\INSTALL.txt"
477 Delete "$INSTDIR\doc\NEWS.txt"
478 Delete "$INSTDIR\doc\README.txt"
479 Delete "$INSTDIR\doc\TODO.txt"
f4e463df 480 Delete "$INSTDIR\doc\checksums*.txt"
4d59bff9 481 Delete "$INSTDIR\doc\smartctl.8.html"
f9e10201
JD
482 Delete "$INSTDIR\doc\smartctl.8.pdf"
483 Delete "$INSTDIR\doc\smartctl.8.txt" ; TODO: Remove after smartmontools 6.6
4d59bff9 484 Delete "$INSTDIR\doc\smartd.8.html"
f9e10201
JD
485 Delete "$INSTDIR\doc\smartd.8.pdf"
486 Delete "$INSTDIR\doc\smartd.8.txt" ; TODO: Remove after smartmontools 6.6
4d59bff9
GG
487 Delete "$INSTDIR\doc\smartd.conf"
488 Delete "$INSTDIR\doc\smartd.conf.5.html"
f9e10201
JD
489 Delete "$INSTDIR\doc\smartd.conf.5.pdf"
490 Delete "$INSTDIR\doc\smartd.conf.5.txt" ; TODO: Remove after smartmontools 6.6
4d59bff9
GG
491 Delete "$INSTDIR\uninst-smartmontools.exe"
492
493 ; Remove shortcuts
a7e8ffec 494 SetShellVarContext all
4d59bff9
GG
495 Delete "$SMPROGRAMS\smartmontools\*.*"
496 Delete "$SMPROGRAMS\smartmontools\Documentation\*.*"
497 Delete "$SMPROGRAMS\smartmontools\smartctl Examples\*.*"
498 Delete "$SMPROGRAMS\smartmontools\smartd Examples\*.*"
499
500 ; Remove folders
501 RMDir "$SMPROGRAMS\smartmontools\Documentation"
a37e7145
GG
502 RMDir "$SMPROGRAMS\smartmontools\smartctl Examples"
503 RMDir "$SMPROGRAMS\smartmontools\smartd Examples"
4d59bff9
GG
504 RMDir "$SMPROGRAMS\smartmontools"
505 RMDir "$INSTDIR\bin"
506 RMDir "$INSTDIR\doc"
507 RMDir "$INSTDIR"
508
509 ; Remove install dir from PATH
ee38a438
GI
510 Push "$INSTDIR\bin"
511 Call un.RemoveFromPath
4d59bff9 512
a37e7145
GG
513 ; Remove drive menu registry entries
514 !insertmacro DriveMenuRemove
515
516 ; Check for still existing entries
a86ec89e 517 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
ee38a438 518 MessageBox MB_OK|MB_ICONEXCLAMATION "$INSTDIR\bin\smartd.exe could not be removed.$\nsmartd is possibly still running." /SD IDOK
a86ec89e 519 ${ElseIf} ${FileExists} "$INSTDIR"
ee38a438 520 MessageBox MB_OK "Note: $INSTDIR could not be removed." /SD IDOK
a86ec89e 521 ${EndIf}
4d59bff9 522
a86ec89e 523 ${If} ${FileExists} "$SMPROGRAMS\smartmontools"
ee38a438 524 MessageBox MB_OK "Note: $SMPROGRAMS\smartmontools could not be removed." /SD IDOK
a86ec89e 525 ${EndIf}
a37e7145 526
4d59bff9
GG
527SectionEnd
528
529;--------------------------------------------------------------------
a37e7145 530; Functions
4d59bff9 531
f4e463df
GI
532!macro AdjustSectionSize section
533 SectionGetSize ${section} $0
534 IntOp $0 $0 / 2
535 SectionSetSize ${section} $0
536!macroend
537
4d59bff9
GG
538Function .onInit
539
f4e463df 540 ; Set default install directories
a86ec89e
GI
541 ${If} $INSTDIR == "" ; /D=PATH option not specified ?
542 ReadRegStr $INSTDIR HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
543 ${If} $INSTDIR == "" ; Not already installed ?
ff28b140 544 StrCpy $INSTDIR "$PROGRAMFILES\smartmontools"
f4e463df 545!ifdef INPDIR64
ff28b140
TL
546 StrCpy $INSTDIR32 $INSTDIR
547 StrCpy $INSTDIR64 "$PROGRAMFILES64\smartmontools"
f4e463df 548!endif
a86ec89e
GI
549 ${EndIf}
550 ${EndIf}
f4e463df
GI
551
552!ifdef INPDIR64
a86ec89e
GI
553 ; Check for 64-bit unless already installed in 32-bit location
554 ${If} $INSTDIR64 != ""
555 ${OrIf} $INSTDIR != "$PROGRAMFILES\smartmontools"
556 ; $1 = IsWow64Process(GetCurrentProcess(), ($0=FALSE, &$0))
557 System::Call "kernel32::GetCurrentProcess() i.s"
558 System::Call "kernel32::IsWow64Process(i s, *i 0 r0) i.r1"
559 ${If} "$0 $1" == "1 1" ; 64-bit Windows ?
560 !insertmacro SelectSection ${X64_SECTION}
561 ${EndIf}
562 ${EndIf}
563
f4e463df
GI
564 ; Sizes of binary sections include 32-bit and 64-bit executables
565 !insertmacro AdjustSectionSize ${SMARTCTL_SECTION}
566 !insertmacro AdjustSectionSize ${SMARTD_SECTION}
567 !insertmacro AdjustSectionSize ${SMARTCTL_NC_SECTION}
568!endif
569
ff28b140 570 ; Use 32-bit or 64-bit Notepad++ if installed
d008864d 571 StrCpy $EDITOR "$PROGRAMFILES\Notepad++\notepad++.exe"
a86ec89e 572 ${IfNot} ${FileExists} "$EDITOR"
ff28b140
TL
573 StrCpy $EDITOR "$PROGRAMFILES64\Notepad++\notepad++.exe"
574 ${IfNot} ${FileExists} "$EDITOR"
575 StrCpy $EDITOR "notepad.exe"
576 ${EndIf}
a86ec89e 577 ${EndIf}
d008864d 578
a7e8ffec 579 Call ParseCmdLine
a86ec89e
GI
580
581!ifdef INPDIR64
582 Call CheckX64
583!endif
a7e8ffec
GI
584FunctionEnd
585
f4e463df
GI
586; Check x64 section and update INSTDIR accordingly
587
588!ifdef INPDIR64
589Function CheckX64
a86ec89e 590 ${IfNot} ${SectionIsSelected} ${X64_SECTION}
f4e463df 591 StrCpy $X64 ""
a86ec89e
GI
592 ${If} $INSTDIR32 != ""
593 ${AndIf} $INSTDIR == $INSTDIR64
f4e463df 594 StrCpy $INSTDIR $INSTDIR32
a86ec89e
GI
595 ${EndIf}
596 ${Else}
f4e463df 597 StrCpy $X64 "t"
a86ec89e
GI
598 ${If} $INSTDIR64 != ""
599 ${AndIf} $INSTDIR == $INSTDIR32
f4e463df 600 StrCpy $INSTDIR $INSTDIR64
a86ec89e
GI
601 ${EndIf}
602 ${EndIf}
f4e463df
GI
603FunctionEnd
604!endif
605
a7e8ffec 606; Command line parsing
a86ec89e
GI
607
608!macro GetCmdLineOption var name
a7e8ffec
GI
609 Push ",$opts,"
610 Push ",${name},"
611 Call StrStr
a86ec89e
GI
612 Pop ${var}
613 ${If} ${var} != ""
614 StrCpy $nomatch ""
615 ${EndIf}
616!macroend
617
618!macro CheckCmdLineOption name section
619 StrCpy $allopts "$allopts,${name}"
620 !insertmacro GetCmdLineOption $0 ${name}
621 ${If} $0 == ""
622 !insertmacro UnselectSection ${section}
623 ${Else}
624 !insertmacro SelectSection ${section}
625 ${EndIf}
a7e8ffec
GI
626!macroend
627
628Function ParseCmdLine
629 ; get /SO option
630 Var /global opts
631 ${GetParameters} $R0
632 ${GetOptions} $R0 "/SO" $opts
a86ec89e 633 ${If} ${Errors}
a7e8ffec 634 Return
a86ec89e 635 ${EndIf}
a7e8ffec 636 Var /global allopts
a7e8ffec
GI
637 Var /global nomatch
638 StrCpy $nomatch "t"
f4e463df 639!ifdef INPDIR64
a86ec89e
GI
640 ; Change previous 64-bit setting
641 StrCpy $allopts ",x32|x64"
642 !insertmacro GetCmdLineOption $0 "x32"
643 ${If} $0 != ""
644 !insertmacro UnselectSection ${X64_SECTION}
645 ${EndIf}
646 !insertmacro GetCmdLineOption $0 "x64"
647 ${If} $0 != ""
648 !insertmacro SelectSection ${X64_SECTION}
649 ${EndIf}
650 ; Leave other sections unchanged if only "x32" or "x64" is specified
651 ${If} $opts == "x32"
652 ${OrIf} $opts == "x64"
653 Return
654 ${EndIf}
f4e463df 655!endif
a86ec89e 656 ; Turn sections on or off
a7e8ffec
GI
657 !insertmacro CheckCmdLineOption "smartctl" ${SMARTCTL_SECTION}
658 !insertmacro CheckCmdLineOption "smartd" ${SMARTD_SECTION}
659 !insertmacro CheckCmdLineOption "smartctlnc" ${SMARTCTL_NC_SECTION}
660 !insertmacro CheckCmdLineOption "drivedb" ${DRIVEDB_SECTION}
661 !insertmacro CheckCmdLineOption "doc" ${DOC_SECTION}
662 !insertmacro CheckCmdLineOption "uninst" ${UNINST_SECTION}
663 !insertmacro CheckCmdLineOption "menu" ${MENU_SECTION}
664 !insertmacro CheckCmdLineOption "path" ${PATH_SECTION}
665 !insertmacro CheckCmdLineOption "driveremove" ${DRIVE_REMOVE_SECTION}
666 !insertmacro CheckCmdLineOption "drive0" ${DRIVE_0_SECTION}
667 !insertmacro CheckCmdLineOption "drive1" ${DRIVE_1_SECTION}
668 !insertmacro CheckCmdLineOption "drive2" ${DRIVE_2_SECTION}
669 !insertmacro CheckCmdLineOption "drive3" ${DRIVE_3_SECTION}
670 !insertmacro CheckCmdLineOption "drive4" ${DRIVE_4_SECTION}
671 !insertmacro CheckCmdLineOption "drive5" ${DRIVE_5_SECTION}
a86ec89e
GI
672 ${If} $opts != "-"
673 ${If} $nomatch != ""
674 StrCpy $0 "$allopts,-" "" 1
675 MessageBox MB_OK "Usage: smartmontools-VERSION.win32-setup [/S] [/SO component,...] [/D=INSTDIR]$\n$\ncomponents:$\n $0"
676 Abort
677 ${EndIf}
678 ${EndIf}
4d59bff9
GG
679FunctionEnd
680
a86ec89e 681; Install runcmda.exe only once
cfbba5b9 682
d008864d 683Function CheckRunCmdA
a86ec89e
GI
684 Var /global runcmda
685 ${If} $runcmda == ""
686 StrCpy $runcmda "t"
cfbba5b9 687 SetOutPath "$INSTDIR\bin"
f4e463df 688 !insertmacro FileExe "bin\runcmda.exe" ""
a86ec89e 689 ${EndIf}
cfbba5b9
GI
690FunctionEnd
691
4d59bff9
GG
692
693;--------------------------------------------------------------------
a37e7145 694; Path functions
4d59bff9
GG
695;
696; Based on example from:
697; http://nsis.sourceforge.net/Path_Manipulation
698;
699
700
701!include "WinMessages.nsh"
702
703; Registry Entry for environment (NT4,2000,XP)
704; All users:
705;!define Environ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
706; Current user only:
707!define Environ 'HKCU "Environment"'
708
709
710; AddToPath - Appends dir to PATH
711; (does not work on Win9x/ME)
712;
713; Usage:
714; Push "dir"
715; Call AddToPath
716
717Function AddToPath
718 Exch $0
719 Push $1
720 Push $2
721 Push $3
a86ec89e 722 Push $4
a37e7145 723
a86ec89e
GI
724 ; NSIS ReadRegStr returns empty string on string overflow
725 ; Native calls are used here to check actual length of PATH
726
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))
731 ; RegCloseKey($3)
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)"
734
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
738 Goto done
739 ${EndIf}
740
741 ${If} $4 <> 0 ; NO_ERROR
742 ${If} $4 <> 2 ; ERROR_FILE_NOT_FOUND
743 DetailPrint "AddToPath: unexpected error code $4"
744 Goto done
745 ${EndIf}
746 StrCpy $1 ""
747 ${EndIf}
748
749 ; Check if already in PATH
4d59bff9
GG
750 Push "$1;"
751 Push "$0;"
752 Call StrStr
753 Pop $2
a37e7145 754 StrCmp $2 "" 0 done
4d59bff9
GG
755 Push "$1;"
756 Push "$0\;"
757 Call StrStr
758 Pop $2
a37e7145
GG
759 StrCmp $2 "" 0 done
760
a86ec89e
GI
761 ; Prevent NSIS string overflow
762 StrLen $2 $0
763 StrLen $3 $1
764 IntOp $2 $2 + $3
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
769 Goto done
770 ${EndIf}
771
772 ; Append dir to PATH
4d59bff9
GG
773 DetailPrint "Add to PATH: $0"
774 StrCpy $2 $1 1 -1
a86ec89e 775 ${If} $2 == ";"
4d59bff9 776 StrCpy $1 $1 -1 ; remove trailing ';'
a86ec89e
GI
777 ${EndIf}
778 ${If} $1 != "" ; no leading ';'
4d59bff9 779 StrCpy $0 "$1;$0"
a86ec89e 780 ${EndIf}
4d59bff9
GG
781 WriteRegExpandStr ${Environ} "PATH" $0
782 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
a37e7145 783
4d59bff9 784done:
a86ec89e 785 Pop $4
4d59bff9
GG
786 Pop $3
787 Pop $2
788 Pop $1
789 Pop $0
790FunctionEnd
791
792
793; RemoveFromPath - Removes dir from PATH
794;
795; Usage:
796; Push "dir"
797; Call RemoveFromPath
a37e7145 798
4d59bff9
GG
799Function un.RemoveFromPath
800 Exch $0
801 Push $1
802 Push $2
803 Push $3
804 Push $4
805 Push $5
806 Push $6
a37e7145 807
4d59bff9
GG
808 ReadRegStr $1 ${Environ} "PATH"
809 StrCpy $5 $1 1 -1
a86ec89e 810 ${If} $5 != ";"
4d59bff9 811 StrCpy $1 "$1;" ; ensure trailing ';'
a86ec89e 812 ${EndIf}
4d59bff9
GG
813 Push $1
814 Push "$0;"
815 Call un.StrStr
816 Pop $2 ; pos of our dir
817 StrCmp $2 "" done
818
819 DetailPrint "Remove from PATH: $0"
820 StrLen $3 "$0;"
821 StrLen $4 $2
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
824 StrCpy $3 "$5$6"
825 StrCpy $5 $3 1 -1
a86ec89e 826 ${If} $5 == ";"
4d59bff9 827 StrCpy $3 $3 -1 ; remove trailing ';'
a86ec89e 828 ${EndIf}
4d59bff9
GG
829 WriteRegExpandStr ${Environ} "PATH" $3
830 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
831
832done:
833 Pop $6
834 Pop $5
835 Pop $4
836 Pop $3
837 Pop $2
838 Pop $1
839 Pop $0
840FunctionEnd
841
842
843; StrStr - find substring in a string
844;
845; Usage:
846; Push "this is some string"
847; Push "some"
848; Call StrStr
849; Pop $0 ; "some string"
a37e7145 850
4d59bff9
GG
851!macro StrStr un
852Function ${un}StrStr
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,...]
856 Push $R3
857 Push $R4
858 Push $R5
859 StrLen $R3 $R1
860 StrCpy $R4 0
861 ; $R1=substring, $R2=string, $R3=strlen(substring)
862 ; $R4=count, $R5=tmp
a86ec89e 863 ${Do}
4d59bff9 864 StrCpy $R5 $R2 $R3 $R4
a86ec89e
GI
865 ${IfThen} $R5 == $R1 ${|} ${ExitDo} ${|}
866 ${IfThen} $R5 == "" ${|} ${ExitDo} ${|}
4d59bff9 867 IntOp $R4 $R4 + 1
a86ec89e 868 ${Loop}
4d59bff9
GG
869 StrCpy $R1 $R2 "" $R4
870 Pop $R5
871 Pop $R4
872 Pop $R3
873 Pop $R2
874 Exch $R1 ; $R1=old$R1, stack=[result,...]
875FunctionEnd
876!macroend
877!insertmacro StrStr ""
878!insertmacro StrStr "un."
d008864d
GI
879
880
881;--------------------------------------------------------------------
882; Set Run As Administrator flag in shortcut
883;
884; Slightly modified version from:
885; http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
886;
887
d008864d
GI
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}
893!ifdef NSIS_UNICODE
894 !define IID_IShellLink ${IID_IShellLinkW}
895!else
896 !define IID_IShellLink ${IID_IShellLinkA}
897!endif
898
899Function ShellLinkSetRunAs
f4e463df
GI
900 ; Set archive location of $PLUGINSDIR
901 Goto +2
902 SetOutPath "$INSTDIR"
903
d008864d
GI
904 System::Store S ; push $0-$9, $R0-$R9
905 pop $9
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"
908 ${If} $0 = 0
909 System::Call "$1->0(g'${IPersistFile}',*i.r2)i.r0" ; $0 = $1->QueryInterface(IPersistFile, &$2)
910 ${If} $0 = 0
911 System::Call "$2->5(w '$9',i 0)i.r0" ; $0 = $2->Load($9, STGM_READ)
912 ${If} $0 = 0
913 System::Call "$1->0(g'${IShellLinkDataList}',*i.r3)i.r0" ; $0 = $1->QueryInterface(IShellLinkDataList, &$3)
914 ${If} $0 = 0
915 System::Call "$3->6(*i.r4)i.r0"; $0 = $3->GetFlags(&$4)
916 ${If} $0 = 0
917 System::Call "$3->7(i $4|0x2000)i.r0" ; $0 = $3->SetFlags($4|SLDF_RUNAS_USER)
918 ${If} $0 = 0
919 System::Call "$2->6(w '$9',i1)i.r0" ; $2->Save($9, TRUE)
920 ${EndIf}
921 ${EndIf}
922 System::Call "$3->2()" ; $3->Release()
923 ${EndIf}
924 System::Call "$2->2()" ; $2->Release()
925 ${EndIf}
926 ${EndIf}
927 System::Call "$1->2()" ; $1->Release()
928 ${EndIf}
929 ${If} $0 <> 0
930 DetailPrint "Set RunAsAdmin: $9 failed ($0)"
931 ${Else}
932 DetailPrint "Set RunAsAdmin: $9"
933 ${EndIf}
a86ec89e 934 System::Store L ; pop $R9-$R0, $9-$0
d008864d 935FunctionEnd