![](/user_photo/2706_HbeT2.jpg)
- •Введение
- •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
9.2.2. Функции для работы с объектом «уведомление об изменении файловой системы»
Для создания объекта «уведомление об изменении файловой системы» применяется функция FindFirstChangeNotification:
function FindFirstChangeNotification(lpPathName: PChar;
bWatchSubtree: BOOL; dwNotifyFilter: DWORD): THandle;
где lpPathName – указывает стартовый каталог. Можно указать как корневой каталог диска, так и любой подкаталог. Указав подкаталог, приложение уже не получит уведомлений о событиях, происшедших в «вышестоящих» каталогах. Для наблюдения за деревьями каталогов, расположенных на разных дисках, надо сделать несколько вызовов FindFirstChangeNotification — по одному на каждый исследуемый диск.
bWatchSubtree – сообщает системе, нужно ли наблюдать и за подкаталогами, входящими в каталог lpPathName. Если он равен FALSE, то посылаются уведомления лишь о событиях, происшедших непосредственно в указанном каталоге.
dwNotifyFilter: – указывает тип интересующих изменений и представляет собой набор флагов, комбинируемых побитовой операцией OR. Возможные значения параметра fdwFilter приведены в таблице 9. 1.
Таблица 9.1 Возможные значения апраметра dwNotifyFilter:
Флаг |
Описание |
FILE_NOTIFY_CHANGE_FILE_NAME |
Создание, переименование или удаление файла |
FILE_NOTIFY_CHANGE_DIR_NAME |
Создание, переименование или удаление каталога. |
FILE_NOTIFY_CHANGE_ATTRIBUTES |
Изменение атрибута файла |
FILE_NOTIFY_CHANGE_SIZE |
Изменение размера файла. |
FILE_NOTIFY_CHANGE_LAST_WRITE |
Изменение времени последней записи в файл |
FILE_NOTIFY_CHANGE_SECURITY |
Изменение дескриптора защиты (security descriptor) файла или каталога. |
Система часто прибегает к буферизации изменений в файле, пример, размер файла не изменяется до тех пор, пока информация из буфера не переписана на диск. Уведомление об изменении размера файла отправляет только после фактической записи данных на диск, а не после их модификации программой.
При успешном завершении FindFirstChangeNotification возвращает дескриптор, который программа может использовать при вызове таких синхронизирующих функций, как WaitForSingleObject или WaitForMultipleObjects. Если FindFirstChangeNotification передан неверный параметр (например, путь к исследуемому каталогу), функция возвращает INVALID_HANDLE_VALUE.
Для перевода объекта «уведомление об изменении файловой системы» применяется функция FindNextChangeNotification:
function FindNextChangeNotification(hChangeHandle: THandle): BOOL;
где hChangeHandle – дескриптор объекта «уведомление об изменении файловой системы», созданного функцией FindFirstChangeNotification. При успешном выполнении функция FindNextChangeNotification возвращает значение TRUE.
Для закрытия объекта «уведомление об изменении файловой системы» применяется функция FindCloseChangeNotification:
function FindCloseChangeNotification(hChangeHandle: THandle): BOOL;
где hChangeHandle – дескриптор объекта «уведомление об изменении файловой системы», созданного функцией FindFirstChangeNotification. При успешном выполнении функция FindCloseChangeNotification возвращает значение TRUE.
Для просмотра файлов и каталогов используются функции FindFirst и FindNext.
Функция FindFirst выделяет в памяти необходимые ресурсы для поиска файлов в каталоге и имеет вид:
function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
где Path – определяет шаблон поиска. Например, если параметр Path равен '.\test\*.*', то будет осуществляться поиск всех файлов в каталоге test.
Attr – определяет атрибуты файлов, для которых производится поиск. Возможные значения атрибутов приведены в таблице 9.2. Атрибуты можно комбинировать с помощью операции логического «ИЛИ» («or»).
F – структура TSearchRec, в которую при успешном выполнении функции заносятся результаты поиска. Структура TSearchRec имеет вид:
TSearchRec = record
Time: Integer; // Время последнего изменения файла
Size: Integer; //Размер файла
Attr: Integer; //Атрибуты файла
Name: TFileName; //Имя и расширение файла
ExcludeAttr: Integer;
FindHandle: THandle; // Дескриптор файла
FindData: TWin32FindData; //Дополнительная информация.
end;
Таблица 9.2 Возможные значения атрибутов в поле Attr
Атрибут |
Описание |
faReadOnly |
Файл только для чтения |
faHidden |
Скрытый файл |
faSysFile |
Системный файл |
faVolumeID |
Идентификатор диска |
faDirectory |
Каталог |
faArchive |
Архивный файл |
faAnyFile |
Любой файл |
Функция FindNext имеет вид:
function FindNext(var F: TSearchRec): Integer;
Данная функция продолжает поиск, начатый функцией FindFirst. Если нашелся новый файл, функция FindNext возвращает 0, в противном случае – код ошибки Windows. Результаты поиска заносятся в запись TSearchRec.