<Return[UV]><Top>

VirtualAllocEx

Declare Function Api_VirtualAllocEx& Lib "kernel32" Alias "VirtualAllocEx" (ByVal hProcess&, lpAddress As Any, ByRef dwSize&, ByVal flAllocationType&, ByVal flProtect&)

Declare Function VirtualAllocEx Lib "kernel32" Alias "VirtualAllocEx" (ByVal hProcess As Long, lpAddress As Any, ByRef dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long

指定されたプロセスの仮想アドレス空間内のメモリ領域の予約とコミットの一方または両方を行う。この関数は MEM_RESET フラグがセットされていない限り、確保されるメモリが自動的に 0 で初期化される。

パラメータ
hProcess
    プロセスのハンドルを指定する。このプロセスの仮想アドレス空間内にメモリを確保する。
    このプロセスには、PROCESS_VM_OPERATION アクセス権を割り当てておかなければならない。このアクセス権がない場合、関数は失

    敗する。
lpAddress
    ページ領域を割り当てたい開始アドレスを指すポインタを指定する。
    メモリが予約されていると、このアドレスは最寄りの 64KB 境界に切り下げられる。
    すでに予約済みのメモリがコミットされていると、この関数はこのアドレスを最寄りのページ境界に切り下げられる。ホストコンピュータのページ

    サイズを決定するには、 関数を使う。
    NULL を指定すると、この関数が領域を割り当てる場所を決定する。
dwSize
    割り当てたいメモリ領域のサイズを、バイト単位で指定する。
    lpAddress パラメータに NULL に指定すると、dwSize パラメータの値が次のページ境界に切り上げられる。
    lpAddress パラメータに NULL 以外の値を指定すると、lpAddress から (lpAddress + dwSize)までの範囲に含まれる 1 バイトまたは複数の

    バイトを保持するすべてのページを割り当てる。たとえば、2 バイトの範囲がページ境界をまたいでいるとき、この関数は両方のページを割り

    当てる。
flAllocationType
    メモリ確保のタイプを指定する、一連のビットフラグを指定する。次のフラグの 1 つまたは複数を組み合わせてセットできる。

    フラグ                      

意味                                                                                                                                       

    MEM_COMMIT

指定されたメモリページ領域を、メモリ内の実際の物理格納域、またはディスク上のページングファイル内の格納域に確保する。このメモリは、0 に初期化される。

    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:できるだけ上位のアドレスでメモリを割り当てる。

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 が返る。拡張エラー情報を取得するには、 関数を使う。


解説
    VirtualAllocEx 関数は、次の操作が実施できます。
    •以前に VirtualAllocEx 関数を呼び出して予約したページ領域をコミットします。
    •空きページ領域を予約します。
    •空きページ領域の予約とコミットを行う。
    VirtualAllocEx 関数を使ってページブロックを予約し、さらに VirtualAllocEx 関数のを呼び出しを繰り返して、予約済みブロックから個別の

    ページをコミットすることもできる。これによって、必要が生じるまでは物理格納域を消費することなく、プロセスの仮想アドレス空間の一定の

    範囲を予約できる。
    プロセスの仮想アドレス空間内の各メモリページは、次の 3 つの状態のいずれかになる。

    状態                             

意味                                                                                                                                    

    Free(空き)

 

このページはコミットも予約もされていない。また、このプロセスからはアクセスできない。VirtualAllocEx 関数は、空きページを予約するか、予約とコミットを同時に行える。

    Reserved(予約済み)

 

 

このページは予約済みである。他のアプリケーションの関数はこのアドレス範囲を利用できない。このページを予約したプロセスもこのページにアクセスできない。物理格納域も関連付けられていない。VirtualAllocEx 関数は予約済みページをコミットできるが、同じページを 2 回予約することはできない。VirtualFreeEx 関数を使うと、指定されたプロセス内の予約済みのページを解放し、空きページにできる。

    Committed(コミット済み)

 

 

 

 

このページには物理格納域が既に割り当てられていて、アクセスは保護コードによって制御されている。コミット済みページの読み書きを最初に試みたときに限って、システムはそのページを初期化し、物理メモリへロードする。プロセスが終了すると、システムはコミット済みページに関連付けられている格納域を解放する。VirtualAllocEx 関数は既にコミット済みのページをさらにコミットできる。これは、あるページ範囲が既にコミット済みかどうかにかかわりなくその範囲をコミットでき、この関数が失敗しないことを意味する。VirtualFreeEx 関数を使って、指定されたプロセス内のコミット済みページをコミット解除するか、コミット解除と同時に解放することもできる。

    lpAddress パラメータが NULL ではない場合、lpAddress パラメータと dwSize パラメータを使って、割り当てたいページ範囲が計算され

    る。ページ範囲全体の現在の状態には、flAllocationType パラメータで指定した割り当てタイプと互換性がなければならない。そうけなけれ

    ば関数は失敗し、ページは割り当てられない。互換性に関するこの要件は、既にコミット済みのページをコミットする操作を排除しないことで

    ある。PAGE_GUARD 保護修正子フラグは、ガードページを確立する。ガードページは、1 回限りのアクセスアラームとして機能する。