Función RtlAllocateHeap (ntifs.h)
La rutina RtlAllocateHeap asigna un bloque de memoria de un montón.
Sintaxis
NTSYSAPI PVOID RtlAllocateHeap(
[in] PVOID HeapHandle,
[in, optional] ULONG Flags,
[in] SIZE_T Size
);
Parámetros
[in] HeapHandle
Identificador de un montón privado desde el que se asignará la memoria. Este parámetro es un identificador devuelto de una llamada correcta a RtlCreateHeap .
[in, optional] Flags
Aspectos controlables de la asignación del montón. Al especificar cualquiera de estos valores, se invalidará el valor correspondiente especificado cuando se creó el montón con RtlCreateHeap. Este parámetro puede ser uno o varios de los siguientes valores.
Bandera | Significado |
---|---|
HEAP_GENERATE_EXCEPTIONS | El sistema generará una excepción para indicar un error de función, como una condición de memoria insuficiente, en lugar de devolver NULL. |
HEAP_NO_SERIALIZE | No se usará la exclusión mutua mientras rtlAllocateHeap accede al montón. |
HEAP_ZERO_MEMORY | La memoria asignada se inicializará en cero. De lo contrario, la memoria no se inicializa en cero. |
[in] Size
Número de bytes que se van a asignar. Si el montón, especificado por el parámetro HeapHandle, es un montón no crecimiento, Tamaño debe ser menor o igual que el umbral de memoria virtual del montón. (Para obtener más información, consulte el miembro VirtualMemoryThreshold del parámetro Parameters para RtlCreateHeap).
Valor devuelto
Si la llamada a RtlAllocateHeap se realiza correctamente, el valor devuelto es un puntero al bloque recién asignado. El valor devuelto es NULL si se produjo un error en la asignación.
Observaciones
RtlAllocateHeap asigna un bloque de memoria del tamaño especificado del montón especificado.
Para liberar un bloque de memoria asignado por RtlAllocateHeap, llame a RtlFreeHeap.
La memoria asignada por RtlAllocateHeap no es extraíble. Dado que la memoria no es extraíble, es posible que el montón se fragmente.
La serialización garantiza la exclusión mutua cuando dos o más subprocesos intentan asignar o liberar bloques simultáneamente del mismo montón. Hay un pequeño costo de rendimiento para la serialización, pero se debe usar cada vez que varios subprocesos asignan y liberan memoria del mismo montón. Establecer el valor de HEAP_NO_SERIALIZE elimina la exclusión mutua en el montón. Sin serialización, dos o más subprocesos que usan el mismo identificador de montón podrían intentar asignar o liberar memoria simultáneamente, lo que probablemente causaría daños en el montón. Por lo tanto, el valor de HEAP_NO_SERIALIZE solo se puede usar de forma segura en las siguientes situaciones:
El proceso solo tiene un subproceso.
El proceso tiene varios subprocesos, pero solo un subproceso llama a las funciones del montón para un montón específico.
El proceso tiene varios subprocesos y la aplicación proporciona su propio mecanismo para la exclusión mutua a un montón específico.
Nota
Para protegerse contra una infracción de acceso, use el control de excepciones estructurados para proteger cualquier código que escriba en un montón o lea desde él. Para obtener más información sobre el control estructurado de excepciones con accesos a memoria, consulte Control de excepciones.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows XP |
de la plataforma de destino de | Universal |
encabezado de | ntifs.h (incluya Ntifs.h) |
biblioteca de | NtosKrnl.lib |
DLL de | NtosKrnl.exe |
irQL | < DISPATCH_LEVEL |