Fonction RtlAllocateHeap (ntifs.h)
La routine RtlAllocateHeap alloue un bloc de mémoire à partir d’un tas.
Syntaxe
NTSYSAPI PVOID RtlAllocateHeap(
[in] PVOID HeapHandle,
[in, optional] ULONG Flags,
[in] SIZE_T Size
);
Paramètres
[in] HeapHandle
Gérez un tas privé à partir duquel la mémoire sera allouée. Ce paramètre est un handle retourné par un appel réussi à RtlCreateHeap .
[in, optional] Flags
Aspects contrôlables de l’allocation de tas. La spécification de l’une de ces valeurs remplace la valeur correspondante spécifiée lors de la création du tas avec RtlCreateHeap. Ce paramètre peut être une ou plusieurs des valeurs suivantes.
Drapeau | Signification |
---|---|
HEAP_GENERATE_EXCEPTIONS | Le système déclenche une exception pour indiquer un échec de fonction, tel qu’une condition de mémoire insuffisante, au lieu de retourner NULL. |
HEAP_NO_SERIALIZE | L’exclusion mutuelle ne sera pas utilisée lorsque RtlAllocateHeap accède au tas. |
HEAP_ZERO_MEMORY | La mémoire allouée est initialisée à zéro. Sinon, la mémoire n’est pas initialisée à zéro. |
[in] Size
Nombre d’octets à allouer. Si le tas, spécifié par le paramètre HeapHandle, est un tas non extensible, Taille doit être inférieur ou égal au seuil de mémoire virtuelle du tas. (Pour plus d’informations, consultez le membre VirtualMemoryThreshold du paramètre Parameters pour RtlCreateHeap.)
Valeur de retour
Si l’appel à RtlAllocateHeap réussit, la valeur de retour est un pointeur vers le bloc nouvellement alloué. La valeur de retour est NULL si l’allocation a échoué.
Remarques
RtlAllocateHeap alloue un bloc de mémoire de la taille spécifiée à partir du tas spécifié.
Pour libérer un bloc de mémoire alloué par RtlAllocateHeap, appelez RtlFreeHeap.
La mémoire allouée par RtlAllocateHeap n’est pas mobile. Étant donné que la mémoire n’est pas mobile, il est possible que le tas devienne fragmenté.
La sérialisation garantit l’exclusion mutuelle lorsque deux threads ou plus tentent d’allouer ou de libérer simultanément des blocs à partir du même tas. Il existe un coût de performances réduit pour la sérialisation, mais il doit être utilisé chaque fois que plusieurs threads allouent et libèrent de la mémoire à partir du même tas. La définition de la valeur HEAP_NO_SERIALIZE élimine l’exclusion mutuelle sur le tas. Sans sérialisation, deux threads ou plus qui utilisent le même handle de tas peuvent tenter d’allouer ou de libérer de la mémoire simultanément, ce qui entraîne probablement une altération dans le tas. La valeur HEAP_NO_SERIALIZE peut donc être utilisée en toute sécurité uniquement dans les situations suivantes :
Le processus n’a qu’un seul thread.
Le processus a plusieurs threads, mais un seul thread appelle les fonctions de tas pour un tas spécifique.
Le processus a plusieurs threads et l’application fournit son propre mécanisme d’exclusion mutuelle à un tas spécifique.
Note
Pour vous protéger contre une violation d’accès, utilisez la gestion des exceptions structurées pour protéger tout code qui écrit ou lit à partir d’un tas. Pour plus d’informations sur la gestion structurée des exceptions avec les accès en mémoire, consultez Gestion des exceptions.
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Windows XP |
plateforme cible | Universel |
d’en-tête | ntifs.h (include Ntifs.h) |
bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |