Merge pull request #9966 from f321x/improve_windows_installer_safety
block windows installer if Electrum is still running
This commit is contained in:
@@ -87,6 +87,55 @@
|
|||||||
|
|
||||||
!insertmacro MUI_LANGUAGE "English"
|
!insertmacro MUI_LANGUAGE "English"
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
;Functions
|
||||||
|
|
||||||
|
!macro CreateEnsureNotRunning prefix operation
|
||||||
|
|
||||||
|
Function ${prefix}EnsureNotRunning
|
||||||
|
; pop the directory to check from the stack into $R0
|
||||||
|
Pop $R0
|
||||||
|
; if the dir at $R0 doesn't exist, jump to nodir
|
||||||
|
IfFileExists "$R0" 0 nodir
|
||||||
|
; Find all .exe files in the directory, $1 is the handle, $2 is the filename
|
||||||
|
FindFirst $1 $2 "$R0\*.exe"
|
||||||
|
IfErrors noexe 0
|
||||||
|
|
||||||
|
checkloop:
|
||||||
|
; Skip checking the uninstaller if we are the uninstaller to avoid locking the uninstaller itself
|
||||||
|
!if "${prefix}" == "un."
|
||||||
|
StrCmp $2 "Uninstall.exe" skipfile 0
|
||||||
|
!endif
|
||||||
|
|
||||||
|
; Check if we can append to the .exe file. If we can't that means it is still running.
|
||||||
|
retryopen:
|
||||||
|
FileOpen $0 "$R0\$2" a
|
||||||
|
IfErrors 0 closeexe
|
||||||
|
MessageBox MB_RETRYCANCEL "Can not ${operation} because $2 is still running. Close it and retry." /SD IDCANCEL IDRETRY retryopen
|
||||||
|
FindClose $1
|
||||||
|
Abort
|
||||||
|
closeexe:
|
||||||
|
FileClose $0
|
||||||
|
|
||||||
|
skipfile:
|
||||||
|
; Find next .exe file
|
||||||
|
FindNext $1 $2
|
||||||
|
IfErrors done 0
|
||||||
|
Goto checkloop
|
||||||
|
|
||||||
|
done:
|
||||||
|
FindClose $1
|
||||||
|
|
||||||
|
noexe:
|
||||||
|
nodir:
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
!macroend
|
||||||
|
|
||||||
|
; The function has to be created twice, once for the installer and once for the uninstaller
|
||||||
|
!insertmacro CreateEnsureNotRunning "" "install"
|
||||||
|
!insertmacro CreateEnsureNotRunning "un." "uninstall"
|
||||||
|
|
||||||
;--------------------------------
|
;--------------------------------
|
||||||
;Installer Sections
|
;Installer Sections
|
||||||
|
|
||||||
@@ -99,6 +148,14 @@ Function .onInit
|
|||||||
SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
|
SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
|
||||||
Quit
|
Quit
|
||||||
${EndIf}
|
${EndIf}
|
||||||
|
|
||||||
|
; Check if already installed and ensure the process is not running if it is
|
||||||
|
ReadRegStr $R0 HKCU "Software\${PRODUCT_NAME}" ""
|
||||||
|
IfErrors noinstdir 0
|
||||||
|
Push $R0
|
||||||
|
Call EnsureNotRunning
|
||||||
|
noinstdir:
|
||||||
|
ClearErrors
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
Section
|
Section
|
||||||
@@ -175,3 +232,9 @@ Section "Uninstall"
|
|||||||
DeleteRegKey HKCU "Software\${PRODUCT_NAME}"
|
DeleteRegKey HKCU "Software\${PRODUCT_NAME}"
|
||||||
DeleteRegKey HKCU "${PRODUCT_UNINST_KEY}"
|
DeleteRegKey HKCU "${PRODUCT_UNINST_KEY}"
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
|
Function UN.onInit
|
||||||
|
; Ensure the process is not running in the uninstallation directory
|
||||||
|
Push $INSTDIR
|
||||||
|
Call un.EnsureNotRunning
|
||||||
|
FunctionEnd
|
||||||
|
|||||||
Reference in New Issue
Block a user