Compartir a través de


Enumerar todos los módulos de un proceso

Para determinar qué procesos han cargado un archivo DLL determinado, debe enumerar los módulos de cada proceso. En el código de ejemplo siguiente se usa la función EnumProcessModules para enumerar los módulos de los procesos actuales del sistema.

#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;
}

La función main obtiene una lista de procesos mediante la función EnumProcesses . Para cada proceso, la función principal llama a la función PrintModules y le pasa el identificador de proceso. PrintModules, a su vez, llama a la función OpenProcess para obtener el identificador del proceso. Si se produce un error en OpenProcess , la salida muestra solo el identificador del proceso. Por ejemplo, OpenProcess produce un error en los procesos Idle y CSRSS porque sus restricciones de acceso impiden que el código de nivel de usuario los abra. A continuación, PrintModules llama a la función EnumProcessModules para obtener la función handles del módulo. Por último, PrintModules llama a la función GetModuleFileNameEx , una vez para cada módulo, para obtener los nombres de módulo.