EngAllocPrivateUserMem マクロ (winddi.h)
EngAllocPrivateUserMem 関数は、指定されたプロセスのアドレス空間からユーザー メモリのブロックを割り当て、呼び出し元が指定したタグを割り当て前に挿入します。
構文
void EngAllocPrivateUserMem(
[in] psl,
[in] cj,
[in] tag
);
パラメーター
[in] psl
割り当てられたメモリを関連付ける Microsoft DirectDraw サーフェスを表す DD_SURFACE_LOCAL 構造体へのポインター。
[in] cj
割り当てるメモリのバイト数を指定します。
[in] tag
メモリ割り当てを行うドライバーを一意に識別する 4 バイト プール タグ を指定します。 プール タグの詳細については、「 ExAllocatePoolWithTag」を参照してください。
戻り値
なし
解説
DirectDraw ドライバーでは、実際のビデオ メモリの代わりにユーザー メモリの "スクラッチ パッド" が必要になる場合があります。 パフォーマンスへの影響により、この方法は推奨されませんが、必要な場合があります。 通常、このスクラッチ メモリは短時間だけ割り当てられます。 メモリが割り当てられた後、目的のグラフィックス操作に使用され、割り当てが解除されます。
サーフェスのロックが解除される前にドライバー インスタンスが破棄されると、問題が発生します。 特定のケースは、ユーザーが Ctrl + Alt + DEL キーを押した結果として、システムが保護されたデスクトップに切り替えたときに発生します。 この状況では、モード スイッチはシステム プロセス コンテキストで実行されます。 ドライバーに未処理のサーフェス ロックがある場合 (サーフェスのロックが解除される前にモード スイッチが発生した場合など)、ドライバーは別のプロセス コンテキストでそのサーフェスを破棄する必要があります。 メモリの割り当て時に使用されたコンテキストとは異なるコンテキストでこのエントリ ポイントが呼び出されると、このエントリ ポイントが失敗するため、ドライバーは EngFreeUserMem を呼び出してスクラッチ メモリの割り当てを解除できません。
この問題に対処するために、EngAllocPrivateUserMem と EngFreePrivateUserMem が用意されています。 これら 2 つの関数は 、EngAllocUserMem と EngFreeUserMem と同じですが、別のプロセス コンテキストに割り当てられたメモリを解放するために必要な追加の作業を行う点が異なります。 プロセス コンテキスト情報は、 psl が指す DirectDraw サーフェス オブジェクトを所有する DirectDraw オブジェクトと共に格納されます。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 以降のバージョンの Windows オペレーティング システムで使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | winddi.h (Winddi.h を含む) |
Library | Win32k.lib |
[DLL] | Win32k.sys |