<Return[UV]><Top>

VirtualQuery

Declare Function Api_VirtualQuery& Lib "kernel32" Alias "VirtualQuery" (lpAddress As Any, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength&)

Declare Function VirtualQuery Lib "kernel32" Alias "VirtualQuery" (lpAddress As Any, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long) As Long

呼び出し側のプロセスの仮想アドレス空間にある範囲のページに関する情報を取得する。
ほかのプロセスのアドレス空間にある範囲のページに関する情報を取得するには、VirtualQueryEx 関数を使う。

パラメータ
lpAddress
    問い合わせたいページ領域のベースアドレスへのポインタを指定する。この値は、次のページ境界に切り下げられる。ホストコンピュータのペ

    ージサイズを調べるには、 関数を使う。
lpBuffer
    指定された範囲のページに関する情報を受け取る、 構造体へのポインタを指定する。
dwLength
    lpBuffer パラメータが指すバッファのサイズを、バイト単位で指定する。
 

戻り値
    情報バッファ内に返された実際のバイト数が返る。

解説
    VirtualQuery 関数を使うと、指定されたアドレスから始まる連続ページのうち、次の属性で共通しているページに関する情報が取得でき

    る。
    •ページの状態を取得する。状態はすべてのページで共通しています。つまり、MEM_COMMIT、MEM_RESERVE、MEM_FREE、

      MEM_PRIVATE、MEM_MAPPED、MEM_IMAGE のうち 1 つのフラグをセットして割り当てられたページが対象になる(最初の 3 つのフ

      ラグは MEMORY_BASIC_INFORMATION 構造体の State メンバ、後の 3 つのフラグは Type メンバ)。
    •最初のページが空き状態ではない場合、VirtualAlloc 関数を 1 回呼び出すことによって予約された、最初の割り当ての一部である領域

      内のすべてのページが対象になる。
    •ページのアクセス権の状態を取得する。アクセス権の状態は、すべてのページで共通している。つまり、PAGE_READONLY、

      PAGE_READWRITE、PAGE_NOACCESS、PAGE_WRITECOPY、PAGE_EXECUTE、PAGE_EXECUTE_READ、

      PAGE_EXECUTE_READWRITE、PAGE_EXECUTE_WRITECOPY、PAGE_GUARD、PAGE_NOCACHE のうち 1 つのフラグをセ

      ットして割り当てられたページが対象になる(MEMORY_BASIC_INFORMATION 構造体の AllocationProtect メンバ)。
    この関数は領域内の最初のページの属性を調べる。そして、領域内のすべてのページを検索し終わるか、属性セットが一致しないページ

    が見つかるまで、ページを検索し続ける。この関数は最初のページ属性と共通の属性を持つページ領域のバイト単位のサイズを返す。たと

    えば、サイズが 40MB の空きメモリ領域が存在する場合、その領域の先頭から 10MB 進んだ場所にあるページに対して VirtualQuery 関

    数を呼び出すと、MEM_FREE の状態と 30MB のサイズが取得できる。
    この関数を使うと、呼び出し側のプロセスのメモリ内のページ領域に関する情報を取得し、VirtualQueryEx 関数は指定されたプロセスのメ

    モリ内のページ領域に関する情報が取得できる。