Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Aby określić, które procesy załadowały określoną bibliotekę DLL, należy wyliczyć moduły dla każdego procesu. Poniższy przykładowy kod używa funkcji EnumProcessModules w celu wyliczenia modułów bieżących procesów w systemie.
#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;
}
Funkcja main uzyskuje listę procesów przy użyciu funkcji EnumProcesses. Dla każdego procesu główna funkcja wywołuje funkcję PrintModules, przekazując jej identyfikator procesu. Funkcja PrintModules z kolei wywołuje funkcję OpenProcess w celu uzyskania dojścia procesu. Jeśli OpenProcess zakończy się niepowodzeniem, dane wyjściowe zawierają tylko identyfikator procesu. Na przykład OpenProcess kończy się niepowodzeniem dla procesu bezczynności i CSRSS, ponieważ ich ograniczenia dostępu uniemożliwiają otwarcie ich przez kod na poziomie użytkownika. Następnie funkcja PrintModules wywołuje funkcję EnumProcessModules w celu uzyskania uchwytów modułów. Na koniec funkcja PrintModules wywołuje funkcję GetModuleFileNameEx raz dla każdego modułu w celu uzyskania nazw modułów.