- •Введение
- •1. Методы и средства получения информации о ресурсах вычислительной системы
- •1.1. Получение информации о выполняющихся процессах и используемых ими ресурсах
- •1.1.1. Получение списка процессов, выполняющихся в системе
- •1.1.1.1. Использование функций CreateToolHelp32Snapshot () и Process32xxxx() для получения списка имен процессов
- •1.1.1.2. Использование функций CreateToolHelp32Snapshot () и Thread32xxxx() для получения сведений о приоритетах потоков процессов
- •1.1.2. Использование функций CreateToolHelp32Snapshot () и Module32xxxx() для получения списка модулей
- •1.1.3. Использование функций CreateToolHelp32Snapshot () и Heap32Listxxxx() для получения списка куч
- •1.1.4. Получение дополнительной информации о процессах и потоках
- •1.1.4.2. Получение информации счетчиков ввода-вывода и количества описателей (дескрипторов)
- •Получение информации о загруженных драйверах
- •1.1.6. Использование функции NtQuerySystemInformation
- •1.1.6.1. Назначение аргументов функции
- •1.1.6.2. Вызов функции NtQuerySystemInformation
- •1.1.6.3. Получение сведений о процессах и потоках
- •1.1.6.4. Преобразование данных из формата FileTime в формат SystemTime
- •1.1.6.5. Вычисление загрузки процессора
- •1.1.7 Формирование протокола использования процессора
- •1.2. Получение информации о ресурсах виртуальной памяти и системе
- •1.2.1. Функции и структуры данных управления виртуальной памятью
- •1.2.2. Получение информации о структуре виртуального адресного пространства
- •1.3. Получение информации о файловой системе
- •1.3.1. Определение имеющихся логических дисков
- •1.3.2. Получение информации о томах
- •1.3.3. Поиск файлов
- •1.4. Методы и средства работы с реестром
- •1.4.1. Открытие и закрытие родительского раздела
- •1.4.2. Создание подразделов
- •1.4.3. Установка значения параметра
- •1.4.4. Получение значения параметра
- •1.4.5. Уведомление приложения об изменениях в разделе реестра
- •1.4.6. Использование компонента Registry
- •1.4.7. Поиск в разделе реестра имен файлов приложений, являющихся локальными серверами автоматизации
- •1.5. Использование функции ReadDirectoryChangesW для отслеживания изменений в файловой системе
- •2. Средства управления выполнением прикладных процессов
- •2.1. Функции Win32 для создания и управления процессами
- •2.2. Функции Win32 для создания и управления потоками
- •2.3. Завершение выбранного процесса
- •3. Методы реализации мониторинга ресурсов
- •3.1. Мониторинг процессов
- •3.2. Программирование «с защитой от ошибок»
- •Требования к разрабатываемому монитору
- •4.1. Требования к выполняемым функциям
- •4.2. Требования к реализации
- •4.3. Требования к документации
- •4.4. Список вопросов для приема курсовой работы
- •Библиографический список
- •Приложение 1 График выполнения курсовой работы
- •Приложение 2 Примеры описания реализации отдельных функций монитора и оформления разделов пояснительной записки
- •1. Вывод списка выполняющихся процессов в виде дерева.
- •2. Формирование протокола использования процессора
- •3. Протоколирование моментов времени внесения изменений в файловую систему с записью выполненных изменений и имён приложений, выполнивших изменения.
- •4. Поиск одинаковых файлов, хранящихся в различных каталогах (необходимо обеспечить возможно большую скорость выполнения операции). Вводить имена файлов или каталогов перед началом поиска не следует.
- •9. Вывод списка прав текущего пользователя
- •10. Пример составления перечня используемых компонентов
- •11. Пример заполнения таблицы использованных компонентов
- •12. Пример описания основных переменных
- •13. Пример составления руководства пользователя по инсталляции и использованию монитора
- •14. Пример описания процедуры тестирования монитора
- •Системное программное обеспечение Учебное пособие
- •443100, Г. Самара, ул. Молодогвардейская, 244.
- •443100, Г. Самара, ул. Молодогвардейская, 244. Корпус № 8
1.1.4. Получение дополнительной информации о процессах и потоках
Для получения дополнительной информации – о времени работы потоков, используемой памяти и других ресурсов служат функции Win32 API GetThreadTimes(), GetProcessIoCounters(), GetProcessHandleCount(), GetProcessMemoryInfo(), GetProcess WorkingSetSize(), EnumDeviceDrivers(), GetDeviceDriverBaseNameA(), GetDeviceDriverFileNameA().
Получение информации о времени выполнения потоков
Функция GetThreadTimes(Handle: Thandle; CreateTime, ExitTime, KernelTime, UserTime: TFileTime) используется для получения времени запуска (создания), времени завершения, времени работы потока в режиме ядра и пользователя. Поток задается описателем (Handle), время возвращается ОС в переменных типа TFileTime. Время отсчитывается в 100 наносекундных интервалах с 1.01.1601 по Гринвичу. Для представления времени старта и завершения в привычном формате используются функции
FileTimeToLocalFileTime(Tproc, LocalFileTime : TFileTime)
FileTimeToSystemTime(fTime : TFileTime ; SysT : TSystemTime)
Используя поля структуры TSystemTime, можно получить дату и время старта или завершения потока.
Для получения значений описателей процесса и потока в общем случае следует использовать функции OpenProcess() и OpenThread() – ее аргументы аналогичны. Необходимые значения идентификаторов процесса или потока получаются с помощью функций, рассмотренных в 1.1.1.1.
В частном случае, когда интерес представляет текущий процесс (поток), описатель процесса (потока) возвращается функциями GetCurrentProcess() и GetCurrentThread(). Эти функции не имеют аргументов.
1.1.4.2. Получение информации счетчиков ввода-вывода и количества описателей (дескрипторов)
Содержимое счетчиков ввода-вывода – количество прочитанных - записанных байт может быть получено функцией
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.