EngAllocUserMem 宏 (winddi.h)
EngAllocUserMem 函数从当前进程的地址空间中分配内存块,并在分配之前插入调用方提供的标记。
语法
void EngAllocUserMem(
[in] cj,
[in] tag
);
参数
[in] cj
指定要分配的字节数。
[in] tag
指定一个 4 字节 池标记 ,该标记唯一标识执行内存分配的驱动程序。 有关池标记的详细信息,请参阅 ExAllocatePoolWithTag。
返回值
无
备注
基于 NT 的操作系统中的进程具有 4 GB 的虚拟地址空间。 上限 2 GB 是系统内存,只能由内核模式线程访问;此空间在所有进程中都是相同的。 较低的 2 GB 是用户内存,可供用户模式线程和内核模式线程访问;此空间对其进程是唯一的。 EngAllocUserMem 分配的内存是从唯一的 2 GB 用户内存中分配的,因此仅当在分配内存的线程的上下文中调用图形驱动程序时,才可访问。 图形驱动程序始终在调用方上下文中执行;也就是说,图形驱动程序无法切换进程上下文。
EngAllocUserMem 对于只有当前进程使用的大型位图的打印机驱动程序特别有用。 此驱动程序可以从当前进程的地址空间分配空间,而不是从系统池分配空间。 驱动程序需要谨慎使用 EngAllocUserMem 分配的内存,因为应用程序可能会更改此内存。 EngAllocUserMem 只能用于分配相对较大的内存块,因为每次分配至少需要 64 KB 的虚拟地址空间。 永远不要使用此函数分配敏感数据结构。 此外,打印机驱动程序无法将此函数分配的用户内存传递到 EngWritePrinter 。
当不再需要内存时,可以通过调用 EngFreeUserMem 函数来释放内存。
若要从其他进程的地址空间分配用户内存,请使用 EngAllocPrivateUserMem。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 适用于 Windows 2000 及更高版本的 Windows 操作系统。 |
目标平台 | 通用 |
标头 | winddi.h (包括 Winddi.h) |
Library | Win32k.lib |
DLL | Win32k.sys |