- •Введение
- •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
1.2.2. Получение информации из реестра
Реестр играет ключевую роль в конфигурировании и управлении Windows. Это хранилище общесистемных и пользовательских параметров.
Реестр – это база данных, структура которой аналогична структуре логического диска. Он содержит разделы (keys), напоминающие дисковые каталоги и параметры (values), которые можно сравнить с файлами на диске. В параметрах хранятся данные. В лабораторной работе рассматривается объект TRegistry, содержащий методы для работы с реестром.
Для работы с реестром необходимо подключить модуль Registry следующим образом:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Registry;
Ниже рассматривается пример работы с реестром с помощью объекта TRegistry:
function GetRegistryValue(KeyName: string): string;
var
Registry: TRegistry;
Begin
// Создание объекта TRegistry, с помощью которого выполняется чтение из реестра
Registry := TRegistry.Create(KEY_READ);
Try
// Указывается требуемый раздел реестра
Registry.RootKey = HKEY_LOCAL_MACHINE;
// Открывается указанный раздел реестра
Registry.OpenKey(KeyName, False);
// Считывается содержимое открытого раздела
Result := Registry.ReadString('VALUE1');
Finally
// Объект TRegistry освобождается
Registry.Free;
end;
end;
1.2.3. Получение информации о системных каталогах Windows
Для получения информации о системных каталогах Windows используются две функции:
GetSystemDirectory – Получение имени системного каталога в котором содержатся системные библиотеки, драйверы и файлы шрифтов;
GetWindowsDirectory – Получение имени системного каталога, в котором содержатся файлы инициализации, файлы помощи и стандартные приложения Windows).
Данные функции имеют аналогичную структуру входных и выходных параметров. Рассмотрим работу данных функций на примере функции GetSystemDirectory:
function GetSystemDirectory(lpBuffer: PChar; uSize: DWORD): DWORD;
где
lpBuffer – указатель на выходной буфер, в который записывается информация о каталоге. Информация записывается в виде строки, заканчивающейся двоичным нулем.
uSize – переменная содержит размер буфера.
При успешном завершении функция GetSystemDirectory возвращает длину полученной строки в выходном буфере. В случае ошибки функция GetSystemDirectory возвращает 0.
1.2.4. Получение информации о диске
Для получения информации о диске используется функция GetVolumeInformation:
function GetVolumeInformation( lpRootPathName: PChar; lpVolumeNameBuffer: PChar;
nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD;
var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
lpFileSystemNameBuffer: PChar; nFileSystemNameSize: DWORD): Boolean; stdcall;
Назначение параметров данной функции приведено в таблице 1.3.
Таблица 1.3 Параметры функции GetVolumeInformation
Параметр |
Описание |
lpRootPathName |
имя диска, информацию о котором надо получить |
lpVolumeNameBuffer |
буфер, в который будет помещено имя тома диска |
nVolumeNameSize |
размер буфера для имени тома |
lpVolumeSerialNumber |
переменная, в которую будет записан серийный номер |
lpMaximumComponentLength |
переменная, в которую будет записано максимальное значение пути поддерживаемое файловой системой диска |
lpFileSystemFlags |
флаги файловой системы. Возможные значения флагов приведены в таблице 1.4. |
lpFileSystemNameBuffer |
буфер, в который будет помещено имя файловой системы |
nFileSystemNameSize |
размер буфера для имени файловой системы. |
Если функция GetVolumeInformation успешно выполнена, она возвращает ненулевое значение (true). Если произошла ошибка – возвращается 0 (false). Тогда информацию об ошибке можно получить, вызвав функцию GetLastError
Таблица 1.4 Возможные значения флагов в параметре lpFileSystemFlags функции GetVolumeInformation
Флаг |
Описание |
fs_case_is_preserved |
указывает на то, что файловая система сохраняет регистр имен файлов, когда сохраняет имя на диске |
fs__case_sensitive |
файловая система чувствительна к регистру имен файлов |
fs_unicode_stored_on_disk |
файловая система поддерживает имена в UNICODE |
fs_persistent_acls |
файловая система поддерживает списки доступа (например, NTFS) |
fs_file_compression |
файловая система поддерживает компрессию на уровне файлов |
fs_vol_is_compressed |
файловая система поддерживает компрессию на уровне тома (например, DoubleSpace тома диска) |