Bagikan melalui


Menghitung Semua Modul Untuk Proses

Untuk menentukan proses mana yang telah memuat DLL tertentu, Anda harus menghitung modul untuk setiap proses. Kode sampel berikut menggunakan fungsi EnumProcessModules untuk menghitung modul proses saat ini dalam sistem.

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

Fungsi utama mendapatkan daftar proses dengan menggunakan fungsi EnumProcesses . Untuk setiap proses, fungsi utama memanggil fungsi PrintModules, meneruskannya pengidentifikasi proses. PrintModules pada gilirannya memanggil fungsi OpenProcess untuk mendapatkan handel proses. Jika OpenProcess gagal, output hanya menunjukkan pengidentifikasi proses. Misalnya, OpenProcess gagal untuk proses Idle dan CSRSS karena pembatasan aksesnya mencegah kode tingkat pengguna membukanya. Selanjutnya, PrintModules memanggil fungsi EnumProcessModules untuk mendapatkan fungsi handel modul. Terakhir, PrintModules memanggil fungsi GetModuleFileNameEx , sekali untuk setiap modul, untuk mendapatkan nama modul.