Работа с дисками, каталогами и организация поиска файлов
Действие 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), демонстрирующей порядок использования файлов, отображаемых в адресное пространство процесса, достаточно велик и по этой причине вынесен на дискету. Работа программы проста и заключается в следующем: необходимо вывести содержимое некоторого файла на экран – в окно консоли. Имя исходного файла вводится с клавиатуры.