- •Монитор процессов и потоков
- •Введение
- •1. Базовые функции
- •Краткие теоретические сведения
- •1.1. Получение списка процессов, выполняющихся в системе
- •1.1.1 Использование функций CreateToolHelp32Snapshot () и Process32xxxx()
- •1.1.2 Использование функций CreateToolHelp32Snapshot () и Thread32xxxx()
- •1.1.3 Использование функций CreateToolHelp32Snapshot () и Module32xxxx()
- •1.2 Завершение выбранного процесса
- •1.1.4 Использование функций CreateToolHelp32Snapshot () и Heap32Listxxxx()
- •1.3 Мониторинг процессов
- •2. Дополнительные функции
- •Краткие теоретические сведения
- •2.1 Получение дополнительной информации о процессах и потоках
- •Получение информации о времени выполнения процессов и потоков
- •Получение информации счетчиков ввода-вывода
- •Получение информации об используемой процессом памяти
- •Получение информации о загруженных драйверах
- •Методика выполнения
- •3. Отчет о выполненной контрольной работе
- •4. Контрольные вопросы
- •Библиографический список
1. Базовые функции
Цель работы – практическое знакомство с методикой использования базовых функций для получения информации о процессах, потоках, модулях и кучах ОС Windows XP.
Краткие теоретические сведения
1.1. Получение списка процессов, выполняющихся в системе
1.1.1 Использование функций CreateToolHelp32Snapshot () и Process32xxxx()
для получения списка имен процессов
Первый этап получения информации о выполняющихся в системе процессах –получение снимка (snapshot) системы, который содержит информацию о состоянии системы в момент выполнения снимка.
Снимок создается с помощью функции CreateToolHelp32Snapshot (dwFlags, th32ProcessID), первый аргумент определяет, какая информация будет записана в снимок. Возможные значения dwFlags приведены в таблице 1.
Таблица 1
Возможные значения dwFlags
Флаг - dwFlags |
Описание |
TH32CS_SnapHEAPLIST |
В снимок включается список куч, принадлежащих указанному процессу |
TH32CS_SnapPROCESS |
В снимок включается список процессов, присутствующих в системе |
TH32CS_SnapTHREAD |
В снимок включается список потоков |
TH32CS_SnapMODULE |
В снимок включается список модулей, принадлежащих указанному процессу |
TH32CS_SnapALL |
В снимок включается список куч, процессов, потоков и модулей |
Второй аргумент определяет процесс, информация о котором необходима (если требуется список куч и модулей). В остальных случаях он игнорируется.
Второй этап – извлечение из снимка списка процессов. Для выполнения этой операции служат функции:
Process32First ( hSnapshot, LPProcessEntry32);
Process32Next ( hSnapshot, LPProcessEntry32).
Первый аргумент – хэндл созданного снимка (возвращает функция CreateToolHelp32Snapshot).
Второй аргумент – структура, содержащая 10 полей:
Первое поле – dwSize – размер структуры в байтах. Это единственное поле, которое должно быть заполнено до вызова функции Process32First. Заполнить его можно, используя выражение sizeof(PROCESSENTRY32).
Второе поле – cntUsage – содержит число ссылок на процесс, то есть число потоков, которые в настоящий момент используют какие-либо данные процесса.
Третье поле – th32ProcessID – является идентификатором процесса.
Четвертое поле – th32DefaultHeapID – не используется, и всегда устанавливается в ноль.
Пятое поле – th32ModuleID – не используется, и всегда устанавливается в ноль.
Шестое поле – cntThreads – определяет число потоков, принадлежащих процессу.
Седьмое поле – th32ParentProcessID – является идентификатором родительского по отношению к текущему процесса.
Восьмое поле – pcPriClassBase – содержит базовый приоритет процесса.
Девятое поле – dwFlags – не используется, и всегда устанавливается в ноль.
Десятое поле – szExeFile – содержит имя файла, создавшего процесс.
Для того, чтобы получить информацию о первом процессе в снимке, необходимо вызвать функцию Process32First. В случае успешного завершения функция возвращает TRUE. Для того, чтобы просмотреть все оставшиеся процессы, нужно вызывать функцию Process32Next до тех пор, пока она не возвратит FALSE.
В список используемых модулей – uses – необходимо добавить модуль TlHelp32
Пример 1. Получить список имен выполняющихся в системе процессов, используя рассмотренные выше функции.
На форме размещены компоненты ListBox, Label и Button, обработчик события OnClick имеет вид:
var
SH: Thandle;
Num,I: Integer;
PPE: TProcessEntry32;
Pr_names: array [0..80] of string;
begin
Num:= 0;
// получение снимка состояния системы
SH:= CreateToolHelp32SnapShot(Th32cs_SnapAll,0);
// выделение из снимка имени первого процесса
PPE.dwSize:= sizeof(ProcessEntry32);
Process32First(SH,PPE);
Pr_Names[Num]:= PPE.szExeFile;
// получение имен других процесса
while Process32Next(SH,PPE) do
begin
Num:= Num+1;
Pr_Names[Num]:= PPE.szExeFile;
end;
Listbox1.Clear;
// вывод списка имен выполняющихся процессов
for I:=0 to Num do Listbox1.Items.Add(Pr_Names[I]);
// освобождение ресурса – снимка состояния системы
CloseHandle(SH)
end;
Результат выполнения примера 1 показан на рис. 2.
Рис. 2. Список выполняющихся процессов
