Warning, /graphics/digikam/project/bundles/vcpkg/installer/process_running.nsh is written in an unsupported language. File is not indexed.

0001 ;; ============================================================
0002  ;
0003  ; This file is a part of digiKam project
0004  ; https://www.digikam.org
0005  ;
0006  ; Date        : 2005-01-01
0007  ; Description : Functions to check if executable is running.
0008  ;               Note: NSIS >= 3 is required to be compatible with Windows 10.
0009  ;
0010  ; SPDX-FileCopyrightText: 2005-2017 by Tim Kosse <tim dot kosse at filezilla-project dot org>
0011  ; SPDX-FileCopyrightText: 2017-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0012  ;
0013  ; SPDX-License-Identifier: GPL-2.0-or-later
0014  ;
0015  ; ============================================================ ;;
0016 
0017 !ifndef EXECUTABLE_RUNNING_INCLUDED
0018 !define EXECUTABLE_RUNNING_INCLUDED
0019 
0020 !include "LogicLib.nsh"
0021 
0022 ; Returns number of processes * 4 on top of stack,
0023 ; array with all processes right below it.
0024 ; Array should be cleared using System::Free
0025 
0026 !macro ENUMPROCESSES un
0027 
0028     Function ${un}EnumProcesses
0029 
0030         ; Is this really necesssary for $Rx?
0031         Push $R1
0032         Push $R0
0033         Push $R2
0034         Push $R3
0035 
0036         ; Double size of array each time EnumProcesses fills it completely so that
0037         ; we do get all processes
0038 
0039         StrCpy $R1 1024
0040 
0041         enum_processes_loop:
0042 
0043         System::Alloc $R1
0044 
0045         Pop $R0
0046 
0047         System::Call "psapi::EnumProcesses(i R0, i R1, *i .R2) i .R3"
0048 
0049         ${If} $R3 == 0
0050             ; EnumProcesses failed, how can that be? :P
0051             goto enum_processes_fail
0052         ${EndIf}
0053 
0054         ${If} $R1 == $R2
0055 
0056             ; Too small buffer. Retry with twice the size
0057 
0058             Intop $R1 $R1 * 2
0059             System::Free $R0
0060 
0061             goto enum_processes_loop
0062 
0063         ${EndIf}
0064 
0065         StrCpy $R1 $R2
0066 
0067         ; Restore registers
0068         ; and put results on stack
0069         Pop $R3
0070         Pop $R2
0071         Exch $R0
0072         Exch
0073         Exch $R1
0074         return
0075 
0076         enum_processes_fail:
0077 
0078         Pop $R3
0079         Pop $R2
0080         Pop $R0
0081         Pop $R1
0082 
0083         Push 0
0084         Push 0
0085 
0086     FunctionEnd
0087 
0088 !macroend
0089 
0090 ; Insert function as an installer and uninstaller function.
0091 !insertmacro ENUMPROCESSES ""
0092 !insertmacro ENUMPROCESSES "un."
0093 
0094 ;-------------------------------------------
0095 
0096 ; Expects process ID on top of stack, returns
0097 ; filename (in device syntax) on top of stack
0098 
0099 !macro GETFILENAMEFROMPROCESSID un
0100 
0101     Function ${un}GetFilenameFromProcessId
0102 
0103         Exch $R0
0104         Push $R1
0105         Push $R2
0106         Push $R3
0107 
0108         !define ${un}PROCESS_QUERY_INFORMATION 0x0400
0109         System::Call "kernel32::OpenProcess(i ${${un}PROCESS_QUERY_INFORMATION}, i 0, i $R0) i .R0"
0110 
0111         ${If} $R0 == 0
0112 
0113             Pop $R3
0114             Pop $R2
0115             Pop $R1
0116             Pop $R0
0117             Push ''
0118             return
0119 
0120         ${EndIf}
0121 
0122         StrCpy $R3 ${NSIS_MAX_STRLEN}
0123         System::Call "kernel32::QueryFullProcessImageName(i R0, i 0, t .R1, *i R3) i .R2"
0124 
0125         ${If} $R2 == 0
0126             ; Fallback
0127             System::Call "psapi::GetProcessImageFileName(i R0, t .R1, i ${NSIS_MAX_STRLEN}) i .R2"
0128         ${EndIf}
0129 
0130         ${If} $R2 == 0
0131 
0132             System::Call "kernel32::CloseHandle(i R0)"
0133             Pop $R3
0134             Pop $R2
0135             Pop $R1
0136             Pop $R0
0137             Push ''
0138 
0139             return
0140 
0141         ${EndIf}
0142 
0143         System::Call "kernel32::CloseHandle(i R0)"
0144 
0145         Pop $R3
0146         Pop $R2
0147         StrCpy $R0 $R1
0148         Pop $R1
0149         Exch $R0
0150 
0151     FunctionEnd
0152 
0153 !macroend
0154 
0155 ; Insert function as an installer and uninstaller function.
0156 !insertmacro GETFILENAMEFROMPROCESSID ""
0157 !insertmacro GETFILENAMEFROMPROCESSID "un."
0158 
0159 ;-------------------------------------------
0160 
0161 ; Expects process name on top of stack. Afterwards, top of stack contains path
0162 ; to the process if it's running or an empty string if it is not.
0163 
0164 !macro ISPROCESSRUNNING un
0165 
0166     Function ${un}IsProcessRunning
0167 
0168         Exch $R0 ; Name
0169 
0170         Push $R1 ; Bytes
0171         Push $R2 ; Array
0172         Push $R3 ; Counter
0173         Push $R4 ; Strlen
0174         Push $R5 ; Current process ID and image filename
0175         Push $R6 ; Last part of path
0176 
0177         StrCpy $R0 "\$R0"
0178 
0179         StrLen $R4 $R0
0180         IntOp $R4 0 - $R4
0181 
0182         Call ${un}EnumProcesses
0183 
0184         Pop $R1
0185         Pop $R2
0186 
0187         StrCpy $R3 0
0188 
0189         ${While} $R3 < $R1
0190 
0191             IntOp $R5 $R2 + $R3
0192 
0193             System::Call "*$R5(i .R5)"
0194             Push $R5
0195 
0196             Call ${un}GetFilenameFromProcessId
0197 
0198             Pop $R5
0199 
0200             ; Get last part of filename
0201             StrCpy $R6 $R5 '' $R4
0202 
0203             ${If} $R6 == $R0
0204 
0205             ; Program is running
0206             StrCpy $R0 $R5
0207             Pop $R6
0208             Pop $R5
0209             Pop $R4
0210             Pop $R3
0211             Pop $R2
0212             Pop $R1
0213             Exch $R0
0214             return
0215 
0216             ${EndIf}
0217 
0218             IntOp $R3 $R3 + 4
0219 
0220         ${EndWhile}
0221 
0222         Pop $R5
0223         Pop $R4
0224         Pop $R3
0225         Pop $R2
0226         Pop $R1
0227         Pop $R0
0228         Push ''
0229 
0230     FunctionEnd
0231 
0232 !macroend
0233 
0234 ; Insert function as an installer and uninstaller function.
0235 !insertmacro ISPROCESSRUNNING ""
0236 !insertmacro ISPROCESSRUNNING "un."
0237 
0238 ;-------------------------------------------
0239 
0240 !macro CHECKDIGIKAM un
0241 
0242     Function ${un}CheckDigikamRunning
0243 
0244         Push "digikam.exe"
0245         Call ${un}IsProcessRunning
0246         Pop $R1
0247 
0248         ${While} $R1 != ''
0249 
0250             MessageBox MB_ABORTRETRYIGNORE|MB_DEFBUTTON2 "digiKam appears to be running.$\nPlease close all running instances of digiKam before continuing the installation." /SD IDIGNORE IDABORT CheckDigikamRunning_abort IDIGNORE CheckDigikamRunning_ignore
0251 
0252             Push "digikam.exe"
0253             Call ${un}IsProcessRunning
0254             Pop $R1
0255 
0256         ${EndWhile}
0257 
0258         CheckDigikamRunning_ignore:
0259         Return
0260 
0261         CheckDigikamRunning_abort:
0262         Quit
0263 
0264     FunctionEnd
0265 
0266 !macroend
0267 
0268 ; Insert function as an installer and uninstaller function.
0269 !insertmacro CHECKDIGIKAM ""
0270 !insertmacro CHECKDIGIKAM "un."
0271 
0272 ;-------------------------------------------
0273 
0274 !macro CHECKSHOWFOTO un
0275 
0276     Function ${un}CheckShowfotoRunning
0277 
0278         Push "showfoto.exe"
0279         Call ${un}IsProcessRunning
0280         Pop $R1
0281 
0282         ${While} $R1 != ''
0283 
0284             MessageBox MB_ABORTRETRYIGNORE|MB_DEFBUTTON2 "Showfoto appears to be running.$\nPlease close all running instances of Showfoto before continuing the installation." /SD IDIGNORE IDABORT CheckShowfotoRunning_abort IDIGNORE CheckShowfotoRunning_ignore
0285 
0286             Push "showfoto.exe"
0287             Call ${un}IsProcessRunning
0288             Pop $R1
0289 
0290         ${EndWhile}
0291 
0292         CheckShowfotoRunning_ignore:
0293         Return
0294 
0295         CheckShowfotoRunning_abort:
0296         Quit
0297 
0298     FunctionEnd
0299 
0300 !macroend
0301 
0302 ; Insert function as an installer and uninstaller function.
0303 !insertmacro CHECKSHOWFOTO ""
0304 !insertmacro CHECKSHOWFOTO "un."
0305 
0306 ;-------------------------------------------
0307 
0308 !endif ;EXECUTABLE_RUNNING_INCLUDED