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

另请参阅

EngAllocPrivateUserMem

EngFreeUserMem