Иллюстрированный самоучитель по задачам и примерам Assembler

Работа с дисками, каталогами и организация поиска файлов

Действие 3.
Требуется выполнить проецирование файла на адресное пространство процесса. В этом шаге две цели. Первая цель – сообщить системе порядок отображения (проецирования) файла на адресное пространство процесса – полный или частичный. Вторая цель – получить адрес этого отображения в памяти. Реализация этих целей достигается функцией MapViewOfFile:

LPVOID MapViewOfFi1e(HANDLE hFileMappingObject,
DWORD dwDesiredAccess.
DWORD dwFileOffsetHigh. DWORD dwFileOffsetLow.
DWORD dwNumberOfBytesToMap);

Параметр hFileMappingObject – дескриптор, возвращенный функцией CreateFileMapping на предыдущем шаге. Параметр dwDesiredAccess определяет вид доступа к данным:

  • FILE_MAP_COPY=01 – данные в файле доступны по чтению, хотя отображенные данные доступны по чтению и по записи; операция записи приводит к созданию копии страницы в страничном файле, в которую производится запись, поэтому после первой операции записи теряется соответствие между реальными данными на диске и данными, с кото рыми работает приложение (при использовании этого значения параметра dwDesiredAccess функция CreateFil eMappi ng должна была быть вызвана с одним из атрибутов: PAGE_READONLY, PAGE_READWRITE или PAGEWRITECOPY);
  • FILE_MAP_WRITE=02 – данные в файле доступны по чтению-записи (при использовании этого значения параметра dwDesiredAccess функция CreateFil eMapping должна была быть вызвана с атрибутом PAGE_READWRITE);
  • FILEMAPRE AD=04 – данные в файле доступны по чтению (при использовании этого значения параметра dwDesiredAccess функция CreateFile-Mapping должна была быть вызвана с одним из атрибутов: PAGE_READONLY, PAGE_READWRITE или PAGE_WRITECOPY);
  • FILE_MAP_ALL_ACCESS=OOOFO00Oh + OOOOOOOlh + 00000002h + 00000004h + 00000008h + 00000010h – данные в файле доступны по чтению-записи (при использовании этого значения параметра dwDesiredAccess функция CreateFileMapping должна была быть вызвана с атрибутом PAGERE ADWRIТЕ).

Параметры dwFileOffsetHigh, dwFileOffsetLow и dwNumberOfBytesToMap предназначены для указания позиции в файле, с которой начинать отображение, и количества отображаемых байт (dwNumberOfBytesToMap).

Параметр dwFileOffsetHigh – старшие 32 бита этого смещения, а параметр dwFileOffsetLow – младшие 32 бита этого смещения. Таким образом, с файлом можно работать не целиком, а по частям, эффективно используя при этом оперативную память. Заметим, что если задать параметр dwNumberOfBytesToMap равным NULL, то система будет пытаться отобразить содержимое файла с указанной парой dwFileOffsetHigh:dwFileOffsetLow смещения и до конца файла. В случае успеха функция формирует адрес отображения в памяти (регистр ЕАХ), в обратном случае ЕАХ = 0.

После получения в ЕАХ адреса начала отображения в памяти приложение может работать с данными файла обычными командами работы с памятью. При необходимости функция MapViewOfFile может быть вызвана повторно с другими параметрами dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow и dwNumberOfBytesToMap. При этом (запомните!) резервируется новый регион в памяти.

После выполнения необходимых действий приложение должно корректно завершить работу с отображением файла.

Действие 4.

Требуется выполнить разрыв связи данных в файле и соответствующими данными, отображенными на адресное пространство процесса. Это действие выполняет функция UnmapViewOfFile.

BOOL UnmapViewOfFile(LPCVOID ipBaseAddress);

Эта функция имеет единственный параметр – IpBaseAddress, который является значением, возвращенным функцией MapViewOfFile. С помощью функции UnmapViewOfFile необходимо разрывать каждое из отображений, созданных последовательностью вызовов MapViewOfFile, сохраняя при этом их соответствия. Также имейте в виду, что если функция MapViewOfFile была вызвана с параметром FILEMAPCOPY, то после вызова UnmapViewOfFile теряются все внесенные в отображенные данные изменения.

Действие 5.
Далее нужно закрыть объект ядра проекция файла. В принципе, этот и следующий шаг не являются обязательными, так как система в процессе завершения работы приложения освободит все ресурсы. Освобождение объекта ядра проекция файла производится функцией CloseHandle.

BOOL CloseHandle(HANDLE hObject):

Функции CloseHandle передается единственный параметр hObject – дескриптор, полученный как результат вызова функции CreateFileMapping.

Действие 6.
Требуется закрыть объект ядра файл. Освобождение объекта ядра файл также производится функцией CloseHandle.

BOOL CloseHandle(HANDLE hObject);

Функции CloseHandle передается единственный параметр hObject – дескриптор, полученный как результат вызова функции CreateFile.

Пример программы (prg07_36.asm), демонстрирующей порядок использования файлов, отображаемых в адресное пространство процесса, достаточно велик и по этой причине вынесен на дискету. Работа программы проста и заключается в следующем: необходимо вывести содержимое некоторого файла на экран – в окно консоли. Имя исходного файла вводится с клавиатуры.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.