- •Введение
- •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.3. Создание приложения для получения характеристик компьютера и операционной системы
Создайте проект (New Application), изображенный на рисунке 1.1
Перенесите на форму компоненты, перечисленные в таблице 1.5.
Для события формы OnCreate запишите следующий программный код:
procedure TForm1.FormCreate(Sender: TObject);
VAR
v:TOSVERSIONINFO;
reg:TRegistry;
a:Array[0..255] of Char;
begin
Edit1.Text:='C:\';
// Информация об операционной системе
v.dwOSVersionInfoSize:=Sizeof(OSVERSIONINFO);
GetVersionEx(v);
Edit6.Text:=IntToStr(v.dwMajorVersion)+'.'+IntToStr(v.dwMinorVersion);
Edit7.Text:=IntToStr(v.dwBuildNumber);
Edit8.Text:=v.szCSDVersion;
case v.dwPlatformId of
VER_PLATFORM_WIN32s: Edit9.Text:='Win32s on Windows 3.1.';
VER_PLATFORM_WIN32_WINDOWS: Edit9.Text:='Win32 on Windows 95.';
VER_PLATFORM_WIN32_NT: Edit9.Text:='Win32 on Windows NT.';
end;
// Определение, из какого каталога инсталлировалась Windows
reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Setup',false);
Edit10.Text:=reg.ReadString('SourcePath');
reg.CloseKey;
reg.Free;
// Системные каталоги
GetSystemDirectory(@a,Sizeof(a));
Edit11.Text:=a;
GetWindowsDirectory(@a,Sizeof(a));
Edit12.Text:=a;
end;
Таблица 1.5 Компоненты создаваемого приложения
Компонент |
Класс |
Описание |
1 |
2 |
3 |
GroupBox1 |
GroupBox |
Информация о диске |
GroupBox2 |
GroupBox |
Тактовая частота процессора |
GroupBox3 |
GroupBox |
Операционная система |
Label1 |
Label |
Введите имя диска |
Label2 |
Label |
Серийный номер |
Label3 |
Label |
Имя тома |
Label4 |
Label |
Максимальное количество символов в именах файлов и каталогов |
Edit1 |
Edit |
Окно ввода имени диска |
Edit2 |
Edit |
Окно выводи серийного номера диска |
Edit3 |
Edit |
Окно вывода имени тома |
Edit4 |
Edit |
Окно вывода максимального количества символов в именах файлов и каталогов |
Button1 |
TButton |
Кнопка «Получить». |
Edit5 |
Edit |
Окно вывода тактовой частоты процессора |
Button2 |
TButton |
Кнопка «Определить» |
Label5 |
Label |
Версия ОС |
Label6 |
Label |
Номер ОС |
Label7 |
Label |
Service Pack |
Label8 |
Label |
Платформа |
Продолжение таблицы 1.5
1 |
2 |
3 |
Label9 |
Label |
Windows инсталл. из каталога |
Label10 |
Label |
Системный каталог Windows |
Label11 |
Label |
Каталог Windows |
Edit6 |
Edit |
Окно вывода версии ОС |
Edit7 |
Edit |
Окно вывода номера ОС |
Edit8 |
Edit |
Окно вывода версии Service Pack |
Edit9 |
Edit |
Окно вывода платформы ОС |
Edit10 |
Edit |
Окно вывода каталога, из которого инсталлировалась ОС Windows |
Edit11 |
Edit |
Окно вывода системного каталога (каталога, в котором содержатся системные библиотеки, драйверы и файлы шрифтов) |
Edit12 |
Edit |
Окно вывода каталога Windows (каталога, в котором содержатся файлы инициализации, файлы помощи и стандартные приложения Windows) |
Для события формы OnClick кнопки «Получить» запишите следующий программный код:
procedure TForm1.Button1Click(Sender: TObject);
VAR
SerialNum:DWORD;
a,b:DWORD;
Buffer,disk :Array[0..255]of char;
begin
StrPCopy(@disk,Edit1.text);
if GetVolumeInformation(@disk,Buffer,sizeof(Buffer),@SerialNum,a,b,nil,0) then
begin
Edit2.Text:=IntToStr(SerialNum);
Edit3.Text:=Buffer;
Edit4.Text:=IntToStr(a);
end;
end;
Для получения тактовой частоты процессора включите в проект следующую функцию:
function GetCPUSpeed: Double;
const
DelayTime = 500;
var
TimerHi: DWORD;
TimerLo: DWORD;
PriorityClass: Integer;
Priority: Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
DW 310Fh // rdtsc
MOV TimerLo, EAX
MOV TimerHi, EDX
end;
Sleep(DelayTime);
asm
DW 310Fh // rdtsc
SUB EAX, TimerLo
SBB EDX, TimerHi
MOV TimerLo, EAX
MOV TimerHi, EDX
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result:=TimerLo/(1000.0 * DelayTime);
end;
Для события формы OnClick кнопки «Определить» запишите следующий программный код:
procedure TForm1.Button2Click(Sender: TObject);
begin
// Получение тактовой частоты процессора
Edit5.Text:=Format('CPU Speed: %f MHz',[GetCpuSpeed]);
end;
Откомпилируйте приложение и проверьте его работу.