Поделиться через


Макрос EngAllocUserMem (winddi.h)

Функция EngAllocUserMem выделяет блок памяти из адресного пространства текущего процесса и вставляет тег, предоставленный вызывающей стороны, перед выделением.

Синтаксис

void EngAllocUserMem(
  [in]  cj,
  [in]  tag
);

Параметры

[in] cj

Указывает число байтов для распределения.

[in] tag

Указывает 4-байтовый тег пула , который однозначно идентифицирует драйвер, который выделяет память. Дополнительные сведения о тегах пула см. в разделе ExAllocatePoolWithTag.

Возвращаемое значение

None

Remarks

Процесс в операционной системе на основе NT имеет 4 ГБ виртуального адресного пространства. Верхние 2 ГБ — это системная память, доступная только потокам режима ядра; это пространство идентично во всех процессах. Меньше 2 ГБ — это пользовательская память, доступная как в пользовательском режиме, так и в потоках режима ядра; это пространство уникально для процесса. Память, выделенная EngAllocUserMem , выделяется из уникальных 2 ГБ пользовательской памяти и, таким образом, доступна только при вызове графического драйвера в контексте потока, в котором была выделена память. Графические драйверы всегда выполняются в контексте вызывающего объекта; то есть графические драйверы не могут переключать контексты процесса.

EngAllocUserMem особенно полезен для драйвера принтера с большими растровыми рисунками, которые будут использоваться только текущим процессом. Вместо выделения из системного пула этот драйвер может выделить место из адресного пространства текущего процесса. Драйверы должны проявлять осторожность с памятью, выделенной EngAllocUserMem, так как приложение может изменить эту память. EngAllocUserMem следует использовать только для выделения относительно больших блоков памяти, так как каждое выделение занимает не менее 64 КБ виртуального адресного пространства. Структуры конфиденциальных данных никогда не следует выделять с помощью этой функции. Кроме того, память пользователя, выделенная этой функцией, не может быть передана в EngWritePrinter драйвером принтера.

Если память больше не требуется, ее можно освободить с помощью вызова функции EngFreeUserMem .

Чтобы выделить память пользователя из адресного пространства другого процесса, используйте EngAllocPrivateUserMem.

Требования

Требование Значение
Минимальная версия клиента Доступно в Windows 2000 и более поздних версиях операционных систем Windows.
Целевая платформа Универсальное
Верхняя часть winddi.h (включая Winddi.h)
Библиотека Win32k.lib
DLL Win32k.sys

См. также раздел

EngAllocPrivateUserMem

EngFreeUserMem