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
Handle pour 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 du 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 prendre une ou plusieurs des valeurs suivantes.
Indicateur | Signification |
---|---|
HEAP_GENERATE_EXCEPTIONS | Le système déclenche une exception pour indiquer une défaillance de fonction, telle 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, la taille doit être inférieure ou égale au seuil de mémoire virtuelle du tas. (Pour plus d’informations, consultez le membre VirtualMemoryThreshold du paramètre Parameters sur RtlCreateHeap.)
Valeur retournée
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 se fragmente.
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 faible coût de performances pour la sérialisation, mais il doit être utilisé chaque fois que plusieurs threads allouent et libèrent de la mémoire 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 risque d’endommager 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 comporte plusieurs threads, mais un seul thread appelle les fonctions de tas pour un tas spécifique.
Le processus comporte plusieurs threads et l’application fournit son propre mécanisme d’exclusion mutuelle à un tas spécifique.
Notes
Pour vous protéger contre une violation d’accès, utilisez la gestion structurée des exceptions pour protéger tout code qui écrit ou lit dans un tas. Pour plus d’informations sur la gestion structurée des exceptions avec accès à la mémoire, consultez Gestion des exceptions.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows XP |
Plateforme cible | Universal |
En-tête | ntifs.h (inclure Ntifs.h) |
Bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |