- •Введение
- •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
Контрольные вопросы
Перечислите основные системные DLL ОС Windows.
Сравните явную и неявную загрузку DLL.
Что означают такие понятия, как «экспорт функции по имени» и «экспорт функции по номеру»?
Для каких целей в исполняемом файле служит таблица экспорта и таблица импорта?
В каких исполняемых файлах, как правило, отсутствует таблица экспорта.
9. ЛАБОРАТОРНАЯ РАБОТА № 9
ОТСЛЕЖИВАНИЕ ИЗМЕНЕНИЙ ФАЙЛОВОЙ СИСТЕМЫ
9.1. Цель работы
Целью данной работы изучение функций FindFirstChangeNotification и FindNextChangeNotification, с помощью которых можно отслеживать любые изменения файловой системы в выбранных каталогах. Выполнение данной работы предполагает, знание принципа работы Wait-функций, рассмотренных в лабораторной работе № 7.
9.2. Теоретическое введение
Многим программам необходимо узнавать об изменениях, происшедших в файловой системе. Например, стандартное Диалоговое окно File Open в Windows автоматически обновляет свое содержимое при любых изменениях в файловой системе.
Возможность динамического уведомления приложений об изменениях файловой системе требовалась столь часто, что в Windows введена прямая поддержка данной возможности.
9.2.1. Принцип работы системы уведомления об изменениях в файловой системе
Для получения информации об изменениях в файдовой системе необходимо выполнить следующие действия:
1. Сначала приложение вызовом FindFirstChangeNotification — сообщает системе о том, что оно заинтересовано в получении уведомлений.
Функция FindFirstChangeNotification никаких изменений не ищет, а просто создает объект «уведомление об изменении файла» и возвращает его дескриптор.
2. Получив дескриптор объекта «уведомление», можно использовать его в функциях WaitForSingleObject и WaitForMultipleObjects. Объект переходит в незанятое состояние всякий раз, когда в файловой системе происходит изменение, соответствующее критериям, указанным при вызове FindFirstChangeNotification.
Объект «уведомление об изменении файла» можно рассматривать как событие со сбросом вручную, в которое встроена дополнительная логика: событие переходит в незанятое состояние при каком-либо изменении в файловой системе. После возврата из WaitForSingleObject или WaitForMultipleObjects программа «понимает», что ей надо вновь просмотреть дерево каталогов и обновить информацию о файлах и каталогах.
Система накапливает информацию об изменениях и сообщает сразу обо всех. Например, если пользователь ввел команду: deltree чтобы удалить все файлы и подкаталоги в текущем каталоге, поток командного процессора успеет удалить как минимум несколько файлов, прежде чем система переведет объект «уведомление об изменении файла» в незанятое состояние и тем самым позволит программе, отслеживающей изменения, возобновить исполнение. Дескриптор этого объекта не переводится в свободное состояние при удалении каждого файла, что значительно повышает производительность системы.
3. Когда объект «уведомление об изменении файла» становится свободным. Программа, отслеживающая изменения, возобновляется и может выполнить любые нужные действия, закончив, она должен вызвать функцию FlndNextChangeNotification;
Эта функция сбрасывает объект-уведомление в занятое состояние. При просмотре дерева каталогов программа, выполняющая отслеживание изменений, может быть вытеснена потоком командного процессора, и тот продолжит изменение файлов и каталогов. Вызов FindNextChangeNotification позволит выяснить это обстоятельство, и, если с момента последнего перевода объекта-уведомления в незанятое состояние в файловой системе произошли новые изменения, объект-уведомление не сбрасывается в занятое состояние, оставаясь свободным.
Таким образом, если программа, отслеживающая изменения, снова ждет, когда объект станет незанятым, его ожидание немедленно прекращается, и он вновь «пройдет» по дереву каталогов. После каждого вызова FindNextChangeNotification следует обязательно ждать перевода объекта-уведомления в незанятое состояние. Иначе будут пропущены изменения в файловой системе.
4. Когда уведомления об изменениях файлов больше не нужны, следует закрыть объект-уведомление, вызвав: FindCloseChangeNotification.