понедельник, 17 мая 2010 г.

Как определить какие процессы запущены в операционой системе Windows?

Как определить какие процессы запущены в операционой систему Windows?
Легко,немного стараний и копания в справке привели меня к чудесной функции с жестоким названием CreateToolhelp32Snapshot
Итак после её запска с флагом TH32CS_SNAPPROCESS и в поле для DWORD 0 мыполучаем дескриптор со всеми процессами,нам остаётся только считать из него все нужные нам данные с помощью функции Process32First и Process32Next.Вся важная информация будет хранится в структуре PROCESSENTRY32.

struct tagPROCESSENTRY32
{
DWORD dwSize; // размер структуры в байтах
DWORD cntUsage; // всегда 0
DWORD th32ProcessID; // Идентификатор процесса
ULONG_PTR th32DefaultHeapID; // Всегда 0
DWORD th32ModuleID; // Всегда 0
DWORD cntThreads; // По каким номером был запущен процесс
DWORD th32ParentProcessID; // Идентификатор процесса которыйпорадил этот процесс
LONG pcPriClassBase; // Приоритет процессв
DWORD dwFlags; // Всегда 0
TCHAR szExeFile[MAX_PATH]; // Имя процесса
};
/*Нас интересует только идентификатор процесса th32ProcessID и его имя имя конечно будет с раширением exe
Итак вот он чудо код:*/

hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); // Дескриптор в котором записанны все процессы
if( hProcessSnap == INVALID_HANDLE_VALUE ) // Ради того чтобы не быть быдлокодером :)
{
CloseHandle( hProcessSnap );
return INVALID_HANDLE_VALUE;
}
pe32.dwSize = sizeof( PROCESSENTRY32 );
if( !Process32First( hProcessSnap, &pe32 ) ) // Определяем первый процесс в ОС
{
CloseHandle( hProcessSnap );
return INVALID_HANDLE_VALUE;
}
do
{
// итак теперь в pe.szExeFile хранится имя процесса а в pe32.th32ProcessID идентификатор
// в случае когда надо сохранить имя процесса в другую перменную советую хранить все данныд в типе wchar_t
handle = OpenProcess( PROCESS_TERMINATE , FALSE, pe32.th32ProcessID ); // Зная идентификатор можно вернуть и его дескриптор
}while( Process32Next( hProcessSnap, &pe32 ) ); // Переход к следующему процессу