- •Монитор процессов и потоков
- •Введение
- •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. Контрольные вопросы
- •Библиографический список
Получение информации счетчиков ввода-вывода
и количества описателей (дескрипторов)
Содержимое счетчиков ввода-вывода – количество прочитанных - записанных байт может быть получено функцией GetProcessIoCounters(Handle: Thandle; pIOCounters : TProcessIOCounters ): bool.
Первый аргумент определяет процесс, второй – указатель на структуру
TProcessIOCounters = record
ReadOperationCount: int64;
WriteOperationCount: int64;
OtherOperationCount: int64;
ReadTransferCount: int64;
WriteOTransferCount: int64;
OtherOTransferCount: int64;
end;
Данная функция содержится в библиотеке kernel32.dll. Поскольку прототип данной функции в файле windows.pas отсутствует, для вызова данной функции (как и всех описанных далее в этой работе функций) используется неявный вызов. Для неявного вызова функции из библиотеки динамической загрузки (DLL) в программе должен быть создан прототип. Пример прототипа:
function GetProcessIoCounters(Hprocess: Thandle; PIOCount : TpprocessIOCounters): BOOL; stdcall external 'kernel32.dll';
Прототипы определенных таким образом функций должны содержать:
имя функции (регистр учитывается);
формальные аргументы и их типы;
имя содержащей функцию библиотеки.
Прототипы записываются в разделе implementation. Типы аргументов (не описанные в windows.pas) должны быть описаны в разделе type.
Для рассматриваемого примера в раздел type следует записать:
TProcessIOCounters = record
ReadOperationCount : int64;
WriteOperationCount : int64;
OtherOperationCount : int64;
ReadTransferCount : int64;
WriteOTransferCount : int64;
OtherOTransferCount : int64;
end;
TpprocessIOCounters = ^TprocessIOCounters;
а в раздел implementation вставить описание прототипа:
function GetProcessIoCounters(Hprocess: Thandle; PIOCount : TpprocessIOCounters): BOOL; stdcall external 'kernel32.dll';
Ошибка в названии библиотеки приводит к появлению на этапе выполнения сообщения «библиотека не найдена», ошибка в написании имени функции (РЕГИСТР учитывается!) – к появлению сообщения «функция XXX не найдена в библиотеке YYY».
Ecли имя функции и имя библиотеки заданы правильно, описанную функцию можно вызывать, указывая правильные типы аргументов.
Функция GetProcessHandleCount(Hprocess: Thandle; PHandCount : TphandCount ): Bool из библиотеки kernel32.dll возвращает указатель на переменную типа Dword, содержащую количество созданных указанных процессом описателей (дескрипторов). Для использования функции необходимо создать прототип для ее вызова из библиотеки, описать переменную HandCount : Dword и указать вторым аргументом функции адрес этой переменной, например:
GetProcessHandleCount (GetCurrentProcess,@HandCount);
Получение информации об используемой процессом памяти
Функция GetProcessMemoryInfo(Hprocess: Thandle; pmemcount: PPROCESS_MEMORY_COUNTERS) : Bool
из библиотеки Psapi.dll содержит различную информацию об используемой процессом памяти. Процесс задается описателем (Handle), структура, содержащая информацию об использовании памяти задается указателем.
TProcess_Memory_Counters = record
size : Dword; // размер структуры
PageFaultCount: Dword; // количество страничных ошибок
PeakWorkingSetSize: cardinal; // пиковый размер используемой ОП
WorkingSetSize: cardinal; // используемый объем ОП
QuotaPeakPagePoolUsage: cardinal;//максимальный размер страничного пула памяти
QuotaPagePoolUsage: cardinal; // размер страничного пула памяти
QuotaPeakNonPagedPoolUsage: cardinal;//макс размер невыгружаемого пула памяти
QuotaNonPagePollUsage: cardinal; // размер невыгружаемого пула памяти
PageFileUsage: cardinal;
PeakPageFileUsage: cardinal;
PrivateUsage: cardinal;
end;
Для использования функции необходимо создать ее прототип для вызова из библиотеки Psapi.dll. Перед вызовом функции необходимо в первое поле структуры Process_Memory_Counters записать ее размер.
Функция GetProcessWorkingSetSize(Hprocess: Thandle; Min,Max: Cardinal) возвращает минимальный и максимальный размеры рабочего множества страниц указанного процесса (в байтах). Прототип функции описан в файле windows.pas.
