- •Введение
- •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
2.4. Задание для самостоятельной работы
Самостоятельно запрограммируйте событие OnClick для кнопки Button6 («VirtualProtect»).
Добавьте в приложение возможность вводить атрибут защиты страниц при программировании кнопки «VirtualProtect».
Добавьте в приложение возможность вводить количество выделяемых с помощью функции VirtualAlloc байт (или страниц)
Определите, какие регионы в виртуальном адресном пространстве свободны (найдите хотя бы несколько регионов).
Контрольные вопросы
Чему в настоящий момент равна гранулярность резервирования регионов адресного пространства для всех платформ Windows?
Каким образом при выделении виртуальной памяти указать, что операционная система может выделить память в любой свободной области виртуального адресного пространства?
Сколько байт виртуальной памяти будет выделено, если в функции VirtualAlloc в поле «Размер резервируемого региона в байтах» указать число 7000 байт?
Объясните алгоритм преобразования виртуального адреса в физический?
Можно ли изменить атрибуты защиты сразу нескольких страниц виртуальной памяти?
3. Лабораторная работа № 3
ИСПОЛЬЗОВАНИЕ ВИРТУАЛЬНОЙ ПАМЯТИ В ПРИЛОЖЕНИЯХ
3.1. Цель работы
Целью данной работы является:
Получение практического опыта работы с виртуальной памятью. Использование механизма работы с виртуальной памятью для решения конкретных прикладных задач;
Исследование адресного пространства процесса с помощью функций работы с виртуальной памятью.
3.2. Пример использования механизма выделения виртуальной памяти для решения конкретных задач
Рассмотрим механизм работы с виртуальной памятью на примере процедуры, выполняющей следующие действия:
выделение региона в виртуальном адресном пространстве процесса;
запись в регион результатов вычисления (в данном случае – вычисление суммы чисел от 1 до 10);
вывод на экран содержимого выделенного региона адресного пространства.
Процедура имеет следующий вид:
VAR
p,p1:^Integer;
i,s:Integer;
begin
S:=0;
p:=VirtualAlloc(nil,4096,MEM_COMMIT,PAGE_READWRITE);
//Сохранение начального адреса региона в переменной p1
p1:=p;
// Запись в регион результатов вычисления
For i:=1 to 10 do
begin
s:=s+i; p^:=s; Inc(p);
end;
// Восстановление начального адреса региона
p:=p1;
// Чтение содержимого виртуальной памяти и вывод на экран
S:=0;
For i:=1 to 10 do
begin
s:=p^;
memo1.Lines.Add(IntToStr(s)); Inc(p);
end;
end;
3.3. Задания для самостоятельной работы
С помощью функций VirtualAlloc, VirtualQuery и VirtualFree выполнить следующие задачи:
Вариант 1
Введите натуральное n и вычислите n!.
Введите диапазон адресов и выведите на экран информацию о состоянии регионов виртуального адресного пространства в данном диапазоне (свободен, зарезервирован или выделен).
Вариант 2
Введите натуральное n и вычислите:
Введите диапазон адресов и выведите на экран информацию о состоянии страниц виртуальной памяти в данном регионе (нет доступа, только чтение, чтение и запись).
Вариант 3
Введите действительное число а и натуральное число n. Вычислите: an.
Введите диапазон адресов и выведите на экран информацию о количестве регионов в данном диапазоне адресов.
Вариант 4
Введите действительное число а и натуральное число n. Вычислите:
a(a+1)…..(a+n-1)
Введите любой адрес и, если по этому адресу выделена физическая память, выведите на экран содержимое страницы, соответствующей введенному адресу.
Вариант 5
Введите действительное число а и натуральное число n. Вычислите:
a(a-n)(a-2n)…(a-n2)
Выведите на экран карту памяти данного процесса (информацию о каждом регионе в виртуальном адресном пространстве текущего процесса).
Вариант 6
Введите действительное число а и натуральное число n. Вычислите:
Подсчитайте количество страниц в виртуальном адресном пространстве вашего процесса, имеющих атрибут PAGE_READONLY.
Вариант 7
Введите действительное число x и натуральное число n. Вычислите:
Sin (x)+ Sin2 (x)+….+ Sinn (x)
Введите диапазон адресов и выведите на экран информацию о состоянии регионов виртуального адресного пространства в данном диапазоне (свободен, зарезервирован или выделен).
Вариант 8
Введите действительное число x и натуральное число n. Вычислите:
Sin (x)+ Sin (x2)+….+ Sin (xn)
Введите диапазон адресов и выведите на экран информацию о состоянии страниц виртуальной памяти в данном регионе (нет доступа, только чтение, чтение и запись).
Вариант 9
Вычислите значение функции y=4x3-2x2+5 для значений x, изменяющихся от -3 до 1 с шагом 0.1.
Введите диапазон адресов и выведите на экран информацию о количестве регионов в данном диапазоне адресов.
Вариант 10
Дано натуральное число n. Вычислить значения функции для x=1, 1.1, 1.2, …., 1+0.1*n
Введите любой адрес и выведите на экран и, если по этому адресу выделена физическая память, выведите на экран содержимое страницы, соответствующей введенному адресу.
Вариант 11
Вычислить значения функции для α, изменяющейся от 0.1 до 1 с шагом 0.1.
Введите любой адрес и, если по этому адресу выделена физическая память, выведите на экран содержимое первых ста байт, от начала страницы, соответствующей введенному адресу.
Вариант 12
Вычислить значения функции для α, изменяющейся от -1 до 1 с шагом 0.2.
Введите любой адрес и, если по этому адресу выделена физическая память, выведите на экран содержимое последних ста байт, от начала страницы, соответствующей введенному адресу.
Вариант 13
Вычислить значения функции для α, изменяющейся от -1 до 1 с шагом 0.2.
Введите диапазон адресов и выведите на экран информацию о состоянии страниц виртуальной памяти в данном регионе (нет доступа, только чтение, чтение и запись).
Вариант 14
Вычислить значения функции для x, изменяющегося от 5 до 7 с шагом 0.1.
Введите диапазон адресов и выведите на экран информацию о количестве регионов в данном диапазоне адресов и количестве страниц в каждом регионе.
Вариант 15
Вычислить значения функции для m, изменяющегося от 0 до 100 с шагом 2.
Подсчитайте количество страниц в виртуальном адресном пространстве вашего процесса, имеющих атрибут PAGE_READWRITE.
Вариант 16
Вычислить значения функции для a, изменяющегося от 0 до 10 с шагом 1.
Введите диапазон адресов и выведите на экран информацию о состоянии регионов виртуального адресного пространства в данном диапазоне (свободен, зарезервирован или выделен).
Вариант 17
Вычислить значения функции для a, изменяющегося от 0 до 10 с шагом 0.1.
Подсчитайте количество страниц в виртуальном адресном пространстве вашего процесса, имеющих атрибут PAGE_NOACCESS.
Вариант 18
Вычислить значения функции для m, изменяющегося от 1 до 10 с шагом 0.1.
Выведите на экран карту памяти данного процесса (информацию о каждом регионе в виртуальном адресном пространстве текущего процесса).
Вариант 19
Вычислить значения функции для β, изменяющегося от 0.1 до 0.9 с шагом 0.1.
Введите любой адрес и, если по этому адресу выделена физическая память, выведите на экран содержимое первых ста байт, от начала страницы, соответствующей введенному адресу в шестнадцатеричной форме.
Вариант 20
Вычислить значения функции для α, изменяющейся от 0 до 3 с шагом 0.2.
Введите любой адрес и, если по этому адресу выделена физическая память, выведите на экран содержимое страницы, соответствующей введенному адресу в десятичной форме.