Share via


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 オペレーティング システムで使用できます。
対象プラットフォーム ユニバーサル
Header winddi.h (Winddi.h を含む)
Library Win32k.lib
[DLL] Win32k.sys

こちらもご覧ください

EngAllocPrivateUserMem

EngFreeUserMem