Delen via


Alle modules voor een proces opsommen

Als u wilt bepalen welke processen een bepaalde DLL hebben geladen, moet u de modules voor elk proces inventariseren. In de volgende voorbeeldcode wordt de functie EnumProcessModules gebruikt om de modules van de huidige processen in het systeem op te sommen.

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

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

int PrintModules( DWORD processID )
{
    HMODULE hMods[1024];
    HANDLE hProcess;
    DWORD cbNeeded;
    unsigned int i;

    // Print the process identifier.

    printf( "\nProcess ID: %u\n", processID );

    // Get a handle to the process.

    hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                            PROCESS_VM_READ,
                            FALSE, processID );
    if (NULL == hProcess)
        return 1;

   // Get a list of all the modules in this process.

    if( EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
        {
            TCHAR szModName[MAX_PATH];

            // Get the full path to the module's file.

            if ( GetModuleFileNameEx( hProcess, hMods[i], szModName,
                                      sizeof(szModName) / sizeof(TCHAR)))
            {
                // Print the module name and handle value.

                _tprintf( TEXT("\t%s (0x%08X)\n"), szModName, hMods[i] );
            }
        }
    }
    
    // Release the handle to the process.

    CloseHandle( hProcess );

    return 0;
}

int main( void )
{

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

    // Get the list of process identifiers.

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

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the names of the modules for each process.

    for ( i = 0; i < cProcesses; i++ )
    {
        PrintModules( aProcesses[i] );
    }

    return 0;
}

De hoofdfunctie verkrijgt een lijst met processen met behulp van de functie EnumProcesses. Voor elk proces roept de hoofdfunctie de functie PrintModules aan, waarbij de proces-id wordt doorgegeven. PrintModules roept op zijn beurt de functie OpenProcess aan om de procesgreep te verkrijgen. Als OpenProcess- mislukt, wordt in de uitvoer alleen de proces-id weergegeven. Bijvoorbeeld, OpenProcess mislukt voor de processen Idle en CSRSS, omdat hun toegangsbeperkingen voorkomen dat code op gebruikersniveau ze kan openen. Vervolgens roept PrintModules de functie EnumProcessModules aan om de functie handles van de module te verkrijgen. Ten slotte roept PrintModules de functie GetModuleFileNameEx aan, eenmaal voor elke module, om de modulenamen op te halen.