- •Введение
- •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.3. Создание приложения, работающего с виртуальной памятью
Создайте приложение, изображенное на рисунке 2.1. Данное приложение демонстрирует работу перечисленных выше функций. Для работы с виртуальной памятью.
Для создания приложения выполните следующие действия:
Создайте проект (New Application);
Перенесите на форму компоненты, перечисленные в таблице 2.10.
.
Таблица 2.10 Компоненты создаваемого приложения
Компонент |
Класс |
Описание |
Button1 |
TButton |
Кнопка «SysInfo». Страница Standard палитры компонентов. |
Button2 |
TButton |
Кнопка «GlobalMemoryStatus» |
Button3 |
TButton |
Кнопка «VirtualQuery» |
Button4 |
TButton |
Кнопка «VirtualAlloc» |
Button5 |
TButton |
Кнопка «VirtualFree» |
Button6 |
TButton |
Кнопка «VirtualProtect» |
Button7 |
TButton |
Кнопка «Выход» |
Label1 |
TLabel |
Текст «Введите адрес виртуальной памяти». Страница Standard палитры компонентов. |
Edit1 |
TEdit |
Окно ввода адреса виртуальной памяти. |
Memo1 |
TMemo |
Окно для вывода информации. |
В блоке VAR введите переменную p:
var
Form1: TForm1;
p:pointer;
implementation
…………………………………
Для события OnActivate формы Form1 запишите следующий программный код:
procedure TForm1.FormActivate(Sender: TObject);
begin
Memo1.Clear;
end;
Для события OnClick кнопки Button1 («SysInfo») запишите следующий программный код:
procedure TForm1.Button1Click(Sender: TObject);
VAR
// SysInf:TSystemInfo;
SysInf:SYSTEM_INFO;
begin
GetSystemInfo(SysInf);
Memo1.Clear;
memo1.Lines.Add('Размер страницы '+IntToStr(SysInf.dwPageSize)+' байт');
memo1.Lines.Add('Процессор '+IntToStr(SysInf.wProcessorArchitecture));
memo1.Lines.Add('Зарезервировано '+IntToStr(SysInf.wReserved));
memo1.Lines.Add('Количество процессоров '+IntToStr(SysInf.dwNumberOfProcessors));
memo1.Lines.Add('Маска активного процессора '+IntToStr(SysInf.dwActiveProcessorMask));
memo1.Lines.Add('Тип процессора '+IntToStr(SysInf.dwProcessorType));
memo1.Lines.Add('Гранулярность выделения ресурсов '+IntToStr(SysInf.dwAllocationGranularity));
memo1.Lines.Add(' '+IntToStr(SysInf.wProcessorLevel));
memo1.Lines.Add(' '+IntToStr(SysInf.wProcessorRevision));
end;
Для события OnClick кнопки Button2 («GlobalMemoryStatus») запишите следующий программный код:
procedure TForm1.Button2Click(Sender: TObject);
VAR //ms:MEMORYSTATUS;
ms:TMEMORYSTATUS;
begin
ms.dwLength:=sizeof(MEMORYSTATUS);
GlobalMemoryStatus(ms);
Memo1.Clear;
Memo1.Lines.Add('Загружено памяти '+IntToStr(ms.dwMemoryLoad)+' байт');
Memo1.Lines.Add('Всего физическая память '+IntToStr(ms.dwTotalPhys)+' байт');
Memo1.Lines.Add('Доступная физическая память '+IntToStr(ms.dwAvailPhys)+' байт');
Memo1.Lines.Add('Общий размер страничного файла '+IntToStr(ms.dwTotalPageFile)+' байт');
Memo1.Lines.Add('Доступный размер страничного файла '+IntToStr(ms.dwAvailPageFile)+' байт');
Memo1.Lines.Add('Общий размер виртуальной памяти '+IntToStr(ms.dwTotalVirtual)+' байт');
Memo1.Lines.Add('Доступный размер виртуальной памяти '+IntToStr(ms.dwAvailVirtual)+' байт');
end;
Для события OnClick кнопки Button3 («VirtualQuery») запишите следующий программный код:
procedure TForm1.Button3Click(Sender: TObject);
VAR //mbi:MEMORY_BASIC_INFORMATION;
mbi:TMemoryBasicInformation;
dwRez:DWORD;
begin
if Edit1.GetTextLen<=0
then ShowMessage('Введите виртуальный адрес')
else
begin
dwRez:=VirtualQuery(pointer(StrToInt(Edit1.Text)),mbi,sizeof(MEMORY_BASIC_INFORMATION));
Memo1.Clear;
Memo1.Lines.Add('Базовый адрес '+IntToStr(integer(mbi.BaseAddress)));
Memo1.Lines.Add('Адрес размещения'+IntToStr(integer(mbi.BaseAddress)));
case mbi.AllocationProtect of
0: Memo1.Lines.Add('ВАП зарезервировано');
PAGE_NOACCESS:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_NOACCESS');
PAGE_READONLY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READONLY');
PAGE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READWRITE');
PAGE_EXECUTE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE');
PAGE_EXECUTE_READ:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READ');
PAGE_EXECUTE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READWRITE');
PAGE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_WRITECOPY');
PAGE_EXECUTE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_WRITECOPY');
end;
Memo1.Lines.Add('Размер региона '+IntToStr(mbi.RegionSize)+' байт');
case mbi.State of
MEM_COMMIT: Memo1.Lines.Add('Состояние ВАП MEM_COMMIT');
MEM_RESERVE: Memo1.Lines.Add('Состояние ВАП MEM_RESERVE');
MEM_FREE: Memo1.Lines.Add('Состояние ВАП MEM_FREE');
end;
case mbi.Protect of
0: Memo1.Lines.Add('зарезервировано');
PAGE_NOACCESS:Memo1.Lines.Add('Атрибут защиты физ.памяти PAGE_NOACCESS');
PAGE_READONLY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READONLY');
PAGE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READWRITE');
PAGE_EXECUTE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE');
PAGE_EXECUTE_READ:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READ');
PAGE_EXECUTE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READWRITE');
PAGE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_WRITECOPY');
PAGE_EXECUTE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_WRITECOPY');
end;
end;
end;
Для события OnClick кнопки Button4 («VirtualAlloc») запишите следующий программный код:
procedure TForm1.Button4Click(Sender: TObject);
VAR ms:MEMORYSTATUS;
begin
If Edit1.GetTextLen=0
then p:=VirtualAlloc(nil,4096,MEM_COMMIT,PAGE_READWRITE)
else p:=VirtualAlloc(pointer(StrToInt64(Edit1.Text)),4096,MEM_COMMIT,PAGE_READWRITE);
Memo1.Clear;
ms.dwLength:=sizeof(MEMORYSTATUS);
GlobalMemoryStatus(ms);
Memo1.Clear;
Memo1.Lines.Add('Загружено памяти '+IntToStr(ms.dwMemoryLoad)+' байт');
Memo1.Lines.Add('Всего физическая память '+IntToStr(ms.dwTotalPhys)+' байт');
Memo1.Lines.Add('Доступная физическая память '+IntToStr(ms.dwAvailPhys)+' байт');
Memo1.Lines.Add('Общий размер страничного файла '+IntToStr(ms.dwTotalPageFile)+' байт');
Memo1.Lines.Add('Доступный размер страничного файла '+IntToStr(ms.dwAvailPageFile)+' байт');
Memo1.Lines.Add('Общий размер виртуальной памяти '+IntToStr(ms.dwTotalVirtual)+' байт');
Memo1.Lines.Add('Доступный размер виртуальной памяти '+IntToStr(ms.dwAvailVirtual)+' байт');
end;
Для события OnClick кнопки Button5 («VirtualFree») запишите следующий программный код:
procedure TForm1.Button5Click(Sender: TObject);
VAR
ms:MEMORYSTATUS;
begin
VirtualFree(p,4096,MEM_DECOMMIT);
VirtualFree(p,4096,MEM_RELEASE);
Memo1.Clear;
ms.dwLength:=sizeof(MEMORYSTATUS);
GlobalMemoryStatus(ms);
Memo1.Clear;
Memo1.Lines.Add('Загружено памяти '+IntToStr(ms.dwMemoryLoad)+' байт');
Memo1.Lines.Add('Всего физическая память '+IntToStr(ms.dwTotalPhys)+' байт');
Memo1.Lines.Add('Доступная физическая память '+IntToStr(ms.dwAvailPhys)+' байт');
Memo1.Lines.Add('Общий размер страничного файла '+IntToStr(ms.dwTotalPageFile)+' байт');
Memo1.Lines.Add('Доступный размер страничного файла '+IntToStr(ms.dwAvailPageFile)+' байт');
Memo1.Lines.Add('Общий размер виртуальной памяти '+IntToStr(ms.dwTotalVirtual)+' байт');
Memo1.Lines.Add('Доступный размер виртуальной памяти '+IntToStr(ms.dwAvailVirtual)+' байт');
end;
Для события OnClick кнопки Button7 («Выход») запишите следующий программный код:
procedure TForm1.Button6Click(Sender: TObject);
begin
Form1.Close;
end;
Откомпилируйте приложение и проверьте его работу.