Macro EngAllocUserMem (winddi.h)
La fonction EngAllocUserMem alloue un bloc de mémoire à partir de l’espace d’adressage du processus en cours et insère une balise fournie par l’appelant avant l’allocation.
Syntaxe
void EngAllocUserMem(
[in] cj,
[in] tag
);
Paramètres
[in] cj
Spécifie le nombre d'octets à allouer.
[in] tag
Spécifie une balise de pool de 4 octets qui identifie de manière unique le pilote qui effectue l’allocation de mémoire. Pour plus d’informations sur les balises de pool, consultez ExAllocatePoolWithTag.
Valeur de retour
None
Remarques
Un processus dans un système d’exploitation NT a 4 Go d’espace d’adressage virtuel. Les 2 Go supérieurs correspondent à la mémoire système accessible uniquement aux threads en mode noyau ; cet espace est identique pour tous les processus. Les 2 Go inférieurs correspondent à la mémoire utilisateur qui est accessible aux threads en mode utilisateur et en mode noyau ; cet espace est propre à son processus. La mémoire allouée par EngAllocUserMem est allouée à partir des 2 Go uniques de mémoire utilisateur et n’est donc accessible que lorsque le pilote graphique est appelé dans le contexte du thread dans lequel la mémoire a été allouée. Les pilotes graphiques s’exécutent toujours dans le contexte de l’appelant ; autrement dit, les pilotes graphiques ne peuvent pas changer de contexte de processus.
EngAllocUserMem est particulièrement utile pour un pilote d’imprimante avec de grandes bitmaps qui seront utilisées uniquement par le processus actuel. Plutôt que d’allouer à partir du pool système, ce pilote peut à la place allouer de l’espace d’adressage du processus actuel. Les pilotes doivent faire preuve de soin avec la mémoire allouée par EngAllocUserMem, car il est possible pour l’application de modifier cette mémoire. EngAllocUserMem doit uniquement être utilisé pour allouer des blocs de mémoire relativement volumineux, car chaque allocation prend au moins 64 Ko d’espace d’adressage virtuel. Les structures de données sensibles ne doivent jamais être allouées à l’aide de cette fonction. En outre, la mémoire utilisateur allouée par cette fonction ne peut pas être transmise à EngWritePrinter par le pilote d’imprimante.
Lorsque la mémoire n’est plus nécessaire, elle peut être libérée par un appel à la fonction EngFreeUserMem .
Pour allouer de la mémoire utilisateur à partir de l’espace d’adressage d’un autre processus, utilisez EngAllocPrivateUserMem.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Disponible dans Windows 2000 et versions ultérieures des systèmes d’exploitation Windows. |
Plateforme cible | Universal |
En-tête | winddi.h (inclure Winddi.h) |
Bibliothèque | Win32k.lib |
DLL | Win32k.sys |