Announcement

Collapse

Forum Guidelines

This forum is for finished source code that is working properly. If you have questions about this or any other source code, please post it in one of the Discussion Forums, not here.
See more
See less

Which Processes Are Running On My Computer?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Which Processes Are Running On My Computer?

    ' This program was inspired by the excellent routines provided by
    ' Graham McPhee (many thanks), see this link:
    ' http://www.powerbasic.com/support/pb...ad.php?t=37879
    '
    ' It may be a surprise to you to see how many processes are actually
    ' running on your computer. You may even find that the same process
    ' is running in more than one instance.
    '
    ' Best regards,
    '
    ' Erik -------------- 30 November, 2008
    '
    ' P.S. 6 December, 2008: included information about size of file.
    Code:
    ' Which Processes Are Running On My Computer?
    '
    ' This program was inspired by the excellent routines provided by
    ' Graham McPhee (many thanks), see this link:
    ' http://www.powerbasic.com/support/pbforums/showthread.php?t=37879
    '
    ' It may be a surprise to you to see how many processes are actually
    ' running on your computer. You may even find that the same process
    ' is running in more than one instance.
    '
    ' Best regards,
    '
    ' Erik -------------- 30 November, 2008
    '
    ' P.S. 6 December, 2008: included information about size of file.
    #COMPILE EXE
    #DIM ALL
    '
    #INCLUDE "WIN32API.INC"
    '
    %IDD_DIALOG1                    =  100
    %IDC_BUTTON1_EXIT               = 1001
    %IDC_LISTBOX1                   = 1002
    '
    '  Processes running . PB_Processes.inc (Provided by Graham McPhee - Thanks!)
    '
    DECLARE FUNCTION EnumProcesses (lpidProcess AS DWORD, BYVAL cb AS DWORD, cbNeeded AS DWORD) AS LONG
    DECLARE FUNCTION GetModuleFileNameEx (BYVAL hProcess AS DWORD, BYVAL hModule AS DWORD, ModuleName AS ASCIIZ, nSize AS DWORD) AS DWORD
    DECLARE FUNCTION EnumProcessModules (BYVAL hProcess AS DWORD, BYREF lphModule AS DWORD, BYVAL cb AS DWORD, cbNeeded AS DWORD) AS LONG
    '
    TYPE PROCESSENTRY32
       dwSize AS DWORD
       cntUsage AS DWORD
       th32ProcessID AS DWORD          ' This process
       th32DefaultHeapID AS LONG PTR
       th32ModuleID AS DWORD           ' Associated exe
       cntThreads AS DWORD
       th32ParentProcessID AS DWORD    ' This process's parent process
       pcPriClassBase AS LONG          ' Base priority of process threads
       dwFlags AS DWORD
       szExeFile AS ASCIIZ * %MAX_PATH
    END TYPE
    '
    FUNCTION ListAllProcesses(BYVAL hDlg AS DWORD) AS LONG
    '
        DIM Reply AS STRING
        DIM lngR AS INTEGER
        DIM strModule AS STRING
        DIM strExe AS STRING
        DIM f AS STRING
        DIM DirDataVar AS DIRDATA
        '
        CALL EnumModules(Reply)  ' pick up the processes in a string
        '
        FOR lngR = 1 TO PARSECOUNT(Reply,$CRLF)
            strModule = PARSE$(Reply,$CRLF,lngR)
            strExe = PARSE$(strModule,"|",2) ' path and filename
            f = DIR$(strExe, TO DirDataVar)  ' get file data including file size
            IF DirDataVar.FileSizeLow > 0 THEN LISTBOX ADD hDlg, %IDC_LISTBOX1, strExe + "     Size ="+STR$(DirDataVar.FileSizeLow) + " Bytes"
        NEXT lngR
        '
        FUNCTION = 1
    '
    END FUNCTION
    '
    SUB EnumModules(Reply AS STRING) ' Provided by Graham McPhee
      LOCAL Proc AS PROCESSENTRY32
      LOCAL cb AS DWORD, cbNeeded AS DWORD
      LOCAL i AS LONG, j AS LONG, nModules AS LONG, nProcesses AS LONG, hProcess AS DWORD, lResult AS LONG
      LOCAL hPsApiDll AS DWORD, hEnumProcesses AS DWORD, hGetModuleFileNameEx AS DWORD, hEnumProcessModules AS DWORD
      LOCAL SizeOfFile AS DWORD
      hPsApiDll = GetModuleHandle("psApi.dll")
      IF hPsApiDll = 0 THEN hPsApiDll = LoadLibrary("psApi.dll")
        hEnumProcesses = GetProcAddress(hPsApiDll, "EnumProcesses")
        hGetModuleFileNameEx = GetProcAddress(hPsApiDll, "GetModuleFileNameExA")
        hEnumProcessModules = GetProcAddress(hPsApiDll, "EnumProcessModules")
        cb = 100
        DO
          REDIM ProcessIDs(1 TO cb / 4) AS DWORD
          CALL DWORD hEnumProcesses USING EnumProcesses (ProcessIDs(1), cb, cbNeeded) TO lResult
          IF cb > cbNeeded THEN EXIT DO
          cb = cb * 2
        LOOP
        '
        Reply = ""
        nProcesses = cbNeeded / 4
        FOR i = 1 TO nProcesses
           hProcess = OpenProcess(%PROCESS_QUERY_INFORMATION OR %PROCESS_VM_READ OR _
                                  %PROCESS_CREATE_THREAD OR %PROCESS_VM_OPERATION OR _
                                  %PROCESS_VM_WRITE, %False, ProcessIDs(i))
          IF hProcess THEN
            LOCAL CmdLine AS STRING
            '
            cb = 100
            DO
              REDIM Modules(1 TO cb / 4) AS DWORD
              CALL DWORD hEnumProcessModules USING _
              EnumProcessModules (hProcess, Modules(1), cb, cbNeeded) TO lResult
              IF lResult = 0 THEN cbNeeded = 0: EXIT DO
              IF cb > cbNeeded THEN EXIT DO ELSE cb = cb * 2
            LOOP
            IF cbNeeded >= 4 THEN
              CALL DWORD hGetModuleFileNameEx USING GetModuleFileNameEx _
                (hProcess, Modules(1), Proc.szExeFile, SIZEOF(Proc.szExeFile)) TO lResult
                IF lResult THEN Reply = Reply + STR$(ProcessIDs(i))+ "|" + Proc.szExeFile + "|" + $CRLF
            END IF
           CloseHandle hProcess
         END IF
      NEXT nProcesses
    END SUB
    '
    CALLBACK FUNCTION ShowDIALOG1Proc()
        SELECT CASE AS LONG CBMSG
            CASE %WM_INITDIALOG
                ListAllProcesses(CBHNDL)
            CASE %WM_COMMAND
                SELECT CASE AS LONG CBCTL
                    CASE %IDC_BUTTON1_EXIT
                        IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN DIALOG END CBHNDL
                END SELECT
        END SELECT
    END FUNCTION
    '
    FUNCTION PBMAIN()
        LOCAL lRslt AS LONG
        LOCAL hDlg  AS DWORD
        DIALOG NEW %HWND_DESKTOP, "Which Processes Are Running On My Computer?", , _
            , 451, 193, %WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR %WS_CAPTION _
            OR %WS_SYSMENU OR %WS_MINIMIZEBOX OR %WS_CLIPSIBLINGS OR %WS_VISIBLE _
            OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, _
            %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
            %WS_EX_RIGHTSCROLLBAR, TO hDlg
        CONTROL ADD LISTBOX, hDlg, %IDC_LISTBOX1, , 16, 12, 420, 140, %WS_CHILD _
            OR %WS_VISIBLE OR %WS_TABSTOP OR %WS_HSCROLL OR %WS_VSCROLL OR _
            %LBS_SORT OR %LBS_NOTIFY, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR _
            %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR
        CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON1_EXIT, "E&xit", 392, 164, 44, 16
        DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt
        FUNCTION = lRslt
    END FUNCTION
    Last edited by Erik Christensen; 6 Dec 2008, 05:24 PM. Reason: included information about size of file
Working...
X