; NSIS PROCESS INFO LIBRARY - GetProcessInfo.nsh; Version 1.1 - Mar 28th, 2011;; Description:; Gets process information.;; Usage example:; ${GetProcessInfo} 0 $0 $1 $2 $3 $4; DetailPrint "pid=$0 parent_pid=$1 priority=$2 process_name=$3 exe=$4";; History:; 1.1 - 28/03/2011 - Added uninstall function, include guards, file header. Fixed getting full exe path on pre vista systems. (Sergius);!ifndef GETPROCESSINFO_INCLUDED!define GETPROCESSINFO_INCLUDED!define PROCESSINFO.TH32CS_SNAPPROCESS 2!define PROCESSINFO.INVALID_HANDLE_VALUE -1!define GetProcessInfo '!insertmacro GetProcessInfo';@in pid_in - if 0 - get current process info;@out pid_out - real process id (may be useful, if pid_in=0);@out ppid - parent process id;@out priority;@out name - name of process;@out fullname - fully-qualified path of process!macro GetProcessInfo pid_in pid_out ppid priority name fullnamePush ${pid_in}!ifdef BUILD_UNINSTALLERCall un._GetProcessInfo!elseCall _GetProcessInfo!endif;name;pri;ppid;fname;pid;Pop ${name}Pop ${priority}Pop ${ppid}Pop ${fullname}Pop ${pid_out}!macroend!macro FUNC_GETPROCESSINFOExch $R3 ;pidPush $0Push $1Push $2Push $3Push $4Push $5Push $R0 ;hSnapshotPush $R1 ;resultPush $R9 ;PROCESSENTRY32;MODULEENTRY32 and so onPush $R8;zero registers to waste trash, if error occurredStrCpy $0 ""StrCpy $1 ""StrCpy $2 ""StrCpy $3 ""StrCpy $4 ""StrCpy $5 ""IntCmp $R3 0 0 skip_pid_detection skip_pid_detectionSystem::Call 'kernel32::GetCurrentProcess() i.R0'System::Call "Kernel32::GetProcessId(i R0) i.R3"skip_pid_detection:System::Call 'Kernel32::CreateToolhelp32Snapshot(i ${PROCESSINFO.TH32CS_SNAPPROCESS},i R3) i.R0'IntCmp $R0 ${PROCESSINFO.INVALID_HANDLE_VALUE} end ;someting wrong;$R9=PROCESSENTRY32;typedef struct tagPROCESSENTRY32 {; DWORD dwSize;; DWORD cntUsage;; DWORD th32ProcessID;; ULONG_PTR th32DefaultHeapID;; DWORD th32ModuleID;; DWORD cntThreads;; DWORD th32ParentProcessID;; LONG pcPriClassBase;; DWORD dwFlags;; TCHAR szExeFile[MAX_PATH];;}PROCESSENTRY32, *PPROCESSENTRY32;;dwSize=4*9+2*260System::Alloc 1024pop $R9System::Call "*$R9(i 556)"System::Call 'Kernel32::Process32FirstW(i R0, i $R9) i.R1'StrCmp $R1 0 endnnext_iteration:System::Call "*$R9(i,i,i.R1)" ;get PIDIntCmp $R1 $R3 exitloopSystem::Call 'Kernel32::Process32NextW(i R0, i $R9) i.R1'IntCmp $R1 0 0 nnext_iteration nnext_iterationexitloop:;$0 - pid;$1 - threads;$2 - ppid;$3 - priority;$4 - process nameSystem::Call "*$R9(i,i,i.r0,i,i,i.r1,i.r2,i.r3,i,&w256.r4)" ; Get next module;free:System::Free $R9System::Call "Kernel32::CloseToolhelp32Snapshot(i R0)";===============;now get full path and commandlineSystem::Call "Kernel32::OpenProcess(i 1040, i 0, i r0)i .R0"StrCmp $R0 0 endIntOp $R8 0 + 256System::Call "psapi::GetModuleFileNameExW(i R0,i 0,t .r5, *i $R8)i .R1"end:Pop $R8Pop $R9Pop $R1Pop $R0Exch $5Exch 1Exch $4Exch 2Exch $3Exch 3Exch $2Exch 4Pop $1Exch 4Exch $0Exch 5Pop $R3!macroend ;FUNC_GETPROCESSINFO!ifndef BUILD_UNINSTALLERFunction _GetProcessInfo!insertmacro FUNC_GETPROCESSINFOFunctionEnd!endif!ifdef BUILD_UNINSTALLERFunction un._GetProcessInfo!insertmacro FUNC_GETPROCESSINFOFunctionEnd!endif!endif ;GETPROCESSINFO_INCLUDED