- •Монитор процессов и потоков
- •Краткие теоретические сведения
- •Получение списка процессов, выполняющихся в системе
- •1.1.1 Использование функций CreateToolHelp32Snapshot () и Process32xxxx() для получения списка имен процессов
- •1.1.2 Использование функций CreateToolhelp32Snapshot () и Thread32xxxx() для получения сведений о приоритетах потоков процессов
- •1.1.3 Использование функций CreateToolHelp32Snapshot () и Module32xxxx()
- •Завершение выбранного процесса
- •1.3 Мониторинг процессов
- •2.2. Выполнить индивидуальное задание для бригады согласно таблице 3
- •Отчет о работе
- •4. Контрольные вопросы
- •2. Методика выполнения
1.1.2 Использование функций CreateToolhelp32Snapshot () и Thread32xxxx() для получения сведений о приоритетах потоков процессов
Для получения сведений о приоритетах потоков необходимо извлечь из снимка состояния системы с помощью функций Thread32First() и Thtead32Next () значения соответствующих полей.
Обращение к функциям имеет вид:
BOOL Thread32First (HANDLE hSnapshot, LPTHREADENTRY32 lpte);
BOOL Thtead32Next (HANDLE hSnapshot, LPTHREADENTRY32 lpte);
Первый аргумент - хэндл созданного снимка (возвращает функция CreateToolHelp32Snapshot).
Второй аргумент - структура, содержащая 7 полей:
Первое поле этой структуры - dwSize - должно перед вызовом функции содержать размер структуры в байтах - sizeof (THREADEntry32).
Поле th32OwnerProcessID содержит идентификатор процесса – владельца потока.
Поле tpBasePri содержит текущий приоритет потока.
Поле tpDeltaPri содержит разность между текущим уровнем приоритета потока и базовым уровнем, то есть тем, который присваивается при создании потока.
Пример 2. Получить список выполняющихся в системе потоков, используя рассмотренные выше функции. Вывести содержимое полей 2 и 3 структуры THREADEntry32
На форме разместить компоненты ListBox, Label и Button, в список директив проекта добавить директиву
#include <tlhelp32.h>
Обработчик события OnClick кнопки должен иметь вид:
THREADENTRY32 Th;
HANDLE Sh = CreateToolhelp32Snapshot (TH32CS_SNAPALL, 0);
Th.dwSize = sizeof (THREADENTRY32);
Thread32First(Sh,&Th);
ListBox1->Clear();
ListBox1->Items ->Add("процесс " + IntToStr(Th.th32OwnerProcessID) + " приоритет потока " +
IntToStr(Th.tpBasePri));
do
{
ListBox1->Items ->Add("процесс " + IntToStr(Th.th32OwnerProcessID) + " приоритет потока " +
IntToStr(Th.tpBasePri));
}
while (Thread32Next (Sh,&Th));
CloseHandle(Sh);
Результат выполнения приложения примера 2 показан на рис. 2.
Рисунок 2. Список потоков
1.1.3 Использование функций CreateToolHelp32Snapshot () и Module32xxxx()
для получения списка модулей
Для получения сведений о модулях, используемых одним из процессов, необходимо:
получить снимок выполняющихся процессов;
извлечь из снимка имена процессов и поместить их в ListBox, одновременно создать в памяти массив идентификаторов процессов;
для выбранного процесса найти в массиве его идентификатор и, используя полученный идентификатор в качестве второго аргумента функции CreateToolHelp32Snapshot (), получить снимок списка модулей выбранного процесса;
извлечь из полученного снимка с помощью функций Module32First() и Module32Next() значения соответствующих полей.
Обращение к функциям имеет вид:
BOOL Module32First (HANDLE hSnapshot, tagMODULEENTRY32 lpte);
BOOL Module32Next (HANDLE hSnapshot, tagMODULEENTRY32 lpte).
Первый аргумент - хэндл созданного снимка (возвращает функция CreateToolhelp32Snapshot).
Второй аргумент - структура, содержащая 10 полей:
unsigned long dwSize – размер структуры tagMODULEENTRY32
unsigned long th32ModuleID – размер модуля
unsigned long th32ProcessID - идентификатор процесса, владеющего модулем
unsigned long GlblcntUsage - счетчик глобальных пользователей модуля
unsigned long ProccntUsage - счетчик процессов - пользователей
unsigned char* modBaseAddr – базовый адрес модуля
unsigned long modBaseSize – базовый размер модуля
void * hModule - хэндл модуля
char[256] szModule – имя модуля
char[260] szExePath – путь размещения модуля.
