Get a list of running processes

From NSIS Wiki
Jump to navigationJump to search
Author: phoenix1701@gmail.com (talk, contrib)


Description

This example uses the Win32 API and PSAPI.DLL to get a list of all running processes on the system.

Caveats

Since this uses PSAPI, it will not work on Win9x (PSAPI is only available on Windows NT, 2000, XP, Vista, etc). Some processes cannot be interrogated for their information for whatever reason; this script silently ignores these errors and keeps going.

The Script

OutFile PsapiTest.exe
 
Function .onInit
    System::Alloc 1024
    Pop $R9
    System::Call "Psapi::EnumProcesses(i R9, i 1024, *i .R1)i .R8"
    StrCmp $R8 0 HandleError
 
    IntOp $R2 $R1 / 4 ; Divide by sizeof(DWORD) to get number of processes
 
    StrCpy $R4 0 ; R4 is our counter variable
iterate:
    System::Call "*$R9(i .R5)" ; Get next PID
    IntCmp $R5 0 next_iteration iterate_end 0 ; break if PID < 0, continue if PID = 0
 
    System::Call "Kernel32::OpenProcess(i 1040, i 0, i R5)i .R8"
    StrCmp $R8 0 next_iteration
    System::Alloc 1024
    Pop $R6
    System::Call "Psapi::EnumProcessModules(i R8, i R6, i 1024, *i .R1)i .R7"
    StrCmp $R7 0 0 no_enumproc_error
    System::Free $R6
    GoTo next_iteration
no_enumproc_error:
    System::Alloc 256
    Pop $R7
    System::Call "*$R6(i .r6)" ; Get next module
    System::Free $R6
    System::Call "Psapi::GetModuleBaseName(i R8, i r6, t .R7, i 256)i .r6"
    StrCmp $6 0 0 no_getmod_error
    System::Free $R7
    GoTo HandleError
no_getmod_error:
    MessageBox MB_OK "Found process called $R7 with length $6!"
    System::Free $R7
 
next_iteration:
    IntOp $R4 $R4 + 1 ; Add 1 to our counter
    IntOp $R9 $R9 + 4 ; Add sizeof(int) to our buffer address
 
    IntCmp $R4 $R2 iterate_end iterate iterate_end
iterate_end:
    MessageBox MB_OK "Success!"
    System::Free $R9
    Return
HandleError:
    MessageBox MB_OK "Something went wrong here."
    Return
FunctionEnd
 
Section
SectionEnd