
- •Введение
- •1. Лабораторная работа № 1
- •1.1. Цель работы
- •1.2. Теоретическое введение
- •1.2.1. Получение информации об операционной системе
- •1.2.2. Получение информации из реестра
- •1.2.3. Получение информации о системных каталогах Windows
- •1.2.4. Получение информации о диске
- •1.3. Создание приложения для получения характеристик компьютера и операционной системы
- •Контрольные вопросы
- •2. Лабораторная работа №2
- •2.1.Цель работы
- •2.2. Теоретическое введение
- •2.2.1. Процедуры и функции для работы с виртуальной памятью
- •2.3. Создание приложения, работающего с виртуальной памятью
- •2.4. Задание для самостоятельной работы
- •Контрольные вопросы
- •3. Лабораторная работа № 3
- •3.1. Цель работы
- •3.2. Пример использования механизма выделения виртуальной памяти для решения конкретных задач
- •3.3. Задания для самостоятельной работы
- •Контрольные вопросы
- •4. Лабораторная работа № 4
- •4.1. Цель работы
- •4. 2. Теоретическое введение
- •4.2.1 Создание или открытие объекта ядра «файла»
- •4.2.2 Создание объекта ядра «файл, проецируемый в память»
- •4.2.3 Проецирование файловых данных на адресное пространство процесса
- •4.2.4 Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память»
- •4.2.5 Закрытие объектов ядра «файл, проецируемый в память» и «файл»
- •4.3 Примеры программ, выполняющих проецирование в память
- •4.3.1 Пример 1
- •4.3.2 Пример 2
- •4.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •5. Лабораторная работа № 5
- •5.1.Цель работы
- •5.2. Теоретическое введение
- •5.2.1. Создание процесса
- •5.2.2. Запуск внешней программы функцией WinExec
- •5.2.3. Запуск внешней программы и открытие документа функцией ShellExecute
- •При успешном выполнении функция ShellExecute возвращает целое значение, большее 32. Значение меньшее или равное 32 указывает на ошибку. Значения эти те же, что и для функции WinExec.
- •5.2.4. Создание потока
- •5.2.5. Завершение процесса
- •5.2.6. Завершение потока
- •5.2.7. Изменение класса приоритета процесса
- •5.2.8. Получение информации о классе приоритета процесса
- •5.2.9. Изменение уровня приоритета потока
- •5.2.10. Получение информации о приоритете потока
- •5.3. Примеры программ для работы с процессами и потоками
- •5.3.1. Создание процесса с помощью функции CreateProcess.
- •5.3.2. Создание процесса с помощью функции WinExec.
- •5.3.3. Создание процесса с помощью функции ShellExecute.
- •5.3.4. Создание многопоточного приложения.
- •5.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •6. Лабораторная работа № 6
- •6.1. Цель работы
- •6.2. Теоретическое введение
- •6.2.1. Получение «мгновенного снимка» системы
- •6.2.2. Получение информации о процессах
- •6.2.3. Получение информации о потоках
- •6.2.4. Получение информации о модулях
- •6.2.5. Информация о кучах (heap)
- •6.2.6. Информация о виртуальной памяти.
- •6.2.7. Алгоритм работы функций ToolHelp
- •6.2.8. Как получить карту памяти любого процесса
- •6.3. Пример использования функций ToolHelp
- •6.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •7. Лабораторная работа № 7
- •7.1. Цель работы
- •7.2. Теоретическое введение
- •7.2.1. Критические секции
- •7.2.2. Синхронизация с использованием объектов ядра
- •7.2.3. Wait-функции
- •7.2.4. Синхронизация с использованием процессов и потоков
- •7.2.5. Объекты Mutex
- •7.2.6. Семафоры
- •7.2.7. События
- •7.3 Примеры работы с объектами синхронизации
- •7.3.1 Пример 1
- •7.3.1 Пример 2
- •7.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •8. Лабораторная работа № 8
- •8.1. Цель работы
- •8.2 Теоретическое введение
- •8.2.1 Создание dll
- •8.2.2 Неявная загрузка dll
- •8.2.3 Явная загрузка dll
- •8.2.4 Внедрение dll в адресное пространство другого процесса
- •8.3 Пример работы с dll
- •8.3.1 Создание dll, которая выполняет перехват нажатых клавиш
- •8.3.2 Разработка приложения, которое выполняет анализ и обработку нажатых клавиш.
- •8.4 Индивидуальные задания
- •Контрольные вопросы
- •9.2.2. Функции для работы с объектом «уведомление об изменении файловой системы»
- •9.3. Пример работы системы уведомления об изменениях в файловой системе
- •9.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •Литература
- •214013 Г. Смоленск, Энергетический проезд, 1
Контрольные вопросы
Сравните возможности функций CreateProcess? WinExec и ShellExecute
В чем заключается различие между процедурой ExitProcess и функцией TerminateProcess?
Почему ExitProcess и ExitThread реализованы как процедуры, TerminateProcess и TerminateThread – как функции?
Как установит приоритет текущего процесса равным 31?
Как установит приоритет текущего процесса равным 1?
Величина кванта потока - 6 квантовых единиц. Компьютер имеет несколько процессоров. Определите величину кванта в миллисекундах.
Величина кванта потока - 18 квантовых единиц. Компьютер имеет один процессор. Определите величину кванта в миллисекундах.
Вы начали длительный пересчет электронной таблицы и переключились на приложение, активно использующее процессор (например, игра типа “action”). Что сделает ОС для эффективного использования процессорного времени – увеличит приоритет активного процесса (игры) или увеличит квант времени активного процесса. Ответ обоснуйте.
Поток ожидал завершения операции ввода-вывода. Текущий приоритет потока – 12. По завершении операции ввода-вывода приоритет потока должен быть увеличен на 4 уровня. Каким будет приоритет потока после завершения операции ввода-вывода?
6. Лабораторная работа № 6
РАБОТА С ФУНКЦИЯМИ TOOLHELP
6.1. Цель работы
Целью работы является получение навыков работы с функциями библиотеки ToolHelp API для получения системной информации. В данной работе рассматриваются следующие вопросы:
Получение списка всех процессов в системе;
Получение списка всех модулей в системе;
Получение списка всех потоков выбранного процесса;
Получение карты памяти выбранного процесса.
6.2. Теоретическое введение
При разработке программного обеспечения часто возникает задача получения системной информации, например, списка всех загруженных процессов или списка созданных потоков. В Windows первоначально отсутствовали средства для получения данной информации. Однако, начиная с Windows 95, в состав операционной системы включен набор функций, позволяющих получать системную информацию. Данные функции включены в ToolHelp API. В Delphi функции ToolHelp API описаны в файле TlHelp32.pas.
Функции ToolHelp можно условно разбить на следующие функциональные группы:
Получение «мгновенного снимка» системы;
Информация о процессах;
Информация о потоках;
Информация о кучах (heap);
Информация о виртуальной памяти;
Информация о модулях.
6.2.1. Получение «мгновенного снимка» системы
Для получения «мгновенного снимка системы» применяется функция CreateToolhelp32SnapShot. Необходимость в моментальном снимке связана с реализованном в Windows механизме вытесняющей многозадачности. Например, поток 1, просматривающий список процессов, вытеснен более приоритетным потоком 2, который, в свою очередь, изменяет просматриваемую цепочку процессов, что приведет к сбою системы при передаче управления потоку 1. Для предотвращения этой и аналогичных проблем функции ToolHelp используют концепцию «моментального снимка», то есть сохранения информации о текущем состоянии ОС;
Описание функции CreateToolhelp32SnapShot выглядит следующим образом:
function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle;
где
dwFlags - флаги, определяющие, какая системная информация включается в «мгновенный список системы». Допустимые значения параметра dwFlags приведены в таблице 6.1.
th32ProcessID – идентификатор процесса. Если этот параметр равен 0, то «мгновенный снимок» делается для системной информации текущего процесса. Этот параметр учитывается только в случае, если параметр dwFlags принимает значение TH32CS_SNAPHEAPLIST или TH32CS_SNAPMODULE
Функция CreateToolhelp32SnapShot при успешном завершении возвращает дескриптор «мгновенного снимка». В случае ошибки – выходной параметр равен - FALSE. Для закрытия дескриптора следует выполнить функцию – CloseHandle.
Таблица 6.1 Возможные значения параметра dwFlags
Значение параметра dwFlags |
Описание |
TH32CS_INHERIT |
Указывает, что снимок является наследуемым |
TH32CS_SNAPALL |
Эквивалентно одновременной установке значений TH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE, TH32CS_SNAPPROCESS и TH32CS_SNAPTHREAD |
TH32CS_SNAPHEAPLIST |
Указывает, что будет сделан «мгновенный снимок» списка куч процесса, выбранного с помощью параметра th32ProcessID. |
TH32CS_SNAPMODULE |
Указывает, что будет сделан «мгновенный снимок» списка модулей процесса, выбранного с помощью параметра th32ProcessID. |
TH32CS_SNAPPROCESS |
Указывает, что будет сделан «мгновенный снимок» всех процессов |
TH32CS_SNAPTHREAD |
Указывает, что будет сделан «мгновенный снимок» всех потоков |