TProcessHeapEntry

Запись TProcessHeapEntry содержит информацию об элементах кучи. Функция HeapWalk использует запись TProcessHeapEntry для того, чтобы перечислить все элементы кучи.

type
  PProcessHeapEntry = ^TProcessHeapEntry;
  TProcessHeapEntry = record
    lpData: Pointer;
    cbData: DWORD;
    cbOverhead: Byte;
    iRegionIndex: Byte;
    wFlags: Word;
    case Integer of
      0: (
        hMem: THandle);
      1: (
        dwCommittedSize: DWORD;
        dwUnCommittedSize: DWORD;
        lpFirstBlock: Pointer;
        lpLastBlock: Pointer);
  end;

Поля

lpData
Указатель на очередной элемент кучи.

Для того, чтобы проинициализировать или начать заново перечисление элементов кучи, установите этот указатель в nil.

Если элемент wFlags содержит флаг PROCESS_HEAP_REGION, то данный указатель является указатель на начальный байт указанного региона. Если элемент wFlags содержит флаг PROCESS_HEAP_UNCOMMITTED_RANGE, то lpData указывает на начало фрагмента, состоящего из страниц, под которыми нет физической памяти.

cbData
Указывает размер очередного элемента кучи в байтах.

Если элемент wFlags содержит флаг PROCESS_HEAP_REGION, то поле cbData задает размер в байтах очередного элемента кучи. Если элемент wFlags содержит флаг PROCESS_HEAP_UNCOMMITTED_RANGE, то cbData задает размер франмента, состоящего из страниц, под которыми нет физической памяти.

cbOverhead
Задает размер в байтах фрагмента, используемой системой для описания блока памяти. Общий размер, занимаемый блоком, равен сумме элементов cbData и cbOverhead.

Если элемент wFlags содержит флаг PROCESS_HEAP_REGION, то поле cbOverhead задает размер в байтах системного фрагмента, содержащего информацию об текущем блоке. Если элемент wFlags содержит флаг PROCESS_HEAP_UNCOMMITTED_RANGE, то cbData задает размер в байтах системного фрагмента, который описывает принадлежащие куче страницы, под которыми нет физической памяти.

iRegionIndex
Дескриптор региона кучи, который содержит указанный фрагмент. Куча состоит из одного или нескольких регионов виртуального адресного пространства, каждый из которых имеет уникальный индекс.

Если вы решили начать заново перечисление элементов кучи, то при первом вызове HeapWalk возвращенным значением будет блок памяти с установленным флагом PROCESS_HEAP_REGION в поле wFlags. Если это значение установлено в поле wFlags, то полученный фрагмент значения полей dwCommittedSize, dwUnCommittedSize, lpFirstBlock, lpLastBlock являются справедливыми и содержат информацию о регионе памяти, занимаемого кучей, в котором, собственно, и содержаться фрагменты памяти, получаемые при обращении к функции HeapAlloc.

Если при вызове HeapAlloc в "растущей" (т. е. в которой не задан максимальный размер) не достаточно памяти, чтобы удовлетворить запрос, то происходит обращение к функции VirtualAlloc и выделение нового большого региона памяти под кучу. Менеджер кучи трактует такой регион памяти как новый раздельный регион, принадлежащий куче, и обладающий уникальным индексом. Для получения дополнительной информации о таком регионе следует выполнить вызов VirtualQuery. Если при вызове HeapWalk поле wFlags не содержит элемента PROCESS_HEAP_REGION, то в поля dwCommittedSize, dwUnCommittedSize, lpFirstBlock, lpLastBlock не имеют смысла и не должны использоваться.

wFlags
Указывает свойства элемента кучи. От значения этого поля зависят значения и оставшихся полей записи TProcessHeapEntry. Для этого поля определены следующие значения:

Флаг Значение

PROCESS_HEAP_REGION

Указывает, что данный блок является описателем немрерывного региона виртуального адресного пространства, зарезервированного кучей. В этом случае поле lpData является указателем на начало региона памяти, поле cbData содержит размер в байтах виртуального пространства, зарезервированного кучей, а поле cbOverhead содержит размер в байтах системной информации в байтах, которые использует куча для того, чтобы описать этот регион.

В случае, если этот флаг установлен, то значения полей dwCommittedSize, dwUnCommittedSize, lpFirstBlock, lpLastBlock являются правильными, и вы их можете использовать для того, чтобы получить дополнительную информацию о зарезервированном регионе.

PROCESS_HEAP_UNCOMMITTED_RANGE

Указывает на то, что следующим элементом кучи является фрагмент, для которого не выделено физической памяти и который находится в регионе, зерезервированном кучей. При этом lpData указывет на начало этого фрагмента, cbData содержит размер в байтах этого фрагмента, а cbOverhead одержит размер в байтах данных, принадлежащих менеджеру памяти, служащих для описания этого региона памяти.

PROCESS_HEAP_ENTRY_BUSY

Указывает на то, что текущий элемент является программно выделенным блоком. Если также указан флаг PROCESS_HEAP_ENTRY_MOVEABLE, то значение поля hMem также корректно и содержит дескриптор данного выделенного блока.

PROCESS_HEAP_ENTRY_MOVEABLE

Это флаг используется совместно с флагом PROCESS_HEAP_ENTRY_BUSY и показывает нам, что данный блок был выделен при помощи глобальных/локальных функций с указанным флагом GLMEM_MOVEABLE или LMEM_MOVEABLE. В этом случае значение поля hMem является правильным и содержит дескриптор данного перемещаемого блока.

PROCESS_HEAP_ENTRY_DDESHARE

Это значение используется совместно с флагом PROCESS_HEAP_ENTRY_BUSY указывающим на то, что текущий фрагмент является выделенным блоком памяти.

hMem
Значение справедливо только если указаны флаги PROCESS_HEAP_ENTRY_BUSY и PROCESS_HEAP_ENTRY_MOVEABLE в поле wFlags. Содержит дескриптор выделенного перемещаемого блока.

dwCommittedSize
Значение справедливо только если указан флаг PROCESS_HEAP_REGION в поле wFlags. Указывает размер в байтах тех частей региона кучи, под которым присутсвует физическая память, и которые могут содержать свободные фрагменты, выделенный фрагменты и управляющие структуры менеджера памяти. Если это значение равно нулю, значит ни один из байт в регионе не имеет под собой физическую память.

dwUnCommittedSize
Значение справедливо только если указан флаг PROCESS_HEAP_REGION в поле wFlags. Указывает размер в байтах тех частей региона кучи, под которым отсутствует физическая память. Если это значение равно нулю, значит все байты в регионе имеют под собой физическую память.

lpFirstBlock
Значение справедливо только если указан флаг PROCESS_HEAP_REGION в поле wFlags. Значение поля есть указатель на первый выделенный блок в указанном регионе.

lpLastBlock
Значение справедливо только если указан флаг PROCESS_HEAP_REGION в поле wFlags. Значение поля есть указатель на первый свободныйблок в указанном регионе.

Требования

Windows NT/2000: Требуется Windows NT 3.5 или более поздняя версия
Windows 95/98: Не поддерживается
Бибиотека: Kernel32.dll
Подключаемый модуль: Windows

Смотри также:

  • виртуальная память,
  • работа с кучей,
  • описание кучи,
  • список функций для работы с кучей,
  • GlobalAlloc,
  • HeapAlloc,
  • HeapWalk,
  • VirtualAlloc,
  • VirtualQuery
  • НазадСписок записей СноскиВперед

    © Mystic, 2002