QueryWorkingSet ワーキングセットの情報を取得

Cの宣言:

BOOL QueryWorkingSet(
	HANDLE hProcess,
	PVOID PageInfos,
	DWORD PageInfoSize);

説明:

hProcessで指定されたプロセスのワーキングセットの情報を取得し、結果をPageInfosに返す。

結果は、1メモリページを1DWORDの情報として、DWORDの配列で返される。各DWORDに対して、FFFFF000hでマスクした値がメモリページのアドレスを表し、00000FFFhでマスクした値の各ビットがそれぞれそのページの属性をあらわす。

ただし、上記ページ情報は、配列の2番目の要素から返される。配列の1番目の要素は、返された情報の数を表す値が格納される。

引数の意味は以下の通り。
hProcess (IN) 情報の取得元のプロセスのハンドル。
PageInfos (OUT) 取得結果のワーキングセットの各ページの情報の配列。
PageInfoSize (IN) PageInfosのサイズ。

戻り値は、関数の実行に成功したか否かを表す真偽値である。

Cのサンプル:

関数呼出し後五秒間待つ。次に、その時点でフォアグラウンドウィンドウとなっているウィンドウを探し、そのウィンドウを作成したプロセスをオープンする。最後に、オープンしたプロセスのワーキングセット情報を取得し、表示する。
void DispWorkingSet()
{
	DWORD i;
	DWORD ProcessId;
	HANDLE hProcess;
	HWND hWnd;
	char WindowTitle[1000];
	DWORD ws[10000];
	BOOL bResult;

	/* 五秒間待機 */
	for(i=5; i>0; i--) {
		printf("%d秒前\n", i);
		Sleep(1000);
	}

	/* この時点でフォアグラウンドウィンドウを所有しているプロセスをオープン */
	hWnd = GetForegroundWindow();
	GetWindowText(hWnd, WindowTitle, 1000);
	GetWindowThreadProcessId(hWnd, &ProcessId);
	hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ProcessId);

	/* ワーキングセットの情報を取得 */
	printf("%s のワーキングセット情報:\n", WindowTitle);
	bResult = QueryWorkingSet(hProcess, ws, 10000);
	CloseHandle(hProcess);
	if(!bResult) {
		printf("working set can not query.\n");
		return;
	}

	/* 結果を表示 */
	for(i=1; i<=ws[0]; i++) {
		printf("%08x: ", ws[i] & 0xfffff000);
		if((ws[i] & 0x5) == 0x5) printf("copy-on-write "); 
		else if(ws[i] & 0x1) printf("read-only ");
		else if(ws[i] & 0x4) printf("read/write ");
		if(ws[i] & 0x2) printf("executable ");
		if(ws[i] & 0x100) printf("shared ");
		printf("\n");
	};
}

(original text:1999/01/06 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。