プロセスのワーキングセット内のメモリ・ページ情報を取得します。
取得するにはQueryWorkingSet()関数を利用します。(戻る)
- プロセスのハンドルを開く(OpenProcess)
- プロセスのメモリ・ページ情報を取得(QueryWorkingSet)
- プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。
バッファ内容について
- DWORD型の最初の要素は、有効なメモリ・ページ情報の個数
- DWORD型の2番目からは、有効なメモリ・ページ情報の配列
メモリ・ページ情報の構造
- 上位20ビットがメモリ・ページのアドレスを保持
- 下位12ビットはメモリ・ページのフラグ情報
フラグ情報の意味
- 0x001:このページは読み取り専用
- 0x002:このページは実行可能
- 0x004:このページは読み書き可能
- 0x005:このページは書き込み時コピー
- 0x100:このページは共有アクセス可能(複数のプロセス間での共有)
0x001、0x004、0x005はどれか1つの状態です。
プロトタイプ宣言
HANDLE OpenProcess( DWORD dwDesiredAccess, // アクセス・フラグ BOOL bInheritHandle, // ハンドルの継承オプション DWORD dwProcessId // プロセス識別子 ); BOOL CloseHandle( HANDLE hObject // オブジェクトのハンドル ); BOOL QueryWorkingSet( HANDLE hProcess, // プロセスのハンドル PVOID pv, // 情報を受け取るバッファ DWORD cb // バッファのサイズ );
サンプル
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <Psapi.h> // Psapi.Lib // break付きのキーワード #define CASE break;case #define DEFAULT break;default // メイン関数 int main( int argc, char *argv[] ) { DWORD dwQuery[ 1024 ]; DWORD dwProcessID = GetCurrentProcessId(); HANDLE hProcess; if ( argc > 1 ){ dwProcessID = atoi( argv[1] ); } if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){ if ( QueryWorkingSet(hProcess,dwQuery,sizeof(dwQuery)) ){ LPDWORD lpData = &dwQuery[1]; LPDWORD lpStop = &dwQuery[1] + dwQuery[0]; while ( lpData < lpStop ){ DWORD dwAddress = (*lpData & 0xFFFFF000); // 上位20Bit DWORD dwAttrib = (*lpData & 0x00000FFF); // 下位12Bit printf( TEXT("0x%08X(0x%03X)⇒0x%08Xアドレスのページは、"), *lpData, dwAttrib, dwAddress ); switch ( dwAttrib & 0x005 ){ CASE 0x001: printf( TEXT("読み取り専用") ); CASE 0x004: printf( TEXT("読み書き") ); CASE 0x005: printf( TEXT("読み書き時コピー") ); DEFAULT: printf( TEXT("不明") ); } if ( dwAttrib & 0x002 ){ printf( TEXT("、実行可能") ); } if ( dwAttrib & 0x100 ){ printf( TEXT("、共有アクセス可能") ); } else{ printf( TEXT("、アクセス可能") ); } printf( TEXT("です。\n") ); lpData++; } } else{ printf( TEXT("%lu:QueryWorkingSet()関数のエラーです。\n"), GetLastError() ); } CloseHandle( hProcess ); return 0; } printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() ); return 1; }
- ヘッダファイルとしてPsapi.hをインクルードします。
- インポートライブラリとしてPsapi.Libをリンクします。
関連記事
- プロセスの時間情報を取得
- プロセスのハンドル数を取得
- プロセスのメモリ情報を取得
- プロセスのメモリ・ページ情報を取得
- プロセスのI/O操作情報を取得
- プロセスのGDI/USERオブジェクトを取得
- プロセスの最大/最小ワーキングセットを取得
- プロセスのワーキングセットを最小化
- プロセスのセッションIDを取得
- プロセスの優先順位クラスを取得
※コメント投稿者のブログIDはブログ作成者のみに通知されます