
- •Введение
- •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
Контрольные вопросы
Какие объекты ядра можно использовать как объекты синхронизации?
Когда объект ядра «процесс» находится в свободном, а когда в занятом состоянии?
Как потоки различных процессов могут использовать один и тот же объект семафор, мьютекс или событие для синхронизации?
Чем объект мьютекс отличается от других объектов синхронизации?
Чем объект семафор отличается от других объектов синхронизации?
В каких случаях следует использовать события со сбросом вручную, а в каких события с автосбросом?
8. Лабораторная работа № 8
СОЗДАНИЕ ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫХ БИБЛИОТЕК
8.1. Цель работы
Целью данной работы является разработка динамически подключаемых библиотек (Dynamic-Link Libraries- DLL). В данной лабораторной работе рассматриваются следующие вопросы:
Методы загрузки DLL (явная и неявная загрузки);
Методы внедрения DLL в адресное пространство другого процесса.
8.2 Теоретическое введение
Динамически подключаемые библиотеки используются для хранилища отдельных процедур. Множество процедур, обычно с похожей функциональной направленностью содержится в DLL, как отдельные процедуры, а не как часть одной большой конструкции. DLL являются краеугольным камнем ОС Windows, начиная с самой первой ее версии. Четыре самые важные DLL ОС Windows:
Kernel32.dll – управление памятью, процессами и потоками;
User32.dll – поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений;
GDI32.dll – графика и вывод текста;
AdvAPI32.dll –функции для защиты объектов, работы с реестром и регистрации событий.
Библиотеки DLL функционируют в адресном пространстве приложения, загрузившего их, разделяя единую копию кода со всеми другими приложениями, использующими данную DLL. Приложения используют неявную (статическую) и явную (динамическую) загрузку DLL.
При неявной загрузке, в объявлении процедуры из внешней DLL включено ключевое слово external и имя DLL. В этом случае приложение пытается загрузить DLL до того, как будет вызван метод Application.Initialize, то есть до того, как приложение начнет выполняться.
При явной загрузке DLL, она будет загружаться в адресное пространство процесса в тот момент, когда будет вызван метод LoadLibrary.
Явная загрузка DLL требует от программиста большей аккуратности, но при этом сокращается время запуска приложения. Неявная загрузка DLL проще, так как при этом ОС Windows выполняет большую часть работы.
8.2.1 Создание dll
Рассмотрим создание DLL на следующем примере:
Требуется создать динамически загружаемую библиотеку mess.dll, которая содержит:
процедуру HelloFromLib. Данная процедура выводит на экран число, переданное из приложения.
функцию fy=xn. Причем, x и n передаются как параметры.
Для создания DLL необходимо выполнить следующие действия:
В главном меню DELPHI последовательно выбираем пункты меню File|New|Other и в раскрывшемся диалоговом окне выбираем пункт для проекта “DLL Wizard”.
На экране появляется исходный код файла с расширением .DPR. Наберите следующий код:
library mess;
uses
SysUtils,
Classes,
Dialogs;
{$R *.res}
Procedure HelloFromLib(k:Integer);
begin
ShowMessage('Вы передали число - '+IntToStr(k));
end;
function fy(x:Real;n:Integer):Real;
Var i:Integer;
y:Real;
begin
y:=1;
For i:=1 to n do
y:=y*x;
fy:=y;
end;
exports HelloFromLib,fy;
begin
end.
Примечание:
в раздел uses добавлен модуль Dialogs, в котором содержится процедура ShowMessage
В разделе export указан список экспортируемых процедур