VirtualQuery

https://msdn.microsoft.com/ja-jp/library/cc429808.aspx https://msdn.microsoft.com/ja-jp/library/aa366775.aspx https://msdn.microsoft.com/ja-jp/library/cc429808.aspx https://msdn.microsoft.com/ja-jp/library/aa366775.aspx

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

DWORD VirtualQuery(
  LPCVOID lpAddress,                   // 領域のアドレス
  PMEMORY_BASIC_INFORMATION lpBuffer,  // 情報バッファのアドレス
  DWORD dwLength                       // バッファのサイズ
);

パラメータ

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 関数は指定されたプロセスのメモリ内のページ領域に関する情報が取得できます。

対応情報

  Windows NT/2000:Windows NT 3.1 以降を使います。
  Windows 95/98:Windows 95 以降を使います。
  Windows CE:Windows CE 1.0 以降を使います。
  ヘッダーファイル:winbase.h 内で宣言されています。
  インポートライブラリ:kernel32.lib を使います。

参照

、、VirtualQueryExVirtualQueryVlm

表示: