Función VirtualAlloc2FromApp (memoryapi.h)
Reserva, confirma o cambia el estado de una región de páginas en el espacio de direcciones virtuales del proceso de llamada. La memoria asignada por esta función se inicializa automáticamente en cero.
Con esta función, puede: para las nuevas asignaciones, especificar un intervalo de espacio de direcciones virtuales y una restricción de alineación de potencia de 2; especifique un número arbitrario de parámetros extendidos; especifique un nodo NUMA preferido para la memoria física como parámetro extendido; y especifican una operación de marcador de posición (específicamente, reemplazo).
Para especificar el nodo NUMA, consulte el parámetro ExtendedParameters.
Sintaxis
PVOID VirtualAlloc2FromApp(
[in, optional] HANDLE Process,
[in, optional] PVOID BaseAddress,
[in] SIZE_T Size,
[in] ULONG AllocationType,
[in] ULONG PageProtection,
[in, out, optional] MEM_EXTENDED_PARAMETER *ExtendedParameters,
[in] ULONG ParameterCount
);
Parámetros
[in, optional] Process
Identificador de un proceso. La función asigna memoria dentro del espacio de direcciones virtual de este proceso.
El identificador debe tener el PROCESS_VM_OPERATION derecho de acceso. Para obtener más información, consulte Derechos de acceso y seguridad de procesos.
[in, optional] BaseAddress
Puntero que especifica una dirección inicial deseada para la región de páginas que desea asignar.
Si BaseAddress es null, la función determina dónde asignar la región.
Si BaseAddress no es null, cualquier estructura de MEM_ADDRESS_REQUIREMENTS proporcionada debe constar de todos los ceros y la dirección base debe ser un múltiplo de la granularidad de asignación del sistema. Para determinar la granularidad de asignación, use la función GetSystemInfo.
[in] Size
Tamaño de la región de memoria que se va a asignar, en bytes.
El tamaño siempre debe ser un múltiplo del tamaño de página.
Si BaseAddress no es NULL, la función asigna todas las páginas que contienen uno o más bytes en el intervalo desde BaseAddress a BaseAddress+Size. Esto significa, por ejemplo, que un intervalo de 2 bytes que extiende un límite de página hace que la función asigne ambas páginas.
[in] AllocationType
Tipo de asignación de memoria. Este parámetro debe contener uno de los siguientes valores.
Valor | Significado |
---|---|
|
Asigna cargos de memoria (del tamaño general de la memoria y de los archivos de paginación en el disco) para las páginas de memoria reservadas especificadas. La función también garantiza que cuando el autor de la llamada accede inicialmente a la memoria, el contenido será cero. Las páginas físicas reales no se asignan a menos que se acceda realmente a las direcciones virtuales o hasta que se acceda a ellas.
Para reservar y confirmar páginas en un paso, llame a virtual2AllocFromApp con Si se intenta confirmar un intervalo de direcciones específico, se especifica MEM_COMMIT sin MEM_RESERVE y unNULLBaseAddress se produce un error a menos que ya se haya reservado todo el intervalo. El código de error resultante es ERROR_INVALID_ADDRESS. Un intento de confirmar una página que ya está confirmada no hace que se produzca un error en la función. Esto significa que puede confirmar páginas sin determinar primero el estado de compromiso actual de cada página. |
|
Reserva un intervalo del espacio de direcciones virtuales del proceso sin asignar ningún almacenamiento físico real en memoria o en el archivo de paginación en el disco.
Puede confirmar páginas reservadas en llamadas posteriores a la función Otras funciones de asignación de memoria, como malloc y LocalAlloc, no pueden usar un intervalo reservado de memoria hasta que se libere. |
|
Reemplaza un marcador de posición por una asignación privada normal. Solo se admiten vistas de sección con copia de seguridad de datos o pf (sin imágenes, memoria física, etcetera.). Al reemplazar un marcador de posición, BaseAddress y Size deben coincidir exactamente con los del marcador de posición y cualquier estructura de MEM_ADDRESS_REQUIREMENTS proporcionada debe constar de todos los ceros.
Después de reemplazar un marcador de posición por una asignación privada, para liberar esa asignación a un marcador de posición, consulte el parámetro dwFreeType de VirtualFree y VirtualFreeEx. Un marcador de posición es un tipo de región de memoria reservada. |
|
Para crear un marcador de posición, llame VirtualAlloc2 con MEM_RESERVE | MEM_RESERVE_PLACEHOLDER y PageProtection establezca en PAGE_NOACCESS. Para liberar, dividir o fusionar un marcador de posición, consulte el parámetro dwFreeType de VirtualFree y VirtualFreeEx.
Un marcador de posición es un tipo de región de memoria reservada. |
|
Indica que los datos del intervalo de memoria especificados por BaseAddress y Size ya no son de interés. Las páginas no deben leerse ni escribirse en el archivo de paginación. Sin embargo, el bloque de memoria se usará de nuevo más adelante, por lo que no debe descommitido. Este valor no se puede usar con ningún otro valor.
El uso de este valor no garantiza que el intervalo operado con MEM_RESET contendrá ceros. Si desea que el intervalo contenga ceros, descommita la memoria y, a continuación, vuelva a enviarla. Al especificar MEM_RESET, la función Virtual2AllocFromApp omite el valor de Protection. Sin embargo, debe establecer Protection en un valor de protección válido, como PAGE_NOACCESS. Virtual2AllocFromApp devuelve un error si usa MEM_RESET y el intervalo de memoria se asigna a un archivo. Una vista compartida solo es aceptable si se asigna a un archivo de paginación. |
|
MEM_RESET_UNDO solo se debe llamar en un intervalo de direcciones al que MEM_RESET se aplicó correctamente anteriormente. Indica que los datos del intervalo de memoria especificado por BaseAddress y Size es de interés para el autor de la llamada e intenta invertir los efectos de MEM_RESET. Si la función se ejecuta correctamente, significa que todos los datos del intervalo de direcciones especificados están intactos. Si se produce un error en la función, al menos algunos de los datos del intervalo de direcciones se han reemplazado por ceros.
Este valor no se puede usar con ningún otro valor. Si se llama a MEM_RESET_UNDO en un intervalo de direcciones que no se MEM_RESET anteriormente, el comportamiento no está definido. Al especificar MEM_RESET, la función Virtual2AllocFromApp omite el valor de Protection. Sin embargo, debe establecer Protection en un valor de protección válido, como PAGE_NOACCESS. |
Este parámetro también puede especificar los siguientes valores como se indica.
Valor | Significado |
---|---|
|
Asigna memoria mediante compatibilidad con páginas grandes.
El tamaño y la alineación deben ser varios de los mínimos de página grande. Para obtener este valor, use la función GetLargePageMinimum. Si especifica este valor, también debe especificar MEM_RESERVE y MEM_COMMIT. |
|
Reserva un intervalo de direcciones que se puede usar para asignar páginas extensiones de ventana de direcciones (AWE).
Este valor se debe usar con MEM_RESERVE y ningún otro valor. |
|
Asigna memoria en la dirección más alta posible. Esto puede ser más lento que las asignaciones normales, especialmente cuando hay muchas asignaciones. |
|
Hace que el sistema realice un seguimiento de las páginas escritas en la región asignada. Si especifica este valor, también debe especificar MEM_RESERVE.
Para recuperar las direcciones de las páginas en las que se ha escrito desde que se asignó la región o se restableció el estado de seguimiento de escritura, llame a la función getWriteWatch de |
[in] PageProtection
Protección de memoria para la región de páginas que se va a asignar. Si se confirman las páginas, puede especificar una de las constantes de protección de memoria . Las constantes siguientes generan un error:
- PAGE_EXECUTE
- PAGE_EXECUTE_READ
- PAGE_EXECUTE_READWRITE
- PAGE_EXECUTE_WRITECOPY
[in, out, optional] ExtendedParameters
Puntero opcional a uno o varios parámetros extendidos de tipo MEM_EXTENDED_PARAMETER. Cada uno de esos valores de parámetro extendidos puede tener un campo Type de MemExtendedParameterAddressRequirements o MemExtendedParameterNumaNode. Si no se proporciona ningún parámetro extendido MemExtendedParameterNumaNode, el comportamiento es el mismo que para las funciones VirtualAlloc/MapViewOfFile (es decir, el nodo NUMA preferido para las páginas físicas se determina en función del procesador ideal del subproceso que accede primero a la memoria).
[in] ParameterCount
Número de parámetros extendidos a los que apunta ExtendedParameters.
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es la dirección base de la región asignada de páginas.
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
Esta API ayuda a admitir juegos de alto rendimiento y aplicaciones de servidor, que tienen requisitos específicos para administrar su espacio de direcciones virtual. Por ejemplo, asignar memoria encima de una región reservada anteriormente; esto resulta útil para implementar un búfer de anillo de ajuste automático. Y asignar memoria con alineación específica; por ejemplo, para permitir que la aplicación confirme regiones asignadas a páginas grandes o enormes a petición.
Puedes llamar a Virtual2AllocFromApp desde aplicaciones de la Tienda Windows con funcionalidades Just-In-Time (JIT) para usar la funcionalidad JIT. La aplicación debe incluir la funcionalidad codeGeneration en el archivo de manifiesto de la aplicación para usar las funcionalidades JIT.
Cada página tiene un estado de página de asociado. La función virtual2AllocFromApp puede realizar las siguientes operaciones:
- Confirmación de una región de páginas reservadas
- Reserva de una región de páginas gratuitas
- Reservar y confirmar simultáneamente una región de páginas gratuitas
Puede usar virtual2AllocFromApp para reservar un bloque de páginas y, a continuación, realizar llamadas adicionales a virtual2AllocFromApp para confirmar páginas individuales desde el bloque reservado. Esto permite que un proceso reserve un intervalo de su espacio de direcciones virtual sin consumir almacenamiento físico hasta que sea necesario.
Si el parámetro
virtual2AllocFromApp no permite la creación de páginas ejecutables.
La función Virtual2AllocFromApp se puede usar para reservar una región de extensiones de ventanas de direcciones (AWE) de memoria dentro del espacio de direcciones virtual de un proceso especificado. Después, esta región de memoria se puede usar para asignar páginas físicas dentro y fuera de la memoria virtual según lo requiera la aplicación. Los valores
La función virtualFree
Al crear una región que será ejecutable, el programa de llamada asume la responsabilidad de garantizar la coherencia de caché a través de una llamada adecuada a FlushInstructionCache una vez establecido el código. De lo contrario, los intentos de ejecutar código fuera de la región ejecutable recién pueden producir resultados impredecibles.
Ejemplos
Para obtener ejemplos de código, consulte virtual2Alloc.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows 10 [solo aplicaciones de escritorio] |
servidor mínimo admitido | Windows Server 2016 [solo aplicaciones de escritorio] |
de la plataforma de destino de |
Windows |
encabezado de |
memoryapi.h (incluya Windows.h) |
biblioteca de |
WindowsApp.lib |
DLL de |
Kernel32.dll |