#include <tlhelp32.h>
#include <stdio.h>
void ShowError( TCHAR* 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), sysMsg, 256, NULL );
p = sysMsg;
while( ( *p > 31 ) || ( *p == 9 ) )
++p;
do { *p-- = 0; } while( ( p >= sysMsg ) && ( ( *p == '.' ) || ( *p < 33 ) ) );
TCHAR ShowMsg[UNICODE_STRING_MAX_CHARS];
swprintf(ShowMsg, L"UWAGA: %s wywołał błąd %d (%s)", msg, eNum, sysMsg );
ShowMessage( (String)ShowMsg );
}
//---------------------------------------------------------------------------
/* Funkcja wylicza moduły połączone z procesem */
BOOL ListProcessModules( DWORD dwPID, TStrings *Lista)
{
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
if( hModuleSnap == INVALID_HANDLE_VALUE )
{
ShowError( L"CreateToolhelp32Snapshot (modułów)" );
return( FALSE );
}
me32.dwSize = sizeof( MODULEENTRY32 );
if( !Module32First( hModuleSnap, &me32 ) )
{
ShowError( L"Module32First" );
CloseHandle( hModuleSnap );
return( FALSE );
}
do
{
Lista->Add( "NAZWA MODUŁU: " + (String)me32.szModule );
Lista->Add( "Nazwa pliku procesu = " + (String)me32.szExePath );
Lista->Add( "PID procesu = " + (String)me32.th32ProcessID );
Lista->Add( "ref count (g) = " + (String)me32.GlblcntUsage );
Lista->Add( "ref count (p) = " + (String)me32.ProccntUsage );
Lista->Add( "base address = " + (String)(DWORD)me32.modBaseAddr );
Lista->Add( "base size = " + (String)me32.modBaseSize );
} while( Module32Next( hModuleSnap, &me32 ) );
CloseHandle( hModuleSnap );
return( TRUE );
}
//---------------------------------------------------------------------------
/* Funkcja szukająca rodzica procesu */
BOOL FindParentProces( DWORD dwOwnerPID, TStrings *Lista)
{
HANDLE hSnap = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe32;
hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( hSnap == INVALID_HANDLE_VALUE )
return( FALSE );
pe32.dwSize = sizeof( PROCESSENTRY32 );
if( !Process32First( hSnap, &pe32 ) )
{
ShowError( L"Process32First" );
CloseHandle( hSnap );
return( FALSE );
}
do
{
if( pe32.th32ProcessID == dwOwnerPID )
{
HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS, true, pe32.th32ProcessID);
if(hWnd)
{
Lista->Add( "Parent: " + (String)pe32.szExeFile );
}
}
} while( Process32Next(hSnap, &pe32 ) );
CloseHandle( hSnap );
return( TRUE );
}
//---------------------------------------------------------------------------
void __fastcall GetParentProces(String ProcesName, TStrings *Lista)
{
PROCESSENTRY32 proces;
HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
proces.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(Snap, &proces))
{
do
{
if(proces.szExeFile[0] != '[')
{
if(SameText((String)proces.szExeFile, ProcesName))
{
HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS, true, proces.th32ProcessID);
if(hWnd)
{
DWORD pID = proces.th32ProcessID;
Lista->Add(" *** MODUŁY PROCESU ***");
ListProcessModules( pID, Lista );
pID = proces.th32ParentProcessID;
Lista->Add("---------------");
Lista->Add(" *** PARENT ***");
FindParentProces( pID, Lista );
Lista->Add( "Parent PID: " + (String)pID );
}
else return;
CloseHandle(hWnd);
return;
}
}
}
while(Process32Next(Snap , &proces));
}
CloseHandle(Snap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
GetParentProces("notepad.exe", ListBox1->Items);
}