VirtualAllocFromApp 関数 (memoryapi.h)

呼び出し元プロセスの仮想アドレス空間内のページ領域の状態を予約、コミット、または変更します。 この関数によって割り当てられたメモリは、自動的に 0 に初期化されます。

構文

PVOID VirtualAllocFromApp(
  [in, optional] PVOID  BaseAddress,
  [in]           SIZE_T Size,
  [in]           ULONG  AllocationType,
  [in]           ULONG  Protection
);

パラメーター

[in, optional] BaseAddress

割り当てるリージョンの開始アドレス。 メモリが予約されている場合、指定されたアドレスは、割り当て粒度の最も近い倍数に切り捨てられます。 メモリが既に予約されていて、コミットされている場合、アドレスは次のページ境界に切り捨てられます。 ホスト コンピューター上のページのサイズと割り当ての細分性を確認するには、 GetSystemInfo 関数を使用します。 このパラメーターが NULL の場合、システムはリージョンを割り当てる場所を決定します。

[in] Size

リージョンのサイズ (バイト単位)。 BaseAddress パラメーターが NULL の場合、この値は次のページ境界に切り上げられます。 それ以外の場合、割り当てられたページには、BaseAddress から BaseAddress+ Size までの範囲内の 1 つ以上のバイトを含むすべてのページが含まれます。 つまり、ページ境界にまたがる 2 バイト範囲では、両方のページが割り当てられた領域に含まれます。

[in] AllocationType

メモリ割り当ての種類。 このパラメーターには、次のいずれかの値が含まれている必要があります。

説明
MEM_COMMIT
0x00001000
指定された予約済みメモリ ページに対して (メモリの全体的なサイズとディスク上のページング ファイルから) メモリ料金を割り当てます。 また、関数は、呼び出し元が後でメモリに最初にアクセスするときに、内容が 0 になることも保証します。 仮想アドレスが実際にアクセスされるまで、実際の物理ページは割り当てられません。

1 つのステップでページを予約してコミットするには、 を使用して MEM_COMMIT | MEM_RESERVEVirtualAllocFromApp を呼び出します。

MEM_RESERVEを指定せずに MEM_COMMITを指定して特定のアドレス範囲をコミットしようとすると、範囲全体が既に予約されていない限り、NULL 以外の BaseAddress が失敗します。 結果のエラー コードは ERROR_INVALID_ADDRESS

既にコミットされているページをコミットしようとしても、関数は失敗しません。 つまり、各ページの現在のコミットメント状態を最初に決定することなく、ページをコミットできます。

MEM_RESERVE
0x00002000
メモリまたはディスク上のページング ファイルに実際の物理ストレージを割り当てずに、プロセスの仮想アドレス空間の範囲を予約します。

予約ページは、 VirtualAllocFromApp 関数の後続の呼び出しでコミットできます。 1 つのステップでページを予約してコミットするには、MEM_COMMIT MEM_RESERVE | を使用して VirtualAllocFromApp を呼び出します。

mallocLocalAlloc などの他のメモリ割り当て関数では、解放されるまで予約されたメモリ範囲を使用できません。

MEM_RESET
0x00080000
BaseAddressSize で指定されたメモリ範囲内のデータが関心を持たなくなったことを示します。 ページをページング ファイルから読み取ったり、ページング ファイルに書き込んだりしないでください。 ただし、メモリ ブロックは後で再度使用されるため、デコミットしないでください。 この値は、他の値と共に使用することはできません。

この値を使用しても、 MEM_RESET で操作される範囲にゼロが含まれる保証はありません。 範囲にゼロを含める場合は、メモリをデコミットしてから、再コミットします。

MEM_RESETを指定すると、VirtualAllocFromApp 関数は Protection の値を無視します。 ただし、引き続き [保護] を有効な保護値 ( PAGE_NOACCESS など) に設定する必要があります。

MEM_RESETを使用し、メモリの範囲がファイルにマップされている場合、VirtualAllocFromApp はエラーを返します。 共有ビューは、ページング ファイルにマップされている場合にのみ使用できます。

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO は、MEM_RESETが正常に 適用されたアドレス 範囲でのみ呼び出す必要があります。 これは、BaseAddress および Size で指定された指定されたメモリ範囲内のデータが呼び出し元にとって重要であることを示し、MEM_RESETの影響を元に戻そうとします。 関数が成功した場合は、指定されたアドレス範囲のすべてのデータはそのままであることを意味します。 関数が失敗した場合、アドレス範囲のデータの少なくとも一部がゼロに置き換えられました。

この値は、他の値と共に使用することはできません。 以前 にMEM_RESET されなかったアドレス範囲で MEM_RESET_UNDO が呼び出された場合、動作は未定義です。 MEM_RESETを指定すると、VirtualAllocFromApp 関数は Protection の値を無視します。 ただし、引き続き [保護] を有効な保護値 ( PAGE_NOACCESS など) に設定する必要があります。

 

このパラメーターは、示されているとおりに次の値を指定することもできます。

説明
MEM_LARGE_PAGES
0x20000000
大きなページのサポートを使用してメモリを割り当てます。

サイズと配置は、大きなページの最小値の倍数である必要があります。 この値を取得するには、 GetLargePageMinimum 関数を使用します。

この値を指定する場合は、 MEM_RESERVEMEM_COMMITも指定する必要があります。

MEM_PHYSICAL
0x00400000
アドレスウィンドウ拡張 (AWE) ページのマップに使用できるアドレス範囲を予約します。

この値は 、MEM_RESERVE で使用する必要があり、その他の値は使用できません。

MEM_TOP_DOWN
0x00100000
可能な限り高いアドレスでメモリを割り当てます。 これは、特に割り当てが多い場合に、通常の割り当てよりも遅くなる可能性があります。
MEM_WRITE_WATCH
0x00200000
システムが割り当てられたリージョン内の に書き込まれたページを追跡します。 この値を指定する場合は、 MEM_RESERVEも指定する必要があります。

リージョンが割り当てられたか、書き込み追跡状態がリセットされた後に書き込まれたページのアドレスを取得するには、 GetWriteWatch 関数を呼び出します。 書き込み追跡状態をリセットするには、 GetWriteWatch または ResetWriteWatch を呼び出します。 書き込み追跡機能は、リージョンが解放されるまでメモリ領域で有効なままです。

[in] Protection

割り当てられるページの領域のメモリ保護。 ページがコミットされている場合は、 メモリ保護定数のいずれかを指定できます。 次の定数を使用すると、エラーが発生します。

  • PAGE_EXECUTE
  • PAGE_EXECUTE_READ
  • PAGE_EXECUTE_READWRITE
  • PAGE_EXECUTE_WRITECOPY

戻り値

関数が成功した場合、戻り値はページの割り当てられた領域のベース アドレスです。

関数が失敗した場合は、返される値は NULL です。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

Just-In-Time (JIT) 機能を持つ Windows ストア アプリから VirtualAllocFromApp を呼び出して、JIT 機能を使用できます。 アプリは、JIT 機能を使用するために、アプリ マニフェスト ファイルに codeGeneration 機能を含める必要があります。

各ページには、関連付けられた ページの状態がありますVirtualAllocFromApp 関数は、次の操作を実行できます。

  • 予約ページのリージョンをコミットする
  • 無料ページのリージョンを予約する
  • 無料ページの領域を同時に予約してコミットする
VirtualAllocFromApp は 予約ページを予約できません。 既にコミットされているページをコミットできます。 つまり、既にコミットされているかどうかに関係なく、ページの範囲をコミットでき、関数は失敗しません。

VirtualAllocFromApp を使用してページブロックを予約し、VirtualAllocFromApp を追加呼び出して予約ブロックから個々のページをコミットできます。 こうすることで、プロセスで必要になるまで物理ストレージを使わずに、仮想アドレス空間の範囲を予約することができます。

BaseAddress パラメーターが NULL でない場合、関数は BaseAddress パラメーターと Size パラメーターを使用して、割り当てるページの領域を計算します。 ページの範囲全体の現在の状態は、 AllocationType パラメーターで指定された割り当ての種類と互換性がある必要があります。 それ以外の場合、関数は失敗し、どのページも割り当てされません。 この互換性要件では、前に説明したように、既にコミットされたページのコミットは除外されません。

VirtualAllocFromApp では、実行可能ページの作成は許可されません。

VirtualAllocFromApp 関数を使用すると、指定されたプロセスの仮想アドレス空間内でメモリのアドレス ウィンドウ拡張機能 (AWE) 領域を予約できます。 その後、このメモリ領域を使用して、アプリケーションで必要に応じて仮想メモリとの間で物理ページをマップできます。 MEM_PHYSICALMEM_RESERVEの値は、AllocationType パラメーターで設定する必要があります。 MEM_COMMIT値を設定することはできません。 ページ保護は 、PAGE_READWRITEに設定する必要があります。

VirtualFree 関数は、コミットされたページのコミット解除、ページのストレージの解放、またはコミットされたページのコミット解除と解放を同時に行うことができます。 また、予約ページを解放して、無料のページにすることもできます。

実行可能なリージョンを作成する場合、呼び出し元プログラムは、コードが設定された後に FlushInstructionCache を適切に呼び出すことでキャッシュの一貫性を確保する責任を負います。 そうしないと、新しく実行可能なリージョンからコードを実行しようとすると、予期しない結果が生成される可能性があります。

要件

   
サポートされている最小のクライアント Windows 10 [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2016 [デスクトップ アプリ |UWP アプリ]
対象プラットフォーム Windows
ヘッダー memoryapi.h (Windows.h を含む)
Library WindowsApp.lib
[DLL] Kernel32.dll

関連項目

メモリ管理関数

仮想メモリ関数

VirtualAlloc

VirtualAllocEx

VirtualFree

VirtualLock

VirtualProtectFromApp

VirtualQuery