kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Desktop Heapの値を取得する

Windowsではデスクトップヒープというものがあります。メニューやアイコン、ウィンドウを作られるたびにここから取られます。なくなるとプロセスの起動に失敗します。
Desktop Heap Overview - Ntdebugging Blog - Site Home - MSDN Blogs
Windows Server 2003 R2まではカーネルデバッガかDesktop Heap Monitorを使って調べなくてはならなかったのですが、Windows Vista以降はAPIで取得できるようなので、やってみました。こんな感じ。

#define WINVER 0x0701

#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
	HDESK  hDesktop = OpenInputDesktop(0, FALSE, GENERIC_READ);

	ULONG ulHeapSize = 0;
	DWORD dwNeeded = 0;
	if(!GetUserObjectInformation(hDesktop, UOI_HEAPSIZE, &ulHeapSize, sizeof(ULONG), &dwNeeded)) {
		_tprintf(_T("Error:%ld\n"), GetLastError());
	}else{
		_tprintf(_T("Heap Size:%ld\n"), ulHeapSize);
	}


	CloseDesktop(hDesktop);
	return 0;
}

最初、デスクトップヒープはWindow Stationに関連づくものだから、GetProcessWindowStation()で取ったWindow Stationのハンドルでいいかと思っていたら、デスクトップハンドルでした…。ちなみにちょっと古いけど各OSでのデフォルト設定はこちら。
Desktop Heap, part 2 - Ntdebugging Blog - Site Home - MSDN Blogs
Windows 7 Ultimate X64で実行すると20MB位あるようです。デスクトップとサービスでは違う値になります。これ実行して気づいたんですが、残量じゃなくて、現在の設定値のようです…デスクトップヒープの残量が取得できればうれしいのですけど…。