Heap32First 最初のヒープブロックの情報を取得

Cの宣言:

BOOL Heap32First(
	LPHEAPENTRY32 HeapEntry, 
	DWORD ProcessID,
	DWORD HeapID)

VBの宣言:

Declare Function Heap32First Lib "kernel32" (
	ByRef HeapEntry As HEAPENTRY32, 
	ByVal ProcessID As Long, 
	ByVal HeapID As Long) As Long

説明:

ProcessID及びHeapIDで指定されるヒープに含まれるヒープブロック一覧の最初のヒープブロックの情報を取得する。

この関数は95またはNT5.0以降で使用可能である。

この関数を実行する前に、あらかじめHeapEntryのSizeメンバにHEAPENTRY32のサイズを格納しておかなければならない。

引数の意味は、以下の通り。
HeapEntry (out) 取得結果のヒープブロックの情報
ProcessID (in) 情報取得元のプロセスのID
HeapID (in) 情報取得元のヒープのID

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

サンプルコード(VB):

'主な宣言
Public Const SIZEOF_HEAPENTRY32 As Long = 36

Public Type HEAPENTRY32
	Size As Long
	hHeapBlock As Long
	HeapBlockAddress As Long
	HeapBlockSize As Long
	Flags As Long
	LockCount As Long
	Reserved As Long
	ProcessID As Long
	HeapID As Long
End Type

' ヒープブロックの情報をテキストボックスに表示
Private Sub DispHeapBlock()

	Const MAX_BLOCKNUMBER As Long = 5 '1ヒープあたりの最大表示ブロック数

	Dim BlockCount As Long '現在の表示ブロック数
	Dim hProcessSnap As Long 'プロセスのスナップショットのハンドル
	Dim hHeapListSnap As Long 'ヒープリストのスナップショットのハンドル
	Dim pe As PROCESSENTRY32 'プロセスの情報
	Dim hl As HEAPLIST32 'ヒープリストの情報
	Dim he As HEAPENTRY32 'ヒープブロックの情報
	Dim bProcessResult As Long 'プロセスの情報取得に成功したか否かを表す真偽値
	Dim bHeapListResult As Long 'ヒープリストの情報取得に成功したか否かを表す真偽値
	Dim bHeapBlockResult As Long 'ヒープブロックの情報取得に成功したか否かを表す真偽値
	Dim Msg As String

	'テキストボックスの初期化
	txtMsg.Text = ""

	' プロセス一覧のスナップショットを作成
	hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

	' プロセスの最初の情報を取得
	pe.Size = SIZEOF_PROCESSENTRY32
	bProcessResult = Process32First(hProcessSnap, pe)
	    
	Do While bProcessResult ' 全てのプロセスの情報を取得するループ

		' プロセスのヒープリストのスナップショットを作成
		hHeapListSnap = CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST, pe.ProcessID)
		        
		Msg = "ファイル名: " & Left(pe.FileName, InStr(pe.FileName, vbNullChar) - 1) & vbCrLf

		'プロセスの最初のヒープリストの情報を取得
		hl.Size = SIZEOF_HEAPLIST32
		bHeapListResult = Heap32ListFirst(hHeapListSnap, hl)

		Msg = Msg & "  ヒープID: " & Hex(hl.HeapID) & vbCrLf

		Do While bHeapListResult ' 全てのヒープリストの情報を取得するループ

			 '最初のヒープブロックの情報を取得
			 he.Size = SIZEOF_HEAPENTRY32
			 bHeapBlockResult = Heap32First(he, hl.ProcessID, hl.HeapID)
			            
			 BlockCount = 0

			'全てのヒープブロックの情報を表示するループ
			 Do While bHeapBlockResult
			     
				'メッセージの作成
				Msg = Msg & "    ヒープブロックのハンドル: " & Hex(he.hHeapBlock) & vbCrLf
				Msg = Msg & "    ヒープブロックの開始アドレス: " & Hex(he.HeapBlockAddress) & vbCrLf
				Msg = Msg & "    ヒープブロックのサイズ: " & he.HeapBlockSize & vbCrLf
				Msg = Msg & "    ロックカウント: " & he.LockCount & vbCrLf

				'フラグのメッセージの作成
				Msg = Msg & "    フラグ: " & vbCrLf

				If (he.Flags And LF32_FIXED) > 0 Then
					Msg = Msg & "      移動不可能" & vbCrLf
				End If

				If (he.Flags And LF32_FREE) > 0 Then
					Msg = Msg & "      未使用" & vbCrLf
				End If

				If (he.Flags And LF32_MOVABLE) > 0 Then
					Msg = Msg & "      移動可能" & vbCrLf
				End If

				Msg = Msg & vbCrLf

				BlockCount = BlockCount + 1

				If BlockCount >= MAX_BLOCKNUMBER Then
					Msg = Msg & "    -------- 以下略 --------" & vbCrLf
					 bHeapBlockResult = 0
				Else
					' 次のヒープブロックの情報を取得
					bHeapBlockResult = Heap32Next(he)
				End If
			Loop
			     
			 Msg = Msg & vbCrLf
			     
			 '次のヒープリストの情報を取得
			 bHeapListResult = Heap32ListNext(hHeapListSnap, hl)
		Loop

		'メッセージの表示
		txtMsg.Text = txtMsg.Text & Msg & vbCrLf

		'ヒープリストのスナップショットの破棄
		CloseHandle hHeapListSnap

		' 次のプロセスの情報を取得
		bProcessResult = Process32Next(hProcessSnap, pe)
	Loop

	'プロセスのスナップショットの破棄
	CloseHandle hProcessSnap

End Sub

(original text:1998/12/25 更新)

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