Функция MapViewOfFileEx отображает представление файла в адресное пространство вызывающего процесса. Эта расширенная функция дает возможность вызывающему процессу определить предполагаемый адрес в памяти для отображаемого представления.
Синтаксис
LPVOID MapViewOfFileEx( HANDLE hFileMappingObject, // дескриптор отображаемого объекта DWORD dwDesiredAccess, // режим доступа DWORD dwFileOffsetHigh, // старшее DWORD смещения DWORD dwFileOffsetLow, // младшее DWORD смещения SIZE_T dwNumberOfBytesToMap, // число отображаемых байтов LPVOID lpBaseAddress // начальный адрес ); |
Параметры
hFileMappingObject
[in] Дескриптор открытого дескриптора объекта "проецируемый файл". Функции CreateFileMapping и OpenFileMapping возвращают этот дескриптор.dwDesiredAccess
[in] Тип доступа к объекту "проецируемый файл" и, следовательно, это защита страниц, отображаемого файла. Этим параметром могут быть одно из ниже перечисленных значений.Значение | Предназначение |
---|---|
FILE_MAP_WRITE | Доступ к операциям чтения-записи. Отображаемый объект должен быть создан с защитой PAGE_READWRITE . Чтение/запись представления файла отображается. |
FILE_MAP_READ | Доступ только для чтения. Отображаемый объект должен быть создан с защитой PAGE_READWRITE или PAGE_READONLY. Представление файла только для чтения отображается. |
FILE_MAP_ALL_ACCESS | То же самое, что и FILE_MAP_WRITE. |
FILE_MAP_COPY | Копирование
при доступе для записи. Отображаемый
объект должен создаваться с флажком
защиты PAGE_WRITECOPY.
Система помещает физическое сохранение данных из файла подкачки, когда вызывается MapViewOfFile. Фактическое физическое запоминающее устройство не используется до тех пор, пока поток в вашем процессе не запишет по адресу в представлении. В этой точке система копирует исходную страницу в новую страницу, поддерживаемую файлом подкачки, отображает страницу в адресное пространство процесса и изменяет защиту страницы на PAGE_READWRITE. Потоки в вашем процессе могут получить доступ только к этой локальной копии данных, а не первоначальным данным. Если эта страница когда-либо вырезается от рабочего набора страниц физической памяти вашего процесса, тогда она может записаться в запоминающем устройстве файла подкачки, которое было передано, когда вызывалась MapViewOfFile. Этот процесс только назначает физическую память, когда действительно записывается по виртуальному адресу. Изменения никогда не записываются обратно в исходный файл и освобождаются, когда поток в вашем процессе отменяет отображение представления. Пространство файла подкачки всего представления передается тогда, когда определяется доступ копирования при записи, потому что это дает возможность потоку в вашем процессе писать в каждую отдельно взятую страницу. Поэтому, когда вызывается MapViewOfFile, должно быть получено достаточно физического пространства устройства хранения данных. |
FILE_MAP_EXECUTE | Доступ к исполнению
кода (программы). Код, может быть
запущен из отображаемой памяти. "Проецируемый
" объект должен быть создан с
доступом PAGE_EXECUTE_READWRITE
или PAGE_EXECUTE_READ.
Windows XP и Windows Server 2003 : Эта функция не доступна до тех пор, пока не модернизируются до Windows XP SP2 и Windows Server 2003 SP1. |
dwFileOffsetHigh
[in] Старшее двойное слово (DWORD) смещения файла, где начинается отображение.dwFileOffsetLow
[in] Младшее двойное слово (DWORD) смещения файла, где начинается отображение. Комбинация старшего и младшего смещения должна установить смещение внутри файла, которое соответствует степени дробления системой распределенной памяти, или функция завершается ошибкой. То есть, смещение должно быть кратно степени дробления памяти. Используйте функцию GetSystemInfo, которая заполняет члены структуры SYSTEM_INFO, чтобы получить степень дробления системой распределенной памяти.dwNumberOfBytesToMap
[in] Число отображаемых байтов файла. Если dwNumberOfBytesToMap равняется нулю, отображается весь файл.lpBaseAddress
[in] Указатель на адрес в памяти в адресном пространстве вызывающего процесса, с которого должно начинаться отображение. Он должен быть кратным степени дробления системой распределенной памяти, или функция завершается ошибкой. Используйте функцию GetSystemInfo, которая заполняет члены структуры SYSTEM_INFO, чтобы получить степень дробления системой распределенной памяти. Если после заданного адреса недостаточно адресного пространства, функция завершается ошибкой.Если параметр lpBaseAddress - ПУСТО (NULL), операционная система выбирает адрес отображения. В этом случае, эта функция эквивалентна функции MapViewOfFile.
Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - начальный адрес отображаемого представления.
Если функция завершается ошибкой, возвращаемое значение - ПУСТО (NULL). Чтобы получить дополнительные данные об ошибке, вызовите GetLastError.
Замечания
Отображение файла делает заданную часть файла видимой в адресном пространстве вызывающего процесса.
Для файлов, которые являются большими чем ваше адресное пространство, Вы можете одновременно отобразить только маленькую часть данных файла. Когда Вы закончите с первым представлением, тогда Вы отменяете его отображение и отображаете новое представление.
Если дается предлагаемый адрес отображения, файл отображается с заданного адреса (округленного вниз до самой близкой 64 КБ границы), если есть достаточно адресного пространства после заданного адреса. Если нет, функция завершается ошибкой.
Как правило, предлагаемый адрес используется, чтобы определить, что файл должен отображаться с одного и того же адреса в нескольких процессах. Это требует области адресного пространства, которая должна быть доступной для всех включенных процессов. Никакое другое распределение памяти, включая использование функции VirtualAlloc, чтобы зарезервировать память, не может происходить в области, используемой для отображения:
Windows NT/2000/XP: Если параметр lpBaseAddress задает базовое смещение, функция завершается успешно, если данная область памяти - еще не использовалась вызывающим процессом. Система не гарантирует, что одна и та же область область памяти будет доступна для файла отображаемого в памяти в других 32-разрядных процессах.Windows 95/98/Me: Если
параметр lpBaseAddress задает
базовое смещение, функция завершается
успешно, только в том случае, если одна и
та же область памяти доступна для
отображаемого в памяти файла во всех
других 32-разрядных процессах.
Несколько представлений
файла (или объект "проецируемый файл" и
его отображаемый файл), как говорят,
являются "последовательными", если они
содержат идентичные данные в заданном
времени. Это происходит, если представления
файла получены из одного и того же объекта
"проецируемый файл". Процесс может
продублировать дескриптор объекта "проецируемый
файл" в другой процесс, используя функцию
DuplicateHandle, или другой процесс может
открыть объект "проецируемый файл" по
имени, используя функцию OpenFileMapping. Отображаемое
представление файла не гарантирует, что
будет последовательным с файлом, к которому
обращается функция ReadFile
или WriteFile. Чтобы принять меры против
исключений типа STATUS_IN_PAGE_ERROR,
используйте структурную обработку
исключений, чтобы защитить любой код,
который пишет в или читает из памяти
отображаемого представления.
Дополнительную информацию, см. в статье
Чтение
и запись из представления данных файла. Чтобы получить файл с правом исполнения
кода, ваше приложение должно вызвать
функцию CreateFileMapping с флажком или PAGE_EXECUTE_READWRITE
или PAGE_EXECUTE_READ,
а затем вызвать MapViewOfFile с FILE_MAP_EXECUTE
| FILE_MAP_WRITE или
FILE_MAP_EXECUTE
| FILE_MAP_READ.
Смотри также
Обзор Управление файлами, Функции, используемые для отображения файла в память, CreateFileMapping, DuplicateHandle, GetSystemInfo, MapViewOfFile, OpenFileMapping, ReadFile, UnmapViewOfFile, SYSTEM_INFO, VirtualAlloc, WriteFile
Размещение и совместимость MapViewOfFileEx |
||
К |
Windows XP |
Да |
л |
Windows 2000 Professional |
Да |
и |
Windows NT Workstation |
Да |
е |
Windows Me |
Да |
н |
Windows 98 |
Да |
т |
Windows 95 |
Да |
С |
Windows Server 2003 |
Да |
е | Windows 2000 Server | Да |
р | Windows NT Server | Да |
в | ||
е | ||
р | ||
Используемая библиотека |
Kernel32.lib |
|
Используемая DLL | - | |
Заголовочный файл | ||
- объявлено в |
Winbase.h |
|
- включено в |
Windows.h |
|
Unicode |
Нет |
|
Замечания по платформе |
Не имеется |