Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС СФМЭИ.doc
Скачиваний:
22
Добавлен:
17.09.2019
Размер:
1.37 Mб
Скачать

4.2.2 Создание объекта ядра «файл, проецируемый в память»

Для создания объекта ядра «файл, проецируемый в память» используется функция:

function CreateFileMapping( hFile: THandle;

lpFileMappingAttributes: PSecurityAttributes; flProtect: DWORD; dwMaximumSizeHigh: DWORD; dwMaximumSizeLow: DWORD;

lpName: PChar): THandle;

где

hFile – дескриптор файла, полученный после вызова функции CreateFile.

lpFileMappingAttributes - указывает на структуру SECURITY_ATTRIBUTES, которая содержит информацию о защите объекта ядра «файл, проецируемый в память».Если защиты не нужно, в этот параметр заносится nil.

flProtect – определяет атрибуты защиты, присваиваемые страницам физической памяти. Возможные значения параметра flProtect приведены в таблице 4.5.

dwMaximumSizeHigh

dwMaximumSizeLow – указывают максимальный размер файла в байтах. Так как Windows позволяет работать с файлами, размеры которых выражаются 64-разрядными числами, параметр dwMaximumSizeHigh указывает старшие 32-бита, а параметр dwMaximumSizeLow – младшие 32 бита этого значения. Для файлов, размер которых меньше 4 Гб, параметр dwMaximumSizeHigh всегда равен 0.

Таблица 4.5 Возможные значения параметра flProtect

Значение параметра

flProtect

Описание

PAGE_READONLY

Отобразив объект «файл, проецируемый в память» на адресное пространство процесса, можно считывать данные из файла. При этом функция CreateFile должна вызываться с флагом GENERIC_READ

PAGE_READWRITE

Отобразив объект «файл, проецируемый в память» на адресное пространство процесса, можно считывать данные из файла и записывать их. При этом функция CreateFile должна вызываться с комбинацией флагов GENERIC_READ or GENERIC_WRITE

PAGE_WRITECOPY

Отобразив объект «файл, проецируемый в память» на адресное пространство процесса, можно считывать данные из файла и записывать их. Запись приведет к созданию закрытой копии страницы. При этом функция CreateFile должна вызываться либо с флагом GENERIC_READ, либо с комбинацией флагов GENERIC_READ or GENERIC_WRITE

lpName – строка с нулевым байтом в конце. В ней указывается имя объекта «файл, проецируемый в память», которое используется для доступа к данному объекту из другого процесса. Если в программе не предполагается доступ из другого процесса к объекту «файл, проецируемый в память» в данном параметре передается nil.

4.2.3 Проецирование файловых данных на адресное пространство процесса

Проецирование файловых данных на адресное пространство процесса выполняет следующая функция:

function MapViewOfFile( hFileMappingObject: THandle; dwDesiredAccess: DWORD; dwFileOffsetHigh: DWORD; dwFileOffsetLow: DWORD; dwNumberOfBytesToMap: DWORD): Pointer;

Где

hFileMappingObject – дескриптор объекта «файл, проецируемый в память», возвращаемый функцией CreateFileMapping или OpenFileMapping.

dwDesiredAccess – определяет вид доступа к данным. Возможные значения параметра dwDesiredAccess приведены в таблице 4.6.

Таблица 4.6 Возможные значения параметра dwDesiredAccess

Значение параметра

dwDesiredAccess

Описание

FILE_MAP_READ

Файловые данные можно только считывать. Функция CreateFileMapping может быть предварительно вызвана с любым атрибутом защиты.

FILE_MAP_WRITE

или

FILE_MAP_ALL_ACCESS

Файловые данные можно считывать и записывать. Функция CreateFileMapping предварительно должна быть вызвана с атрибутом защиты PAGE_READWRITE.

FILE_MAP_COPY

Файловые данные можно считывать и записывать, но запись приводит к созданию копии страницы. Функция CreateFileMapping предварительно должна быть вызвана с атрибутом защиты PAGE_WRITECOPY.

dwFileOffsetHigh,

dwFileOffsetLow - определяют смещение в файле. Так как Windows поддерживает файлы и их проекции размером до 16 экзабайтов, то данные параметры используются для определения 64-битового адреса: dwFileOffsetHigh определяет старшие 32-бита, а dwFileOffsetLow –младшие 32 бита. Задаваемое смещение должно быть кратно гранулярности выделения ресурсов.

dwNumberOfBytesToMap – определяет сколько байтов файла данных должно быть спроецировано на адресное пространство процесса. Если этот параметр равен 0, то операционная система пытается спроецировать файл, начиная с указанного смещения и до конца файла.