
- •Введение
- •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.6.2. Вызов функции NtQuerySystemInformation
При получении информации класса 5 объем возвращаемых функцией данных велик – несколько десятков Кбайт и заранее не известен. Поэтому функция вызывается несколько раз, и при каждом новом вызове размер буфера под данные удваивается.
ListSize := $400; { Начальный размер буфера }
InfoClass := 5; // класс информации – сведения о процессах и потоках
GetMem(Result, ListSize);
rc := NtQuerySystemInformation (InfoClass, Result, ListSize, @ReturnLength);
while rc = STATUS_INFO_LENGTH_MISMATCH do
begin
FreeMem(Result);
ListSize := ListSize * 2;
GetMem(Result, ListSize);
rc := NtQuerySystemInformation(InfoClass, Result, ListSize, @ReturnLength);
end;
if rc <> STATUS_SUCCESS then
begin
FreeMem(Result);
Result := nil;
end;
Описание данных, используемых в приведенном фрагменте.
const
STATUS_INFO_LENGTH_MISMATCH = NTSTATUS($C0000004);
STATUS_SUCCESS = NTSTATUS($00000000);
var
ListSize : Integer; Result : pointer;
rc : NTSTATUS; InfoClass : LongInt;
ReturnLength : Integer;
При запросе данных других классов объем данных может быть известен заранее и процедура вызова функции упрощается.
1.1.6.3. Получение сведений о процессах и потоках
При просмотре полученных данных следует руководствоваться рис.1 и методикой работы с указателями в языке Паскаль и материалами курса ООП. Для увеличения значения указателя на величину NextEntryDelta рекомендуется привести указатель к типу Cardinal.
1.1.6.4. Преобразование данных из формата FileTime в формат SystemTime
Значения параметров типа Время возвращаются функцией NtQuerySystemInformation в формате LARGE_INTEGER – 64 битовое значение. Данное значение необходимо привести к типу FILETIME, например FileTime (переменная типа LARGE_INTEGER).
Далее полученное значение (исходное) с помощью процедуры FileTimeToLocalFileTime (Исходное, Результат) преобразовать во время текущего часового пояса. Полученный результат процедурой FileTimeToSystemTime (Результат, Время_В_формате SystemTime) преобразовать в формат SystemTime – это структура с полями год, месяц, день, час, минута и т.д.
1.1.6.5. Вычисление загрузки процессора
Суммарная загрузка процессора определяется за время 1 Сек (по тикам таймера). Необходимо найти отношение r приращения величины времени простоя процессора за время 1 сек к приращению текущего времени CurrentTime – класс 3. Загрузка ЦП в % за последнюю секунду равна (1-r)*100
1.1.7 Формирование протокола использования процессора
Протокол использования процессора должен содержать имя процесса, дату и время старта (запуска) процесса и время завершения прикладного процесса.
Для получения сведений о дате и времени используется процедура
GetProcessTimes (Hp: Thandle; var Ts, Tf, Tk, Tu: TFileTime);
Hp – описатель процесса, значение описателя возвращается функцией OpenProcess(), см. п.4.2;
Ts, Tf, Tk, Tu – возвращаемые функцией значения, соответственно время старта, время завершения процесса, время работы процессора в режиме ядра и время работы процессора в режиме пользователя.
Так как время старта и время завершения представлены по Гринвичу, значения Ts и Tf сначала необходимо преобразовать в значения, соответствующие текущему часовому поясу. Для преобразования используется процедура
FileTimeToLocalFileTime (Tгринв, Tлокал : TFileTime);
Затем полученное значение преобразуется из формата TFileTime в формат TSystemTime с помощью функции FileTimeToSysTemTime (Tft: TFileTime, TSystemTime).
Структура состоит из полей, представляющих год, месяц, день, час, минуту, секунду и миллисекунду в формате Word. Содержимое каждого поля преобразуется в текст с помощью функции IntToStr() и может быть выведено в текстовый файл или на экран.