<Return[UV]><Top>

VirtualAlloc

Declare Function Api_VirtualAlloc& Lib "kernel32" Alias "VirtualAlloc" (lpAddress As Any, ByVal dwSize&, ByVal flAllocationType&, ByVal flProtect&)

Declare Function VirtualAlloc Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long

呼び出し側プロセスの仮想アドレス空間内のページ領域を、予約またはコミットする。MEM_RESET が指定されていない限り、この関数によって割り当てられたメモリは、0 に初期化される。
他のプロセスのアドレス空間内でメモリを割り当てるには、VirtualAllocEx 関数を使う。

パラメータ
lpAddress
    [入力]割り当てたい領域の開始アドレスを指定する。メモリを予約する場合、指定されたアドレスは次の 64KB 境界へ丸められる。

    メモリが既に予約されていて、コミットを行う場合、アドレスは次のページ境界へ丸められる。

    ホストコンピュータのページサイズを決定するには、GetSystemInfo 関数を使う。

    NULL を指定すると、システムが領域の割り当て場所を決定する。
dwSize
    [入力]領域のサイズをバイト単位で指定する。

    lpAddress パラメータに NULL を指定した場合は、この値は次のページ境界へ切り上げられる。それ以外の場合は、lpAddress〜

    (lpAddress+dwSiz)の範囲に少なくとも 1 バイトが所属しているすべてのページが割り当てられる。つまり、ページ境界にまたがる 2 バイ

    トの領域を指定した場合は、両方のページからなる領域が割り当てられる。
flAllocationType
    [入力]メモリ割り当てのタイプを指定する。次のフラグの任意の組み合わせを指定する。

    値                                 

意味                                                                                                                                       

    MEM_COMMIT

メモリ内またはディスクのページングファイル内に、指定されたページ領域に相当する物理的な記憶域を割り当

てる。コミット済みのページを再びコミットしても、この関数は失敗しない。これは、失敗について気にすることな

く、コミット済みまたはコミット解除済みの一連のページ範囲をコミットできることを意味する。

    MEM_PHYSICAL

物理メモリを割り当てる。この値は、アドレスウィンドウ化エクステンション(AWE)メモリでのみ利用できる。

    MEM_RESERVE

実際の物理記憶域を割り当てることなく、プロセスの仮想アドレス空間の特定の範囲を予約する。予約済み

の範囲を解放しない限り、他の割り当て操作(malloc 関数、LocalAlloc 関数など)はこの範囲を利用でき

ない。それ以降、VirtualAlloc 関数を使って、予約済みのページをコミットできる。

    MEM_RESET

Windows NT/2000:lpAddress と dwSize で指定されたメモリ範囲内のデータに関心がないことを指定する。

ページングファイル内のこれらのページを読み書きするべきではない。ただし、このメモリブロックは後で使用され

るので、コミット解除しない。この値をセットすると、MEM_RESET を指定して操作された範囲の内容が 0 に

なるかどうかは保証されない。この範囲の内容を 0 にしたい場合は、このメモリをコミット解除し、もう一度コミッ

トする。MEM_RESET を指定した場合、VirtualAlloc 関数は flProtect の値を無視する。しかし、依然とし

てflProtect では PAGE_NOACCESS のような有効な保護値を設定しなければならない。
MEM_RESET を指定し、メモリ範囲をあるファイルへマップした場合は、VirtualAlloc はエラーを返す。ペー

ジングファイルへマップした場合にのみ、共有ビューが受け入れ可能である。

    MEM_TOP_DOWN

Windows NT/2000:できるだけ上位のアドレスでメモリを割り当てる。

    MEM_WRITE_WATCH

Windows 98:割り当て済みの領域へ書き込まれたページをシステムに追跡させる。この値を指定する場

合、MEM_RESERVE も指定しなければならない。その領域を解放するまでは、メモリ領域の書き込みトラッ

キング機能は有効なままである。
領域を割り当てた後、または書き込みトラッキング状態をリセットした後、書き込みが行われたページのアドレ

スを取得するには、GetWriteWatch 関数を呼び出す。書き込みトラッキング状態をリセットするには、

GetWriteWatch または ResetWriteWatch を呼び出す。

flProtect
    [入力]アクセス保護のタイプを指定する。ページをコミットする場合、次のフラグのいずれかを指定する。また、必要に応じて

    PAGE_GUARD と PAGE_NOCACHE の各フラグも指定する。

    値                                               

意味                                                                                                                         

    PAGE_READONLY

 

コミット済みのページ領域に対する読み取りアクセスを許可する。コミット済みの領域への書き込みを行おうとすると、アクセス違反が発生する。システムが読み取り専用アクセスと実行アクセスを区別する場合、コミット済み領域内のコードを実行しようとしたときも、アクセス違反が発生する。

    PAGE_READWRITE

コミット済みのページ領域に対する読み取りアクセスと書き込みアクセスの両方を許可する。

    PAGE_EXECUTE

 

コミット済みのページ領域に対する実行アクセスを許可する。コミット済みの領域の読み取りまたは書き

込みを行おうとすると、アクセス違反が発生する。

    PAGE_EXECUTE_READ

 

コミット済みのページ領域に対する実行アクセスと読み取りアクセスを許可する。コミット済みの領域への書き込みを行おうとすると、アクセス違反が発生する。

    PAGE_EXECUTE_READWRITE

コミット済みのページ領域に対する実行アクセス、読み取りアクセス、書き込みアクセスを許可する。

    PAGE_GUARD

 

 

 

 

 

 

 

Windows NT/2000:領域内のページをガードページにする。ガードページに対して読み書きを行おう

とすると、システムは STATUS_GUARD_PAGE 例外を生成し、ガードページ状態を解除する。

つまり、ガードページ機能は、ワンショットアクセスアラーム(1 回限りのアラーム)として動作する。
PAGE_GUARD はページ保護修正子である。アプリケーションはこの値を他のページ保護修正子と組

み合わせて利用できるが、ただ 1 つの例外があり、PAGE_NOACCESS と組み合わせることはできな

い。あるアクセスを行おうとした結果、システムがガードページ状態をオフにした場合は、基となるページ保護機能がその役割を引き継ぐ。
システムサービス内でガードページ例外が発生した場合、そのサービスは通常、障害ステータスインジ

ケータを返す。

    PAGE_NOACCESS

 

 

コミット済みのページ領域に対するアクセスを一切禁止する。コミット済み領域の読み取り、書き込み、

実行を試みると、一般保護違反(General Protection Fault)と呼ばれるアクセス違反の例外が発生する。

    PAGE_NOCACHE

 

 

 

コミット済みのページ領域に対するキャッシュを禁止する。物理メモリに対するハードウェア属性は、「キャッシュなし」と指定するべきである。一般的な用途では、このフラグを使うことを推奨しない。しかし、デバイスドライバ関連で役立つことがある。たとえば、ビデオフレームバッファへのマッピングをキャッシュなしで行うことが考えられる。この値はページ保護修正子であり、PAGE_NOACCESS 以外のページ保護修正子と組み合わせて使う場合にのみ有効である。


戻り値
    関数が成功すると、割り当て済みのページ領域のベースアドレスが返る。
    関数が失敗すると、NULL が返る。拡張エラー情報を取得するには、GetLastError 関数を使う