Menelusuri daftar modul
Contoh kode ini mengambil daftar modul untuk proses tertentu (secara default, proses saat ini). Fungsi ListProcessModules mengambil rekam jepret modul yang terkait dengan proses tertentu. Untuk melakukannya, ia menggunakan fungsiCreateToolhelp32Snapshot, dan kemudian berjalan melalui daftar menggunakan fungsi Module32First dan Module32Next. Parameter dwPID ListProcessModules mengidentifikasi proses yang modulnya akan didaftarkan, dan biasanya diperoleh dengan memanggil CreateToolhelp32Snapshot untuk mendata proses yang berjalan pada sistem. Lihat Mengambil rekam jepret dan melihat proses untuk aplikasi konsol sederhana yang menggunakan fungsi ini.
Fungsi pelaporan kesalahan sederhana, printError, menampilkan alasan kegagalan apa pun (yang biasanya disebabkan oleh pembatasan keamanan).
Untuk mengikuti contoh kode, gunakan Visual Studio untuk membuat proyek baru dari templat proyek C++ Console App, dan tambahkan kode di bawah ini ke dalamnya.
#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 );
}
Topik terkait
- modul berjalan kaki