Durchlaufen der Modulliste
In diesem Codebeispiel wird eine Liste der Module für einen angegebenen Prozess abgerufen (standardmäßig für den aktuellen Prozess). Die Funktion ListProcessModules erstellt eine Momentaufnahme der Module, die einem bestimmten Prozess zugeordnet sind. Dazu wird die Funktion CreateToolhelp32Snapshot verwendet und dann mithilfe der Funktionen Module32First und Module32Next die Liste durchlaufen. Der dwPID-Parameter von ListProcessModules ermittelt den Prozess, für den Module aufgezählt werden sollen. Normalerweise wird CreateToolhelp32Snapshot abgerufen, um die Prozesse auf dem System aufzuzählen. Unter Erstellen einer Momentaufnahme und Anzeigen von Prozessen finden Sie eine einfache Konsolenanwendung, die diese Funktion verwendet.
Eine einfache Fehlerberichterstattungsfunktion, printError, zeigt den Grund für alle Fehler an (die in der Regel aus Sicherheitseinschränkungen resultieren).
Verwenden Sie Visual Studio, um ein neues Projekt aus der Projektvorlage C++-Konsolen-App zu erstellen, und fügen Sie ihr den folgenden Code hinzu.
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
// Forward declarations:
BOOL ListProcessModules(DWORD dwPID );
void printError(TCHAR const* msg );
int main( void )
{
ListProcessModules(GetCurrentProcessId() );
return 0;
}
BOOL ListProcessModules( DWORD dwPID )
{
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
// Take a snapshot of all modules in the specified process.
hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
if( hModuleSnap == INVALID_HANDLE_VALUE )
{
printError( TEXT("CreateToolhelp32Snapshot (of modules)") );
return( FALSE );
}
// Set the size of the structure before using it.
me32.dwSize = sizeof( MODULEENTRY32 );
// Retrieve information about the first module,
// and exit if unsuccessful
if( !Module32First( hModuleSnap, &me32 ) )
{
printError( TEXT("Module32First") ); // Show cause of failure
CloseHandle( hModuleSnap ); // Must clean up the snapshot object!
return( FALSE );
}
// Now walk the module list of the process,
// and display information about each module
do
{
_tprintf( TEXT("\n\n MODULE NAME: %s"), me32.szModule );
_tprintf( TEXT("\n executable = %s"), me32.szExePath );
_tprintf( TEXT("\n process ID = 0x%08X"), me32.th32ProcessID );
_tprintf( TEXT("\n ref count (g) = 0x%04X"), me32.GlblcntUsage );
_tprintf( TEXT("\n ref count (p) = 0x%04X"), me32.ProccntUsage );
_tprintf( TEXT("\n base address = 0x%08X"), (DWORD) me32.modBaseAddr );
_tprintf( TEXT("\n base size = %d"), me32.modBaseSize );
} while( Module32Next( hModuleSnap, &me32 ) );
_tprintf( TEXT("\n"));
// Do not forget to clean up the snapshot object.
CloseHandle( hModuleSnap );
return( TRUE );
}
void printError(TCHAR const* msg )
{
DWORD eNum;
TCHAR sysMsg[256];
TCHAR* p;
eNum = GetLastError( );
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, eNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
sysMsg, 256, NULL );
// Trim the end of the line and terminate it with a null
p = sysMsg;
while( ( *p > 31 ) || ( *p == 9 ) )
++p;
do { *p-- = 0; } while( ( p >= sysMsg ) &&
( ( *p == '.' ) || ( *p < 33 ) ) );
// Display the message
_tprintf( TEXT("\n WARNING: %s failed with error %d (%s)"), msg, eNum, sysMsg );
}