Compartir a través de


Función CreateFileMappingFromApp (memoryapi.h)

Crea o abre un objeto de asignación de archivos con nombre o sin nombre para un archivo especificado desde una aplicación de la Tienda Windows.

Sintaxis

HANDLE CreateFileMappingFromApp(
  [in]           HANDLE               hFile,
  [in, optional] PSECURITY_ATTRIBUTES SecurityAttributes,
  [in]           ULONG                PageProtection,
  [in]           ULONG64              MaximumSize,
  [in, optional] PCWSTR               Name
);

Parámetros

[in] hFile

Identificador del archivo desde el que se va a crear un objeto de asignación de archivos.

El archivo debe abrirse con derechos de acceso compatibles con las marcas de protección que especifica el parámetro flProtect. No es necesario, pero se recomienda que los archivos que quiera asignar se abran para el acceso exclusivo. Para obtener más información, vea derechos de acceso y seguridad de archivos.

Si hFile es INVALID_HANDLE_VALUE, el proceso de llamada también debe especificar un tamaño para el objeto de asignación de archivos en el dwMaximumSizeHigh y parámetros dwMaximumSizeLow. En este escenario, CreateFileMappingFromApp crea un objeto de asignación de archivos de un tamaño especificado respaldado por el archivo de paginación del sistema en lugar de un archivo en el sistema de archivos.

[in, optional] SecurityAttributes

Puntero a una estructura de SECURITY_ATTRIBUTES que determina si los procesos secundarios pueden heredar un identificador devuelto. El miembro lpSecurityDescriptor de la estructura SECURITY_ATTRIBUTES especifica un descriptor de seguridad para un nuevo objeto de asignación de archivos.

Si securityAttributes es null, el identificador no se puede heredar y el objeto de asignación de archivos obtiene un descriptor de seguridad predeterminado. Las listas de control de acceso (ACL) del descriptor de seguridad predeterminado para un objeto de asignación de archivos proceden del token principal o de suplantación del creador. Para obtener más información, vea seguridad de asignación de archivos y derechos de acceso.

[in] PageProtection

Especifica la protección de páginas del objeto de asignación de archivos. Todas las vistas asignadas del objeto deben ser compatibles con esta protección.

Este parámetro puede ser uno de los siguientes valores.

Valor Significado
PAGE_READONLY
0x02
Permite asignar vistas para el acceso de solo lectura o copia en escritura. Un intento de escribir en una región específica produce una infracción de acceso.

El identificador de archivo que el parámetro hFile especifica debe crearse con el derecho de acceso GENERIC_READ.

PAGE_READWRITE
0x04
Permite asignar vistas para el acceso de solo lectura, copia en escritura o lectura y escritura.

El identificador de archivo que el parámetro hFile especifica debe crearse con los derechos de acceso GENERIC_READ y GENERIC_WRITE.

PAGE_WRITECOPY
0x08
Permite asignar vistas para el acceso de solo lectura o copia en escritura. Este valor es equivalente a PAGE_READONLY.

El identificador de archivo que el parámetro hFile especifica debe crearse con el derecho de acceso GENERIC_READ.

 

Una aplicación puede especificar uno o varios de los atributos siguientes para el objeto de asignación de archivos si los combina con uno de los valores de protección de página anteriores.

Valor Significado
SEC_COMMIT
0x8000000
Si el archivo de paginación del sistema operativo respalda el objeto de asignación de archivos (el parámetro hfile es INVALID_HANDLE_VALUE), especifica que cuando se asigna una vista del archivo a un espacio de direcciones de proceso, se confirma todo el intervalo de páginas en lugar de reservado. El sistema debe tener suficientes páginas confirmables para contener toda la asignación. De lo contrario, se produce un error en el CreateFileMappingFromApp.

Este atributo no tiene ningún efecto para los objetos de asignación de archivos respaldados por archivos de imagen ejecutables o archivos de datos (el parámetro hfile es un identificador de un archivo).

SEC_COMMIT no se puede combinar con SEC_RESERVE.

Si no se especifica ningún atributo, se supone SEC_COMMIT.

SEC_IMAGE_NO_EXECUTE
0x11000000
Especifica que el archivo que especifica el parámetro hFile es un archivo de imagen ejecutable que no se ejecutará y el archivo de imagen cargado no tendrá ninguna comprobación de integridad forzada ejecutada. Además, la asignación de una vista de un objeto de asignación de archivos creado con el atributo SEC_IMAGE_NO_EXECUTE no invocará las devoluciones de llamada del controlador registradas mediante la API de kernel de psSetLoadImageNotifyRoutine .

El atributo SEC_IMAGE_NO_EXECUTE debe combinarse con el valor de protección de página PAGE_READONLY. Ningún otro atributo es válido con SEC_IMAGE_NO_EXECUTE.

SEC_LARGE_PAGES
0x80000000
Permite usar páginas grandes para los objetos de asignación de archivos respaldados por el archivo de paginación del sistema operativo (el parámetro hfile es INVALID_HANDLE_VALUE). Este atributo no se admite para los objetos de asignación de archivos respaldados por archivos de imagen ejecutables o archivos de datos (el parámetro hFile es un identificador de una imagen ejecutable o un archivo de datos).

El tamaño máximo del objeto de asignación de archivos debe ser un múltiplo del tamaño mínimo de una página grande devuelta por la función GetLargePageMinimum. Si no es así, error createFileMappingFromApp. Al asignar una vista de un objeto de asignación de archivos creado con SEC_LARGE_PAGES, la dirección base y el tamaño de la vista también deben ser múltiplo del tamaño mínimo de página grande.

SEC_LARGE_PAGES requiere que el privilegio SeLockMemoryPrivilege esté habilitado en el token del autor de la llamada.

Si se especifica SEC_LARGE_PAGES, también se debe especificar SEC_COMMIT.

SEC_NOCACHE
0x10000000
Establece que todas las páginas no se puedan almacenar en caché.

Las aplicaciones no deben usar este atributo, excepto cuando se requiera explícitamente para un dispositivo. El uso de las funciones interbloqueadas con memoria asignada con SEC_NOCACHE puede dar lugar a una excepción de EXCEPTION_ILLEGAL_INSTRUCTION.

SEC_NOCACHE requiere que se establezca el atributo SEC_RESERVE o SEC_COMMIT.

SEC_RESERVE
0x4000000
Si el archivo de paginación del sistema operativo respalda el objeto de asignación de archivos (el parámetro hfile es INVALID_HANDLE_VALUE), especifica que cuando se asigna una vista del archivo a un espacio de direcciones de proceso, el intervalo completo de páginas se reserva para su uso posterior en lugar de confirmarse.

Las páginas reservadas se pueden confirmar en llamadas posteriores a la función VirtualAlloc. Una vez confirmadas las páginas, no se pueden liberar ni descommitar con la función virtualFree de .

Este atributo no tiene ningún efecto para los objetos de asignación de archivos respaldados por archivos de imagen ejecutables o archivos de datos (el parámetro hfile es un identificador de un archivo).

SEC_RESERVE no se puede combinar con SEC_COMMIT.

SEC_WRITECOMBINE
0x40000000
Establece todas las páginas que se van a combinar.

Las aplicaciones no deben usar este atributo, excepto cuando se requiera explícitamente para un dispositivo. El uso de las funciones interbloqueadas con memoria asignada con SEC_WRITECOMBINE puede dar lugar a una excepción de EXCEPTION_ILLEGAL_INSTRUCTION.

SEC_WRITECOMBINE requiere que se establezca el atributo SEC_RESERVE o SEC_COMMIT.

[in] MaximumSize

Tamaño máximo del objeto de asignación de archivos.

Se produce un error al intentar asignar un archivo con una longitud de 0 (cero) con un código de error de ERROR_FILE_INVALID. Las aplicaciones deben probar los archivos con una longitud de 0 (cero) y rechazar esos archivos.

[in, optional] Name

Nombre del objeto de asignación de archivos.

Si este parámetro coincide con el nombre de un objeto de asignación existente, la función solicita acceso al objeto con la protección que flProtect especifica.

Si este parámetro es NULL, el objeto de asignación de archivos se crea sin un nombre.

Si lpName coincide con el nombre de un evento existente, semáforo, exclusión mutua, temporizador de espera o objeto de trabajo, se produce un error en la función y la función GetLastError devuelve ERROR_INVALID_HANDLE. Esto ocurre porque estos objetos comparten el mismo espacio de nombres.

El nombre puede tener un prefijo "Global" o "Local" para crear explícitamente el objeto en el espacio de nombres global o de sesión. El resto del nombre puede contener cualquier carácter excepto el carácter de barra diagonal inversa (\). La creación de un objeto de asignación de archivos en el espacio de nombres global desde una sesión distinta de la sesión cero requiere el privilegio SeCreateGlobalPrivilege. Para obtener más información, vea espacios de nombres de objeto kernel.

El cambio rápido de usuario se implementa mediante sesiones de Terminal Services. El primer usuario en iniciar sesión usa la sesión 0 (cero), el siguiente usuario para iniciar sesión usa la sesión 1 (una), etc. Los nombres de objeto de kernel deben seguir las directrices que se describen para Terminal Services para que las aplicaciones puedan admitir varios usuarios.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es un identificador del objeto de asignación de archivos recién creado.

Si el objeto existe antes de la llamada de función, la función devuelve un identificador al objeto existente (con su tamaño actual, no el tamaño especificado) y GetLastError devuelve ERROR_ALREADY_EXISTS.

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

Después de crear un objeto de asignación de archivos, el tamaño del archivo no debe superar el tamaño del objeto de asignación de archivos; si lo hace, no todo el contenido del archivo está disponible para compartirlo.

Si una aplicación especifica un tamaño para el objeto de asignación de archivos que es mayor que el tamaño del archivo con nombre real en el disco y si la protección de páginas permite el acceso de escritura (es decir, el parámetro flProtect especifica PAGE_READWRITE), el archivo en el disco aumenta para que coincida con el tamaño especificado del objeto de asignación de archivos. Si el archivo se extiende, no se garantiza que el contenido del archivo entre el extremo anterior del archivo y el nuevo final del archivo sea cero; el comportamiento se define mediante el sistema de archivos. Si no se puede aumentar el archivo en el disco, error CreateFileMappingFromApp y GetLastError devuelve ERROR_DISK_FULL.

El contenido inicial de las páginas de un objeto de asignación de archivos respaldado por el archivo de paginación del sistema operativo es 0 (cero).

El identificador que CreateFileMappingFromApp devuelve tiene acceso completo a un nuevo objeto de asignación de archivos y se puede usar con cualquier función que requiera un identificador para un objeto de asignación de archivos.

Varios procesos pueden compartir una vista del mismo archivo mediante un único objeto de asignación de archivos compartido o creando objetos de asignación de archivos independientes respaldados por el mismo archivo. Varios procesos pueden compartir un único objeto de asignación de archivos mediante la herencia del identificador en la creación del proceso, la duplicación del identificador o la apertura del objeto de asignación de archivos por nombre. Para obtener más información, consulte las funciones CreateProcess, DuplicateHandle y OpenFileMapping.

La creación de un objeto de asignación de archivos no asigna realmente la vista a un espacio de direcciones de proceso. La función MapViewOfFileEx asigna una vista de un archivo en un espacio de direcciones de proceso.

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 CreateFileMappingFromApp funciona con archivos remotos, no los 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.

Un archivo asignado y un archivo al que se accede mediante las funciones de entrada y salida (E/S) (ReadFile y WriteFile) no son necesariamente coherentes.

Las vistas asignadas de un objeto de asignación de archivos mantienen referencias internas al objeto y un objeto de asignación de archivos no se cierra hasta que se liberan todas las referencias a él. Por lo tanto, para cerrar completamente un objeto de asignación de archivos, una aplicación debe desasignar todas las vistas asignadas del objeto de asignación de archivos llamando a UnmapViewOfFile y cerrar el identificador de objeto de asignación de archivos llamando a CloseHandle. Estas funciones se pueden llamar en cualquier orden.

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.

Use el control de excepciones estructurados para proteger cualquier código que escriba o lea desde una vista de archivo. Para obtener más información, vea lectura y escritura desde una vista de archivo.

Solo puedes solicitar correctamente la protección ejecutable si la aplicación tiene la funcionalidad codeGeneration.

Requisitos

Requisito Valor
cliente mínimo admitido Windows 8 [aplicaciones de escritorio | Aplicaciones para UWP]
servidor mínimo admitido Windows Server 2012 [aplicaciones de escritorio | Aplicaciones para UWP]
de la plataforma de destino de Windows
encabezado de memoryapi.h (incluya Windows.h)
biblioteca de onecore.lib
DLL de Kernel32.dll

Consulte también

CloseHandle

CreateFileMapping

crear un objeto de asignación de archivos

DuplicateHandle

Funciones de asignación de archivos

MapViewOfFile

MapViewOfFileEx

funciones de administración de memoria

OpenFileMapping

ReadFile

SECURITY_ATTRIBUTES

UnmapViewOfFile

VirtualAlloc

WriteFile