Поделиться через


Функция MapViewOfFileEx (memoryapi.h)

Сопоставляет представление сопоставления файлов в адресное пространство вызывающего процесса. Вызывающий объект может дополнительно указать предлагаемый базовый адрес памяти для представления.

Сведения об указании узла NUMA для физической памяти см. в разделе MapViewOfFileExNuma.

Синтаксис

LPVOID MapViewOfFileEx(
  [in]           HANDLE hFileMappingObject,
  [in]           DWORD  dwDesiredAccess,
  [in]           DWORD  dwFileOffsetHigh,
  [in]           DWORD  dwFileOffsetLow,
  [in]           SIZE_T dwNumberOfBytesToMap,
  [in, optional] LPVOID lpBaseAddress
);

Параметры

[in] hFileMappingObject

Дескриптор объекта сопоставления файлов. Функции CreateFileMapping и OpenFileMapping возвращают этот дескриптор.

[in] dwDesiredAccess

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

Ценность Значение
FILE_MAP_ALL_ACCESS
Сопоставляется представление файла с чтением и записью. Объект сопоставления файлов должен быть создан с помощью PAGE_READWRITE или защиты PAGE_EXECUTE_READWRITE.

При использовании с функцией MapViewOfFileEx FILE_MAP_ALL_ACCESS эквивалентен FILE_MAP_WRITE.

FILE_MAP_READ
Сопоставлено только для чтения представление файла. Попытка записи в представление файла приводит к нарушению доступа.

Объект сопоставления файлов должен быть создан с PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE_READили защитой PAGE_EXECUTE_READWRITE.

FILE_MAP_WRITE
Сопоставляется представление файла с чтением и записью. Объект сопоставления файлов должен быть создан с помощью PAGE_READWRITE или защиты PAGE_EXECUTE_READWRITE.

При использовании с MapViewOfFileEx, (FILE_MAP_WRITE | FILE_MAP_READ) и FILE_MAP_ALL_ACCESS эквивалентны FILE_MAP_WRITE.

 

Используя побитовое ИЛИ, можно объединить указанные выше значения с этими значениями.

Ценность Значение
FILE_MAP_COPY
Сопоставляется представление копирования по записи файла. Объект сопоставления файлов должен быть создан с помощью PAGE_READONLY, PAGE_EXECUTE_READ, PAGE_WRITECOPY, PAGE_EXECUTE_WRITECOPY, PAGE_READWRITEили защиты PAGE_EXECUTE_READWRITE.

Когда процесс записывается на страницу копирования на запись, система копирует исходную страницу на новую страницу, которая является частной в процесс. Новая страница поддерживается файлом разбиения на страницы. Защита новой страницы изменяется от копирования и записи на чтение и запись.

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

FILE_MAP_LARGE_PAGES
Начиная с Windows 10 версии 1703, этот флаг указывает, что представление должно быть сопоставлено с помощью поддержки больших страниц. Размер представления должен быть кратным размером большой страницы, сообщаемой функцией GetLargePageMinimum, а объект сопоставления файлов должен быть создан с помощью параметра SEC_LARGE_PAGES. Если для lpBaseAddressзадано непустое значение, то значение должно быть несколько GetLargePageMinimum.
FILE_MAP_EXECUTE
Исполняемое представление файла сопоставляется (сопоставленная память может выполняться как код). Объект сопоставления файлов должен быть создан с помощью PAGE_EXECUTE_READ, PAGE_EXECUTE_WRITECOPYили защиты PAGE_EXECUTE_READWRITE.

Windows Server 2003 и Windows XP: это значение доступно начиная с Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003 с пакетом обновления 1 (SP1).

FILE_MAP_TARGETS_INVALID
Задает все расположения в сопоставленном файле в качестве недопустимых целевых объектов для Control Flow Guard (CFG). Этот флаг похож на PAGE_TARGETS_INVALID. Используйте этот флаг в сочетании с правой FILE_MAP_EXECUTEдля выполнения доступа. Любой косвенный вызов расположений на этих страницах завершится сбоем проверок CFG, и процесс будет завершен. Поведение по умолчанию для выделенных исполняемых страниц должно быть отмечено допустимыми целевыми объектами вызовов для CFG.
 

Для объектов сопоставления файлов, созданных с помощью атрибута SEC_IMAGE, параметр dwDesiredAccess не действует и должен иметь любое допустимое значение, например FILE_MAP_READ.

Дополнительные сведения о доступе к объектам сопоставления файлов см. в .

[in] dwFileOffsetHigh

Высокий порядок DWORD смещения файла, в котором начинается представление.

[in] dwFileOffsetLow

Низкий порядок DWORD смещения файла, в котором начинается представление. Сочетание высоких и низких смещения должно указывать смещение в сопоставлении файлов. Они также должны соответствовать детализации распределения памяти системы. То есть смещение должно быть несколькими из гранулярности выделения. Чтобы получить степень детализации выделения памяти системы, используйте функцию GetSystemInfo, которая заполняет элементы структуры SYSTEM_INFO.

[in] dwNumberOfBytesToMap

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

[in, optional] lpBaseAddress

Указатель на адрес памяти в адресном пространстве вызывающего процесса, где начинается сопоставление. Это должно быть несколько из детализации распределения памяти системы, или функция завершается ошибкой. Чтобы определить степень детализации выделения памяти системы, используйте функцию GetSystemInfo. Если в указанном адресе недостаточно адресного пространства, функция завершается ошибкой.

Если lpBaseAddressNULL, операционная система выбирает адрес сопоставления. В этом сценарии функция эквивалентна функции MapViewOfFile.

Хотя можно указать адрес, безопасный сейчас (не используемый операционной системой), нет никаких гарантий, что адрес будет оставаться безопасным в течение времени. Поэтому лучше разрешить операционной системе выбрать адрес. В этом случае вы не будете хранить указатели в сопоставленном файле памяти, вы будете хранить смещения от базы сопоставления файлов, чтобы сопоставление можно было использовать в любом адресе.

Возвращаемое значение

Если функция выполнена успешно, возвращаемое значение является начальным адресом сопоставленного представления.

Если функция завершается ошибкой, возвращаемое значение равно NULL. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.

Замечания

Сопоставление файла делает указанную часть файла видимой в адресном пространстве вызывающего процесса.

Для файлов, размер которых превышает адресное пространство, можно сопоставить только небольшую часть данных файла одновременно. Когда первое представление будет завершено, вы распакуете его и сопоставите новое представление.

Чтобы получить размер представления, используйте функцию VirtualQueryEx.

Начальное содержимое страниц в объекте сопоставления файлов, поддерживаемом файлом страницы, равно 0 (ноль).

Как правило, предлагаемый адрес используется для указания того, что файл должен быть сопоставлен с тем же адресом в нескольких процессах. Для этого требуется, чтобы область адресного пространства была доступна во всех участвующих процессах. В регионе, который используется для сопоставления, не может быть выделено другое выделение памяти, включая использование VirtualAlloc или функции VirtualAllocEx для резервирования памяти.

Если параметр lpBaseAddress указывает базовое смещение, функция завершается успешно, если указанный регион памяти еще не используется вызывающим процессом. Система не гарантирует, что тот же регион памяти доступен для сопоставленного файла памяти в других 32-разрядных процессах.

Несколько представлений файла (или объекта сопоставления файлов и сопоставленного файла) последовательно, если они содержат идентичные данные в указанное время. Это происходит, если представления файлов являются производными от одного объекта сопоставления файлов. Процесс может дублировать дескриптор объекта сопоставления файлов в другой процесс с помощью функции DuplicateHandle или другой процесс может открыть объект сопоставления файлов по имени с помощью функции OpenFileMapping.

При одном важном исключении представления файлов, производные от любого объекта сопоставления файлов, поддерживаемого одним и тем же файлом, являются последовательными или идентичными в определенное время. Совместная обработка гарантируется для представлений в процессе и для представлений, сопоставленных различными процессами.

Исключение связано с удаленными файлами. Хотя MapViewOfFileEx работает с удаленными файлами, он не поддерживает их согласованность. Например, если два компьютера сопоставляют файл как доступный для записи, и оба изменяют одну и ту же страницу, каждый компьютер видит только собственные записи на страницу. Когда данные обновляются на диске, они не объединяются.

Сопоставленное представление файла не гарантирует согласованность с файлом, к которым обращается функция ReadFile или WriteFile.

Чтобы защититься от исключений EXCEPTION_IN_PAGE_ERROR, используйте структурированную обработку исключений, чтобы защитить любой код, который записывает в или считывает из сопоставленного с памятью представления файла, отличного от файла страницы. Дополнительные сведения см. в чтения и записи изпредставления файлов.

При изменении файла с помощью сопоставленного представления метка времени последнего изменения может не обновляться автоматически. При необходимости вызывающий объект должен использовать SetFileTime, чтобы задать метку времени.

Чтобы иметь файл с разрешениями исполняемого файла, приложение должно вызывать CreateFileMapping с PAGE_EXECUTE_READWRITE или PAGE_EXECUTE_READ, а затем вызывать MapViewOfFileEx с FILE_MAP_EXECUTE | FILE_MAP_WRITE или FILE_MAP_EXECUTE | FILE_MAP_READ.

В Windows Server 2012 эта функция поддерживается следующими технологиями.

Технологии Поддержанный
Протокол SMB 3.0 Да
Отработка отказа SMB 3.0 (TFO) Да
SMB 3.0 с масштабируемыми общими папками (SO) Да
Файловая система общего тома кластера (CSVFS) Да
Отказоустойчивая файловая система (ReFS) Да

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [только классические приложения]
минимальный поддерживаемый сервер Windows Server 2003 [только классические приложения]
целевая платформа Виндоус
заголовка memoryapi.h (включая Windows.h, Memoryapi.h)
библиотеки onecore.lib
DLL Kernel32.dll

См. также

CreateFileMapping

создание представления файлов

ДубликатыHandle

функций сопоставления файлов

GetSystemInfo

MapViewOfFileExNuma

OpenFileMapping

ReadFile

SYSTEM_INFO

UnmapViewOfFile

VirtualAlloc

WriteFile