Win32 располагает большим набором функций для получения
информации о структуре файловой системы конкретного компьютера. Часть
этих функций раз-вивает идеи работы с файловой подсистемой, появившиеся в
последних версиях WAS DOS. Другие функции являются уникальными для
платформы Win32. Рас-Рассмотрим наиболее интересные из них.
Программа, предназначенная для исследования файловой системы,
прежде всего должна знать, какие логические диски присутствуют в
системе. Среди
нескольких функций, выполняющих эту работу, наиболее удобной для процесса обработки является GetLogicalDrivesString.
DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR lpBuffer);
Данной функции передаются два параметра: lpBuffer — адрес буфера, в который помешаются имена корневых каталогов логических дисков, установленных в системе; nBufferLength — длина буфера, заданного указателем lpBuffer. В качестве возвращаемого значения функция формирует длину буфера, действительно необходимую для размещения строки с именами корневых каталогов логических дисков. Например, при наличии трех логических дисков структура заполненного буфера будет следующей: А:\0В:\0С:\0. Заметьте, что имена корневых каталогов разделены нулевыми байтами. Более эффективно вызывать эту функцию два раза: первый раз с нулевым значением первого параметра, при этом функция вернет потребное количество байт для размещения буфера; второй раз функцию уже можно вызывать, подставив на место первого параметра значение, возвращенное при первом вызове.
:prg07_33.asm - Win32-консольное приложение для Win32 для исследования работы :функции GetLogicalDriveStrings API Win32.
.data
TitleText db 'Получение информации о дисках в Win32',0 '
infojmf db 10 duo (0)
.code
:.......----GetLogi cal Dri veStri ngs................-........
push offset info_buf
push 0
call GetLogicalDriveStringsA
cmp eax.O
jz exit ;выход в случае неудачи
;вызываем функцию второй раз. когда известно количество байт, потребное :для записи списка корневых каталогов
push offset info_buf
push eax
call GetLogicalDriveStringsA
cmp eax.O
jz exit :выход в случае неудачи результат смотрим в отладчике TD32.exe
Недостаток функции GetLogi cal Dri veStri ngs состоит в
том, что она работает не во всех версиях Windows. Альтернативным
вариантом получения информации о наличии дисков в системе является
функция GetLogi cal Drives.
DWORD GetLogicalDrives(VOID);
Эта функция возвращает в регистре ЕАХ битовую маску, в которой
установленные биты указывают на существование логического диска: бит 0 —
А, бит 1 — В, бит 2 — С... Таким образом, с помощью функции GetLogi cal
Drives можно достичь того же самого результата, что и с помощью функции
GetLogi cal Dri veStri ngs, но несколько большими трудами.
;prg07_34.asm - Win32-консольное приложение для исследования
;работы функции GetLogicalDrives API Win32.
.data
TitleText db 'Получение информации о дисках в Win32'.0
info_buf db 10 dup (0)
.code
call GetLogicalDrives cmp eax.O
jz exit ;выход в случае неудачи результат смотрим з отладчике TD32.exe
После того как информация о номенклатуре логических дисков в системе получена, можно получить информацию о каждом из них. Для этого используется функция GetVolumelnformation.
BOOL GetVolumeInformation(LPCTSTR ipRootPathName.
LPTSTR lpvolumeNameBuffer. DWORD nVolumeNameSize, LPDWORD ipVolumeSerialNumber, LPDWORD
ipMaximumComponentLength. LPDWORD lpFileSystemFlags.
LPTSTR ipFileSystemNameBuffer. DWORD nFileSystemNameSize);
На вход функции GetVolumelnformation подаются следующие параметры:
- IpRootPathName — указатель на строку с именем корневого каталога диска, информацию о котором необходимо получить (если параметр равен NULL, функция формирует информацию о текущем диске). Формат задания имени корневого каталога диска — имя_диска:\. Это единственный параметр, значение которого нужно задавать, остальные параметры — адреса областей памяти, в которые будут помещены значения, формируемые функцией;
- lpVolumeNameBuffern и nVolumeNameSize — указатель на буфер и размер буфера, в который будет записано имя диска;
- IpVolumeSerial Number — адрес двойного слова, куда будет записан серийный номер. Если информация о серийном номере диска не нужна, то при вызове функции значение этого параметра необходимо сделать равным NULL;
- lpMaximumComponentLength — адрес двойного слова, куда будет записано значение максимальной длины пути, возможное в данной файловой системе;
- lpFileSystemFlags — флаги с дополнительной информацией о файловой системе:
- • FS_CASE_SENSITIVE=FILE_CASE_SENSITIVE_SEARCH
=00000001h - поддержка со стороны файловой системы поиска с сохранением регистра букв; - • FS_CASE_IS_PRESERVED=FILE_CASE_PRESERVED_NAMES
=00000002h - при записи на диск сохранить регистр букв в имени файла; - • FS_UNICODE_STORED_ON_DISK=FILE_UNICODE_ON_DISK
=00000004h - файловая система поддерживает хранение имен файлов в Unicode; - • FSPERSI STENT_ACLS=FI LEPERS I STENT_ACLS
=00000008h - файловая система способна оперировать со списками контроля доступа (ACL) — только для NTFS;
• FS_FILE_COMPRESSION=FILE_FILE_COMPR?SSION
=00000010h — файловая система поддерживает сжатие файлов;
• FS_VOL_IS_COMPRESSED=FILE_VOLUME_IS_COMPRESSED
=00008000h - том, о котором запрашивается информация, был сжат;
a lpFileSystemNameBuffer и nFileSystemNameSize — указатель и размер буфера в который будет записано имя файловой системы. Если TpFiieSystemName-Buffer=NULL, то в эти параметры ничего не записывается.
- • FS_CASE_SENSITIVE=FILE_CASE_SENSITIVE_SEARCH
Изменить метку диска может вызов функции SetVolumeLabel.
BOOL SetVolumeLabel(LPCTSTR IpRootPathName. LPTSTR lpVolumeName):
Параметр IpRootPathName задает адрес строки с именем корневого
каталога диска, метку которого меняем. Второй параметр 1 pVol umeNarae —
строка с меткой тома. Для удаления метки тома с диска параметр
lpVolumeName нужно задать равным NULL.
Получить информацию о свободном дисковом пространстве
Информацию о свободном дисковом пространстве, а заодно и о
разбиении диска на сектора и кластеры позволяет получить функция
GetDiskFreeSpace.
BOOL GetDiskFreeSpaceCLPCTSTR IpRootPathName.
LPDWORD ipSectorsPerCluster, LPDWORD lpBytesPerSector,
LPDWORD ipNumDerOfFreeClusters. " LPDWORD ipTotalNumberOfClusters):
На вход функции нужно подать строку с именем корневого каталога диска, о котором необходимо получить информацию (NULL для текущего диска), и адреса буферов, куда будет помещена следующая информация: общее количество кластеров на диске (1 pTotal NumberOfCl usters), общее количество свободных кластеров (TpNumberOfFreeCI usters), количество байт в секторе (lpBytesPerSector), количество секторов в кластере (IpSectorsPerCluster).
Создание и удаление каталога
Создание каталога выполняет функция CreateDi rectory.
BOOL CreateDi rectory (LPCTSTR lpPathName. LPSECURITYJVTTRIBUTES.IpSecurityAttributes ¦:
Первый параметр этой функции lpPathName — указатель на
ASCIIZ-строку с путем, последний элемент которого является именем нового
каталога. Параметр ipSecurityAttributes — указатель на экземпляр
структуры Security_Attributes.
SECURITY_ATTRIBUTES stoic
nLength dd. 0
lpSecurityDeschptor dd 0
blnheritHandle dd
ends
С помощью структуры SecurityAttributes
можно ограничить доступ пользователя к каталогу. Параметр
IpSecurityAttributes обычно задается равным NULL. Более подробную
информацию о параметрах структуры можно получить в MSDN.
Удаление каталога выполняет функция RemoveDi rectory.
BOOL RemoveDirectory(LPCTSTR lpPathName);
единственный параметр этой функции ipPathName — указатель на
ASCIIZ-стро-^Вс путем, последний элемент которого является именем
удаляемого каталога. ^Удаляемый каталог не должен быть пустым.
Определение и изменение текущего каталога
Аналогично принципам организации файловой системы
MS DOS в Win32 также Иуществует понятие текущего каталога, то есть
каталога, в котором выполняются ^шеущие операции по работе с файлами. В
отличие от MS DOS понятие текуще-^^Италога относится к текущему
процессу. При запуске процесса текущим бу-I дет являться каталог, из
которого этот процесс был запущен. Определяет текущий налог процесса
функция GetCurrentDirectory.
RD GetCurrentDirectory(OWORD nBufferLength, LPTSTR ipBuffer);
it Параметры TpBuffern и BufferLength определяют
соответственно адрес и длину I буфера, в который помещается путь с
текущим каталогом (строка с завершаю-Нцим нулем). Функция возвращает
NULL в случае ошибки и число байтов, необходимо для записи данных в
буфер, в случае удачного завершения. Завершающий ^ нуль в возвращаемом
функцией числе не учитывается. Если буфер мал, то с помощью
возвращаемого значения можно изменить его размер. [ Изменить текущий
каталог процесса можно с помощью функции SetCurrent-^Brectory.
¦6001 SetCurrentDi rectory (LPCTSTR IpszPathName): "
j" Параметр IpszPathName — адрес ASCIIZ-строки с путем,
последний элемент ко-I торою — новый текущий каталог данного процесса.
[i Платформа Win32 также поддерживает понятие системного и
основного ка-^ВДога Windows. Для определения системного каталога
существует специальная |; функция GetSystemDi rectory.
[ GetSystemDirectory(LPTSTR ipszBuffer, UINT uSize):
Два параметра этой функции определяют адрес и размер буфера, в
который I записывается путь к системному каталогу Windows.
„Для определения основного каталога Windows существует специальная функция
GetWindowsDi rectory.-
UINT GetWindowsDirectorydPTSTR IpBuffer. UINT uSize);
Два параметра этой функции определяют адрес и размер буфера, в
которыйзаписывается путь к основному каталогу Windows. Возвращаемое
значение количество реально записанных в буфер байтов. Его можно
использовать для г корректировки параметра uSize, если он был задан
слишком маленьким, и повторного вызова функции GetWindowsDi rectory.
Для демонстрации применения вышеприведенных функций рассмотрим
комплексный пример, в ходе которого продемонстрируем порядок вызова и
анализа Е возвращаемых значений функциями API Win32 для работы с
каталогами. Опре-
делим текущий каталог процесса, создадим новый каталог, сделаем
его текущим удалим новый каталог, определим системный каталог и каталог
Windows.
:prg07_35.asm - Win32-KOHCo/ibHoe приложение для исследования работы функций ;работы с каталогами API Win32.
.data
TitleText db 'Работа с каталогами в Win32',0
NewOir db "Новый каталог".0
dirjbuf db 50 dup ("?")
size_dir_buf=$-dir_buf
Parent db "..".0
.code
:определив текущий каталог
push offset dirjwf
push size_dir_buf
call GetCurrentDirectoryA
cmp eax.0
jz exit ;выход в случае неудачи :создадим каталог
push 0
push offset NewDir .
call CreateDirectoryA
cmp eax,0
jz exit :выход в случае неудачи ¦.сделаем новый каталог текущий
push offset NewDir
call SetCurrentDirectoryA
cmp eax.0
jz exit ;выход в случае неудачи
;проверим новый текущий каталог
push offset dir_buf
push size_dir_buf
call GetCurrentDirectoryA
cmp eax.0
jz exit .-выход в случае неудачи
;------.....SetCurrentDi rectory-..................-.........
:вернемся в родительский каталог
push offset Parent
call SetCurrentDirectoryA
cmp eax.0
jz exit ;выход в случае неудачи
;проверил новый текущий каталог
push offset dir_buf
push size_dir_buf
call GetCurrentDirectoryA
cmp eax.O
jz exit :выход в случае неудачи :удалим новый текущий каталог
push offset NewDir
call RemoveDirectoryA
cmp eax.O
jz exit ;выход в случае неудачи I определив системный каталог mov eax.size_dir_buf push eax
push offset dir_buf call GetSystemDirectoryA cmp eax.O
jz exit :выход в случае неудачи ¦.определим основной каталог Windows mov eax.size_d1r_buf push eax
push offset dir_buf call GetWindowsDirectoryA cmp eax.O
jz exit -.выход в случае неудачи результат смотрим в отладчике TD32.exe
Среди функций Win32, работающих с текущим
каталогом, существует функция GetFuT I PathName, которая по имени файла
формирует его полное имя, состоящее из пути от корневого каталога к
текущему. Последний элемент этого имени — имя входного файла.
DWORD GetFulIPathNameCLPCTSTR ipFileName. DWORD nBufferLength, LPTSTR ipBuffer.
LPTSTR *lpFilePart): I На входе функция принимает имя файла в виде ASCIIZ-строки. На выходе —
три параметра:
- IpBuffer — адрес буфера, в который помещается полный путь с именем
файла; - nBufferLength — длина буфера, на который указывает параметр IpBuffer,
в символах; - lpFilePart — адрес ячейки размером с двойное слово, в которое помещается указатель на позицию внутри буфера, идентифицированную параметром 1 pBuf fег и соответствующую первому символу имени файла после имен всех каталогов.
Самое интересное в этой функции — механизм ее работы. Суть его в том, что
реально функция GetFul I PathName не ищет файл, ка имя
которого указывает параметр IpBuffer. Результат своей работы — полный
путь — она формирует из двух
компонент: полного пути к текущему каталогу данного процесса и имени файла,
наличие которого на диске функция GetFul I PathName даже не
проверяет. Для подобной работы ей даже не нужно обращаться к диску. С
аналогичной функцией
' мы уже имели дело, когда рассматривали функции MS DOS для работы с файлами, имеющими длинные имена.
Поиск файлов
При последовательном изучении материала данного
раздела читатель кроме знакомства со средствами по работе с файлами
операционных систем фирмы Microsoft поневоле должен был оценить процесс
эволюции этих средств. Особенно очевиден этот процесс при поиске файлов.
Платформа Win32 предлагает два способа поиска файлов:
- с использованием функции SearchPath;
- с использованием функций FindFirr,tFile, FindNExtFile и структуры WIN32 FIND DATA.
Поиск файлов с помощью функции SearchPath
Функция SearchPath ищет файлы в указанном при ее вызове списке каталогов.
DWORD SearchPathtLPCTSTR lpPath. LPCTSTR ipFileName. LPCTSTR
lpExtension, DWORD nBufferiength. LPTSTR ipBuffer, LPTSTR *lpFilePart):
Первый параметр lpPath определяет список каталогов, в которых
будет осуществляться поиск файла. Параметры lpFileName и lpExtension
указывают на ASCIIZ-строки с именем и расширением искомого файла.
Наличие пары этих параметров позволяет задавать имя и расширение файла
двумя способами:
- одной ASCIIZ-строкой — на нее указывает параметр lpFileName, при этом параметр ipExtension равен NULL;
- отдельными ASCHZ-строками — в этом случае параметр ipFileName содержит указатель на ASCIIZ-строку с именем файла, а второй парамет lpExtension — содержит указатель на ASCIIZ-строку с расширением файла; строка с расширением должна начинаться с символа . (точка).
Параметр IpBuffer указывает на буфер, куда
записывается ASCHZ-строка с полным путем к искомому файлу. Длина этого
буфера определяется параметром nBufferLength. Если эта длина слишком
мала, то ее можно подкорректировать значением, возвращаемым функцией в
регистре ЕАХ. Это значение является личеством символов, действительно
необходимых для записи полного имени найденного файла в буфер. Если в
ЕАХ возвращается NULL, то это говорит об ошибке вызова функции.
Последний параметр lpFilePart является указателем на символ в буфере, с которого начинается собственно имя файла.
При вызове функции SearchPath параметр lpPath можно задать
равным NULL. В этом случае поиск файла будет осуществляться в следующих
каталогах (порядок перечисления соответствует порядку просмотра при
поиске):
- каталог, из которого запущено приложение;
- текущий каталог;
- системный каталог;
- основной каталог Windows;
- каталоги, перечисленные в переменной окружения PATH.
Поиск файлов с помощью функций FindFirstFile и
FindNExtFile Предыдущий способ поиска обладает существенным недостатком —
ограниченным числом каталогов диска, подвергающихся просмотру в
процессе поиска. По этой причине он не может быть использован для поиска
в пределах всего диска. Этот недостаток устраняется при втором способе
поиска — с использованием функций FindFirstFile, FindNExtFile и
структуры WIN32FINDDATA. Этот способ реализует определенный алгоритм
поиска. Вначале вызывается функция FindFirstFile, которая имеет два
параметра: lpFileName — указатель на ASCII-строку с именем файла;
lpFindFileData — указатель на экземпляр структуры WIN32_FIND_OATA.
HANDLE FindFirstFiletLPCTSTR lpFileName. LPWIN32_FIND_DATA
lpFindFileData): Имя файла может содержать символы шаблона * и ?. Кроме
того, имя может Вырожать путь, с которого нужно начинать поиск. Выше,
при знакомстве с функциями MS DOS для работы файлами, имеющими длинные
имена, приводилось Иписание структуры WIN32_FIND_DATA и ее полей.
В случае успеха функция FindFirstFile заполняет поля структуры
WIN32_FIND_ DATA и возвращает значение дескриптора внутренней структуры
в памяти, который впоследствии может быть использован функциями
FindNextFile или FindClose. В случае неудачи функция не изменяет
содержимое структуры WIN32_FIND_DATA и возвращает значение
INVALID_HANDLE_VALUE (EAX=-llo=Offffffffh). 1 Проанализировав
результаты поиска, программа может продолжить или прекратить его. Для
продолжения поиска необходимо вызвать функцию Fi ndNExtFi I e. I BOOL
FindNextFile
( HANDLE hFindFile. LPWIN32_FIND_DATA lpFindFileData ):
В качестве параметров используются дескриптор,
полученный в регистре ЕАХ в результате поиска функцией FindFirstFile, и
указатель на экземпляр структуры WIN32_FIND_DATA. В случае успеха
функция FindNextFile возвращает ненулевое значение в регистре ЕАХ и
заполняет структуру WIN32FINDDATA. При неудаче —
I ЕАХ = 0.
Для продолжения поиска при неизменных исходных параметрах поиска функ-
ция FindNextFile вызывается циклически.
Для окончания процесса поиска необходимо вызвать функцию FindClose.
BOOL FindCloset HANDLE hFindFile ):
i Функция FindClose имеет один параметр — дескриптор, полученный
функци-Нй FindFirstFile в начале поиска. В случае успеха функция
FindClose возвращает Е ненулевое значение в регистре ЕАХ, при неудаче —
ЕАХ = 0.
Файлы, отображаемые в память
¦Платформа Win32 позволяет организовать работу с
содержимым файла как с ^Властью оперативной памяти, без использования
операций файлового ввода-Лывода. Этот механизм отображает (проецирует)
содержимое файла на область Императивной памяти. Программе передается
адрес этой области, после этого ра-Ибота с содержимым файла
осуществляется командами работы с памятью.
Для «проецирования» файла необходимо выполнить следующие действия.
- 1. Требуется создать (для несуществующего файла)
или открыть (для существующего файла) объект ядра файл. Цель этого шага
— сообщить системе, где находится физическое представление файла.
Создание или открытие объекта ядра файл производится с помощью функции
CreateFile (см. выше). Все параметры этой функции задаются обычным
образом. На выходе в случае успеха функция формирует дескриптор (в
регистре ЕАХ), в обратном случае - значение INVALID_HANDLE_VALUE
(ЕАХ—llo=Offffffffh).
2. Требуется создать объект ядра проекция файла. Цель этого шага — сообщить системе размер проецируемого файла. Для этого используется функция CreateFi I eMappi ng:
HANDLE CreateFileMapping
(HANDLE hFile. LPSECURITY_ATTRIBUTES
ipFileMappingAttributes DWORD flProtect.
DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow. LPCTSTR ipName);
Параметр hFile является дескриптором файла, полученным функцией Create-File. Параметр 1 pFi 1 eMappingAttributes — указатель на экземпляр структуры SECURITYATTRIBUTES, которая служит для установки защиты. Присвойте параметру lpFil eMappi ngAttri butes значение NULL. Параметр flProtect предназначен для установки атрибутов защиты страниц физической памяти в адресном пространстве процесса, на которые отображается файл. Используют один из следующих атрибутов:
PAGE_READONLY=02 — доступ к файлу только по чтению (при использовании этого параметра вызов CreateFile должен был производиться с флагом GENERIC_READ);
€ PAGEREADWRI TE=04 — доступ к файлу только по записи (при использовании этого параметра вызов CreateFile должен был производиться с флагом GENERICREAD | GENERICWRITE);
a PAGE_WRITECOPY=08 — доступ к файлу по чтению-записи с созданием копии данных из файла, при этом исходный файл не изменяется, изменения касаются лишь модифицированных страниц копии в страничном файле (при использовании этого параметра вызов CreateFile должен был производиться с флагом GENERIC_READ или GENERIt_READ|GENERIC_WRITE).
Параметры dwMaximumSizeHigh и dwMaximumSizeLow предназначены для того, чтобы сообщить системе максимальный размер файла в байтах. При этом в dwMaximumSizeLow указываются младшие 32 бита этого значения, а в dwMaximumSizeHigh — старшие 32 бита. Если предполагается размер файла, равный текущей его длине, то следует при вызове функции передать dwMaxi ¦ mumSizeLow=dwMaximumSizeHigh=NULL.
Последний параметр IpName — указатель на ASCIIZ-строку с именем объекта проецируемый файл для обеспечения доступа к нему других процессов. Обычно задают равным NULL.
3. Требуется выполнить проецирование файла на адресное пространство процесса. В этом шаге две цели. Первая цель — сообщить системе порядок отображения (проецирования) файла на адресное пространство процесса — полный или частичный. Вторая цель — получить адрес этого отображения в памяти. Реализация этих целей достигается функцией MapViewOfFile: LPVOID MapViewOfFi1e(HANDLE hFileMappingObject,
DWORD dwDesiredAccess. - DWORD dwFileOffsetHigh. DWORD dwFileOffsetLow.
DWORD dwNumberOfBytesToMap);
Параметр hFil eMappi ngObject — дескриптор, возвращенный функцией Create-Fi 1 eMapping на предыдущем шаге. Параметр 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 + OOOOOOlOh — данные в файле доступны по чтению-записи (при использовании этого значения параметра dwDesiredAccess функция CreateFile-Mapping должна была быть вызвана с атрибутом PAGERE ADWRI ТЕ).
Параметры dwFileOffsetHigh, dwFileOffsetLow и dwNumberOfBytesToMap предназначены для указания позиции в файле, с которой начинать отображение, и количества отображаемых байт (dwNumberOfBytesToMap). Параметр dwFileOffsetHigh — старшие 32 бита этого смещения, а параметр dwFileOffsetLow — младшие 32 бита этого смещения. Таким образом, с файлом можно работать не целиком, а по частям, эффективно используя при этом оперативную память. Заметим, что если задать параметр dwNumberOfBytesToMap равным NULL, то система будет пытаться отобразить содержимое файла с указанной парой dwFileOffsetHigh:dwFileOffsetLow смещения и до конца файла. В случае успеха функция формирует адрес отображения в памяти (регистр ЕАХ), в обратном случае ЕАХ = 0. После получения в ЕАХ адреса начала отображения в памяти приложение может работать с данными файла обычными командами работы с памятью. При необходимости функция MapViewOfFile может быть вызвана повторно с другими параметрами dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow и dwNumberOfBytesToMap. При этом (запомните!) резервируется новый регион в памяти.
После выполнения необходимых действий приложение должно корректно завершить работу с отображением файла.
4. Требуется выполнить разрыв связи данных в файле и соответствующими данными, отображенными на адресное пространство процесса. Это дейст-
I вие выполняет функция UnmapViewOfFile. BOOL UnmapViewOfFile( LPCVOID ipBaseAddress);
Эта функция имеет единственный параметр — IpBaseAddress, который является значением, возвращенным функцией MapViewOfFile. С помощью функции UnmapViewOfFile необходимо разрывать каждое из отображений, созданных последовательностью вызовов MapViewOfFile, сохраняя при этом их соответствия. Также имейте в виду, что если функция MapViewOfFile была вызвана с параметром FILEMAPCOPY, то после вызова UnmapViewOfFile теряются все внесенные в отображенные данные изменения.
5. Далее нужно закрыть объект ядра проекция файла. В принципе, этот и сле-ivmmuu шяг нр яиляютг.я обязательными, так как система в процессе за-
вершения работы приложения освободит все ресурсы. Освобождение
объекта ядра проекция файла производится функцией CloseHandle.
BOOL CloseHandle( HANDLE hObject):
Функции CloseHandle передается единственный параметр hObject — де.
скриптор, полученный как результат вызова функции CreateFileMapping.
6. Требуется закрыть объект ядра файл. Освобождение объекта ядра файл также производится функцией CloseHandle.
BOOL CloseHandle( HANDLE hObject );
Функции CloseHandle передается единственный параметр hObject — дескриптор, полученный как результат вызова функции CreateFile.
Пример программы (prg07_36.asm), демонстрирующей порядок использования файлов, отображаемых в адресное пространство процесса, достаточно велик и по этой причине вынесен на дискету. Работа программы проста и заключается в следующем: необходимо вывести содержимое некоторого файла на экран — в окно консоли. Имя исходного файла вводится с клавиатуры.