Función MapViewOfFile (memoryapi.h)
Asigna una vista de una asignación de archivos en el espacio de direcciones de un proceso de llamada.
Para especificar una dirección base sugerida para la vista, use la función
Sintaxis
LPVOID MapViewOfFile(
[in] HANDLE hFileMappingObject,
[in] DWORD dwDesiredAccess,
[in] DWORD dwFileOffsetHigh,
[in] DWORD dwFileOffsetLow,
[in] SIZE_T dwNumberOfBytesToMap
);
Parámetros
[in] hFileMappingObject
Identificador de un objeto de asignación de archivos. Las funciones de CreateFileMapping y openFileMapping devuelven este identificador.
[in] dwDesiredAccess
Tipo de acceso a un objeto de asignación de archivos, que determina la protección de páginas de las páginas. Este parámetro puede ser uno de los siguientes valores, o una combinación OR bit a bit de varios valores cuando corresponda.
Con OR bit a bit, puede combinar los valores anteriores con estos valores.
Valor | Significado |
---|---|
|
Se asigna una vista de copia en escritura del archivo. El objeto de asignación de archivos debe haberse creado con PAGE_READONLY, PAGE_EXECUTE_READ, PAGE_WRITECOPY, PAGE_EXECUTE_WRITECOPY, PAGE_READWRITEo protección de PAGE_EXECUTE_READWRITE.
Cuando un proceso escribe en una página de copia en escritura, el sistema copia la página original en una página nueva privada para el proceso. El archivo de paginación respalda la nueva página. La protección de la nueva página cambia de copia en escritura a lectura y escritura. Cuando se especifica el acceso de copia en escritura, el sistema y el cargo de confirmación del proceso realizados es para toda la vista, ya que el proceso de llamada puede escribir potencialmente en todas las páginas de la vista, lo que hace que todas las páginas sean privadas. El contenido de la nueva página nunca se escribe en el archivo original y se pierde cuando la vista no está asignada. |
|
Se asigna una vista ejecutable del archivo (la memoria asignada se puede ejecutar como código). El objeto de asignación de archivos debe haberse creado con PAGE_EXECUTE_READ, PAGE_EXECUTE_WRITECOPYo PAGE_EXECUTE_READWRITE protección.
Windows Server 2003 y Windows XP: Este valor está disponible a partir de Windows XP con SP2 y Windows Server 2003 con SP1. |
|
A partir de Windows 10, versión 1703, esta marca especifica que la vista debe asignarse mediante compatibilidad con páginas grandes. El tamaño de la vista debe ser un múltiplo del tamaño de una página grande notificada por la función GetLargePageMinimum y el objeto de asignación de archivos debe haberse creado con la opción SEC_LARGE_PAGES. Si proporciona un valor distinto de null para lpBaseAddress, el valor debe ser un múltiplo de GetLargePageMinimum. Nota: En versiones del sistema operativo anteriores a Windows 10, versión 1703, la marca FILE_MAP_LARGE_PAGES no tiene ningún efecto. En estas versiones, la vista se asigna automáticamente mediante páginas grandes si la sección se creó con el conjunto de marcas SEC_LARGE_PAGES. |
|
Establece todas las ubicaciones del archivo asignado como destinos no válidos para Control Flow Guard (CFG). Esta marca es similar a PAGE_TARGETS_INVALID. Use esta marca en combinación con el derecho ejecutar acceso FILE_MAP_EXECUTE. Cualquier llamada indirecta a ubicaciones de esas páginas producirá un error en las comprobaciones de CFG y se finalizará el proceso. El comportamiento predeterminado de las páginas ejecutables asignadas es marcar los destinos de llamada válidos para CFG. |
En el caso de los objetos de asignación de archivos creados con el atributo SEC_IMAGE, el parámetro dwDesiredAccess no tiene ningún efecto y debe establecerse en cualquier valor válido, como FILE_MAP_READ.
Para obtener más información sobre el acceso a los objetos de asignación de archivos, vea seguridad de asignación de archivos y derechos de acceso.
[in] dwFileOffsetHigh
Un DWORD de orden alto del desplazamiento del archivo donde comienza la vista.
[in] dwFileOffsetLow
Un DWORD de orden bajo del desplazamiento del archivo donde se va a comenzar la vista. La combinación de desplazamientos altos y bajos debe especificar un desplazamiento dentro de la asignación de archivos. También deben coincidir con la granularidad de asignación de memoria virtual del sistema. Es decir, el desplazamiento debe ser un múltiplo de la granularidad de asignación de VirtualAlloc. Para obtener la granularidad de asignación de memoria VirtualAlloc del sistema, use la función GetSystemInfo, que rellena los miembros de una estructura de SYSTEM_INFO.
[in] dwNumberOfBytesToMap
Número de bytes de una asignación de archivos que se va a asignar a la vista. Todos los bytes deben estar dentro del tamaño máximo especificado por CreateFileMapping. Si este parámetro es 0 (cero), la asignación se extiende desde el desplazamiento especificado hasta el final de la asignación de archivos.
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es la dirección inicial de la vista asignada.
Si se produce un error en la función, el valor devuelto es NULL. Para obtener información de error extendida, llame a GetLastError.
Observaciones
La asignación de un archivo hace que la parte especificada de un archivo sea visible en el espacio de direcciones del proceso de llamada.
En el caso de los archivos que son mayores que el espacio de direcciones, solo puede asignar una pequeña parte de los datos del archivo a la vez. Una vez completada la primera vista, puede desasignación y asignación de una nueva vista.
Para obtener el tamaño de una vista, use la función VirtualQuery.
Varias vistas de un archivo (o un objeto de asignación de archivos y su archivo asignado) se coherentes si contienen datos idénticos en un momento especificado. Esto ocurre si las vistas de archivo se derivan de cualquier objeto de asignación de archivos respaldado por el mismo archivo. Un proceso puede duplicar un identificador de objeto de asignación de archivos en otro proceso mediante el uso de la función DuplicateHandle
Con una excepción importante, las vistas de archivo derivadas de cualquier objeto de asignación de archivos respaldado por el mismo archivo son coherentes o idénticos en un momento específico. La coherencia se garantiza para las vistas dentro de un proceso y para las vistas asignadas por distintos procesos.
La excepción está relacionada con los archivos remotos. Aunque mapViewOfFile funciona con archivos remotos, no las mantiene coherentes. Por ejemplo, si dos equipos asignan un archivo como grabable y cambian la misma página, cada equipo solo ve sus propias escrituras en la página. Cuando los datos se actualizan en el disco, no se combina.
No se garantiza que una vista asignada de un archivo sea coherente con un archivo al que accede el ReadFile o función writeFile.
No almacene punteros en el archivo asignado a memoria; almacena desplazamientos de la base de la asignación de archivos para que la asignación se pueda usar en cualquier dirección.
Para protegerse frente a excepciones de EXCEPTION_IN_PAGE_ERROR, use el control de excepciones estructurados para proteger cualquier código que escriba o lea desde una vista asignada de memoria de un archivo distinto del archivo de página. Para obtener más información, vea lectura y escritura desde una vista de archivo.
Al modificar un archivo a través de una vista asignada, es posible que la última marca de tiempo de modificación no se actualice automáticamente. Si es necesario, el autor de la llamada debe usar SetFileTime para establecer la marca de tiempo.
Si el archivo de paginación respalda un objeto de asignación de archivos (
Cuando se crea un objeto de asignación de archivos respaldado por el archivo de paginación, el autor de la llamada puede especificar si MapViewOfFile debe reservar y confirmar páginas al mismo tiempo (SEC_COMMIT) o simplemente reservar páginas (SEC_RESERVE). La asignación del archivo hace que todo el intervalo de direcciones virtuales asignado no esté disponible para otras asignaciones del proceso. Después de confirmar una página del intervalo reservado, no se puede liberar ni descommitar llamando a VirtualFree. Las páginas reservadas y confirmadas se liberan cuando la vista no está asignada y se cierra el objeto de asignación de archivos. Para obtener más información, consulte las UnmapViewOfFile
Para tener un archivo con permisos ejecutables, una aplicación debe llamar a CreateFileMapping con PAGE_EXECUTE_READWRITE o PAGE_EXECUTE_READy, a continuación, llamar a MapViewOfFile con FILE_MAP_EXECUTE | FILE_MAP_WRITE o FILE_MAP_EXECUTE | FILE_MAP_READ.
En Windows Server 2012, esta función es compatible con las siguientes tecnologías.
Tecnología | Soportado |
---|---|
Protocolo bloque de mensajes del servidor (SMB) 3.0 | Sí |
Conmutación por error transparente (TFO) de SMB 3.0 | Sí |
SMB 3.0 con recursos compartidos de archivos de escalabilidad horizontal (SO) | Sí |
Sistema de archivos de volumen compartido de clúster (CsvFS) | Sí |
Sistema de archivos resistente (ReFS) | Sí |
Cuando csvFs está en pausa, esta llamada podría producir un error que indica que hay un conflicto de bloqueo.
Ejemplos
Para obtener un ejemplo, vea Crear memoria compartida con nombre.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows XP [solo aplicaciones de escritorio] |
servidor mínimo admitido | Windows Server 2003 [solo aplicaciones de escritorio] |
de la plataforma de destino de |
Windows |
encabezado de |
memoryapi.h (incluya Windows.h, Memoryapi.h) |
biblioteca de |
onecore.lib |
DLL de |
Kernel32.dll |