Enumerazione di tutti i processi

Il codice di esempio seguente usa la funzione EnumProcesses per recuperare l'identificatore di processo per ogni oggetto processo nel sistema. EnumProcessModules viene quindi chiamato per ottenere ogni nome del processo e stamparlo.

Nota

Per i processi a 64 bit, usare la funzione EnumProcessModulesEx .

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>

// To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS
// and compile with -DPSAPI_VERSION=1

void PrintProcessNameAndID( DWORD processID )
{
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

    // Get a handle to the process.

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );

    // Get the process name.

    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
             &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName, 
                               sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }

    // Print the process name and identifier.

    _tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );

    // Release the handle to the process.

    CloseHandle( hProcess );
}

int main( void )
{
    // Get the list of process identifiers.

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    {
        return 1;
    }


    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.

    for ( i = 0; i < cProcesses; i++ )
    {
        if( aProcesses[i] != 0 )
        {
            PrintProcessNameAndID( aProcesses[i] );
        }
    }

    return 0;
}

La funzione principale ottiene un elenco di processi usando la funzione EnumProcesses . Per ogni processo, principale chiama la funzione PrintProcessNameAndID , passandolo l'identificatore del processo. PrintProcessNameAndID chiama la funzione OpenProcess per ottenere l'handle del processo. Se OpenProcess ha esito negativo, l'output mostra il nome del processo come <sconosciuto>. Ad esempio, OpenProcess non riesce per i processi Idle e CSRSS perché le restrizioni di accesso impediscono l'apertura del codice a livello di utente. StampaProcessNameAndID chiama quindi la funzione EnumProcessModules per ottenere gli handle del modulo. Infine, PrintProcessNameAndID chiama la funzione GetModuleBaseName per ottenere il nome del file eseguibile e visualizza il nome insieme all'identificatore del processo.