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

1. Базовые функции

Цель работы – практическое знакомство с методикой использования базовых функций для получения информации о процессах, потоках, модулях и кучах ОС Windows XP.

Краткие теоретические сведения

    1. 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 полей:

  1. Первое поле – dwSize – размер структуры в байтах. Это единственное поле, которое должно быть заполнено до вызова функции Process32First. Заполнить его можно, используя выражение sizeof(PROCESSENTRY32).

  2. Второе поле – cntUsage – содержит число ссылок на процесс, то есть число потоков, которые в настоящий момент используют какие-либо данные процесса.

  3. Третье поле – th32ProcessID – является идентификатором процесса.

  4. Четвертое поле – th32DefaultHeapID – не используется, и всегда устанавливается в ноль.

  5. Пятое поле – th32ModuleID – не используется, и всегда устанавливается в ноль.

  6. Шестое поле – cntThreads – определяет число потоков, принадлежащих процессу.

  7. Седьмое поле – th32ParentProcessID – является идентификатором родительского по отношению к текущему процесса.

  8. Восьмое поле – pcPriClassBase – содержит базовый приоритет процесса.

  9. Девятое поле – dwFlags – не используется, и всегда устанавливается в ноль.

  10. Десятое поле – 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. Список выполняющихся процессов