Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Монитор процессов и потоков С++.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1 Мб
Скачать
☆

1.1.2 Использование функций CreateToolhelp32Snapshot () и Thread32xxxx() для получения сведений о приоритетах потоков процессов

Для получения сведений о приоритетах потоков необходимо извлечь из снимка состояния системы с помощью функций Thread32First() и Thtead32Next () значения соответствующих полей.

Обращение к функциям имеет вид:

BOOL Thread32First (HANDLE hSnapshot, LPTHREADENTRY32 lpte);

BOOL Thtead32Next (HANDLE hSnapshot, LPTHREADENTRY32 lpte);

Первый аргумент - хэндл созданного снимка (возвращает функция CreateToolHelp32Snapshot).

Второй аргумент - структура, содержащая 7 полей:

  1. Первое поле этой структуры - dwSize - должно перед вызовом функции содержать размер структуры в байтах - sizeof (THREADEntry32).

  2. Поле th32OwnerProcessID содержит идентификатор процесса – владельца потока.

  3. Поле tpBasePri содержит текущий приоритет потока.

  4. Поле 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 – путь размещения модуля.