- •Введение
- •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
4.2.4 Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память»
Для освобождения региона адресного пространства, содержащего спроецированный файл необходимо вызвать следующую фунцию:
function UnmapViewOfFile(lpBaseAddress: Pointer): Boolean;
где lpBaseAddress – базовый адрес освобождаемого региона, который должен совпадать со значением, полученным после вызова функции MapViewOfFile.
4.2.5 Закрытие объектов ядра «файл, проецируемый в память» и «файл»
Для закрытия объектов ядра «файл, проецируемый в память» и «файл» дважды вызывается функция:
function CloseHandle(hObject: THandle): Boolean;
где hObject – дескриптор объекта.
Объекты ядра следует закрывать, после того, как работа с ними закончена, так как операционная система хранит информацию обо всех объектах ядра, используя для этих целей свои ресурсы. Следовательно, во избежание утечки ресурсов, неиспользуемые объекты ядра должны быть закрыты.
4.3 Примеры программ, выполняющих проецирование в память
4.3.1 Пример 1
Приведенная программа с помощью механизма проецирования в память добавляет строку к существующему файлу.
VAR
hFile,hFileMap:THandle; pFile,Str:PChar; Size:Integer;
begin
Str:='Работа с файлами, проецируемыми в память'+#0;
hFile:=CreateFile('C:\file1.txt',GENERIC_READ OR GENERIC_WRITE,
FILE_SHARE_READ OR FILE_SHARE_WRITE, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
If hFile=INVALID_HANDLE_VALUE then
begin
ShowMessageFmt('Ошибка %d при открытии файла ',[GetLastError]); exit;
end;
Size:=GetFileSize(hFile,nil)+StrBufSize(Str)+1;
hFileMap:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,Size,nil);
If hFileMap=INVALID_HANDLE_VALUE then
begin
ShowMessageFmt('Ошибка %d при создании объекта "файл, проецируемый в память"', [GetlastError]);
CloseHandle(hFile); exit;
end;
pFile:=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0);
If pFile=nil then
begin
ShowMessageFmt('Ошибка %d при проецировании в память', [GetlastError]);
CloseHandle(hFile); CloseHandle(hFileMap); exit;
end;
pFile[GetFileSize(hFile,nil)]:=#0;
//Добавление строки Str в конец файла, проецируемого в память
Strcat(pFile,Str); UnMapViewOfFile(pFile); CloseHandle(hFile); CloseHandle(hFileMap);
end;
4.3.2 Пример 2
Данная программа перед каждым словом вставляет три восклицательных знака.
VAR
hFile,hFileMap:THandle; pFile:PChar; Size,Size1,i,j,q:Integer;
begin
hFile:=CreateFile('file1.txt',GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
If hFile=INVALID_HANDLE_VALUE then
begin
ShowMessageFmt('Ошибка %d при открытии файла ',[GetLastError]);
exit;
end;
Size1:=GetFileSize(hFile,nil);
// Размер файла увеличивается на 30 байт (считаем, что этого будет достаточно при вставке новых символов)
Size:=GetFileSize(hFile,nil)+30;
hFileMap:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,Size,nil);
If hFileMap=INVALID_HANDLE_VALUE then
begin
ShowMessageFmt('Ошибка %d при создании объекта "файл, проецируемый в память"',[GetlastError]);
CloseHandle(hFile); exit;
end;
pFile:=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0);
If pFile=nil then
begin
ShowMessageFmt('Ошибка %d при проецировании в память',[GetlastError]);
CloseHandle(hFile); CloseHandle(hFileMap); exit;
end;
For i:=Size1 to Size1+30 do pFile[i]:=' ';
//Поиск слов
i:=0;
While i<Size1 do
begin
If ((i=0) and (pFile[0]<>' ')) or((pFile[i]<>' ') and (pFile[i-1]=' ')) then
begin
For q:=1 to 3 do
begin
For j:=Size1+1 Downto i+1 do pFile[j]:=pFile[j-1]; Size1:=Size1+1;
end;
pFile[i]:='!'; pFile[i+1]:='!'; pFile[i+2]:='!'; i:=i+4;
end
else i:=i+1;
end;
UnMapViewOfFile(pFile); CloseHandle(hFile); CloseHandle(hFileMap);
end;