プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

プロセスのメモリ・ページ情報を取得

2008年07月15日 10時50分00秒 | プロセス関連

プロセスのワーキングセット内のメモリ・ページ情報を取得します。
取得するにはQueryWorkingSet()関数を利用します。(戻る)

  1. プロセスのハンドルを開く(OpenProcess)
  2. プロセスのメモリ・ページ情報を取得(QueryWorkingSet)
  3. プロセスのハンドルを閉じる(CloseHandle)

プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。

バッファ内容について

  1. DWORD型の最初の要素は、有効なメモリ・ページ情報の個数
  2. DWORD型の2番目からは、有効なメモリ・ページ情報の配列

メモリ・ページ情報の構造

  1. 上位20ビットがメモリ・ページのアドレスを保持
  2. 下位12ビットはメモリ・ページのフラグ情報

フラグ情報の意味

  1. 0x001:このページは読み取り専用
  2. 0x002:このページは実行可能
  3. 0x004:このページは読み書き可能
  4. 0x005:このページは書き込み時コピー
  5. 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をリンクします。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« プロセスのワーキングセット... | トップ | CRC8の計算 »
最新の画像もっと見る

コメントを投稿

プロセス関連」カテゴリの最新記事