Funzione RtlAllocateHeap (ntifs.h)
La routine RtlAllocateHeap alloca un blocco di memoria da un heap.
Sintassi
NTSYSAPI PVOID RtlAllocateHeap(
[in] PVOID HeapHandle,
[in, optional] ULONG Flags,
[in] SIZE_T Size
);
Parametri
[in] HeapHandle
Handle per un heap privato da cui verrà allocata la memoria. Questo parametro è un handle restituito da una chiamata riuscita a RtlCreateHeap .
[in, optional] Flags
Aspetti controllabili dell'allocazione dell'heap. Se si specifica uno di questi valori, il valore corrispondente specificato quando è stato creato l'heap con RtlCreateHeap. Questo parametro può essere uno o più dei valori seguenti.
Contrassegno | Significato |
---|---|
HEAP_GENERATE_EXCEPTIONS | Il sistema genererà un'eccezione per indicare un errore di funzione, ad esempio una condizione di memoria insufficiente, anziché restituire NULL. |
HEAP_NO_SERIALIZE | L'esclusione reciproca non verrà usata mentre RtlAllocateHeap accede all'heap. |
HEAP_ZERO_MEMORY | La memoria allocata verrà inizializzata su zero. In caso contrario, la memoria non viene inizializzata su zero. |
[in] Size
Numero di byte da allocare. Se l'heap, specificato dal parametro HeapHandle , è un heap nonrowable, le dimensioni devono essere inferiori o uguali alla soglia di memoria virtuale dell'heap. Per altre informazioni, vedere il membro VirtualMemoryThreshold del parametro Parameters su RtlCreateHeap.
Valore restituito
Se la chiamata a RtlAllocateHeap ha esito positivo, il valore restituito è un puntatore al blocco appena allocato. Il valore restituito è NULL se l'allocazione non è riuscita.
Commenti
RtlAllocateHeap alloca un blocco di memoria delle dimensioni specificate dall'heap specificato.
Per liberare un blocco di memoria allocato da RtlAllocateHeap, chiamare RtlFreeHeap.
La memoria allocata da RtlAllocateHeap non è rimovibile. Poiché la memoria non è rimovibile, è possibile che l'heap diventi frammentato.
La serializzazione garantisce l'esclusione reciproca quando due o più thread tentano di allocare o liberare contemporaneamente blocchi dallo stesso heap. È previsto un costo di prestazioni ridotto per la serializzazione, ma deve essere usato ogni volta che più thread allocano e liberano memoria dallo stesso heap. L'impostazione del valore HEAP_NO_SERIALIZE elimina l'esclusione reciproca nell'heap. Senza serializzazione, due o più thread che usano lo stesso handle heap potrebbero tentare di allocare o liberare memoria contemporaneamente, causando probabilmente danneggiamenti nell'heap. Il valore HEAP_NO_SERIALIZE può quindi essere usato in modo sicuro solo nelle situazioni seguenti:
Il processo ha un solo thread.
Il processo include più thread, ma solo un thread chiama le funzioni heap per un heap specifico.
Il processo include più thread e l'applicazione fornisce il proprio meccanismo per l'esclusione reciproca a un heap specifico.
Nota
Per proteggere una violazione di accesso, usare la gestione delle eccezioni strutturate per proteggere qualsiasi codice che scrive in o legge da un heap. Per altre informazioni sulla gestione delle eccezioni strutturate con gli accessi alla memoria, vedere Gestione delle eccezioni.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows XP |
Piattaforma di destinazione | Universale |
Intestazione | ntifs.h (include Ntifs.h) |
Libreria | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |