IDiaSegment
Сопоставляет данные из номера раздела с сегментами адресного пространства.
Синтаксис
IDiaSegment : IUnknown
Методы в порядке таблицы Vtable
В следующей таблице показаны методы IDiaSegment
.
Метод | Description |
---|---|
IDiaSegment::get_frame | Извлекает номер сегмента. |
IDiaSegment::get_offset | Извлекает смещение в сегментах, где начинается раздел. |
IDiaSegment::get_length | Извлекает количество байтов в сегменте. |
IDiaSegment::get_read | Извлекает флаг, указывающий, можно ли считывать сегмент. |
IDiaSegment::get_write | Извлекает флаг, указывающий, можно ли изменить сегмент. |
IDiaSegment::get_execute | Извлекает флаг, указывающий, является ли сегмент исполняемым. |
IDiaSegment::get_addressSection | Извлекает номер раздела, сопоставленный с этим сегментом. |
IDiaSegment::get_relativeVirtualAddress | Извлекает относительный виртуальный адрес (RVA) начала раздела. |
IDiaSegment::get_virtualAddress | Извлекает виртуальный адрес (VA) начала раздела. |
Замечания
Так как пакет SDK для доступа к интерфейсу отладки (DIA) уже выполняет переводы из смещения раздела на относительные виртуальные адреса, большинство приложений не будут использовать сведения на карте сегментов.
Заметки для вызывающих абонентов
Получите этот интерфейс, вызвав методы IDiaEnumSegments::Item или IDiaEnumSegments::Next . Этот вариант подробно представлен в примере.
Пример
Эта функция отображает адрес всех сегментов таблицы и ближайшего символа.
void ShowSegments(IDiaTable *pTable, IDiaSession *pSession)
{
CComPtr<IDiaEnumSegments> pSegments;
if ( SUCCEEDED( pTable->QueryInterface(
_uuidof( IDiaEnumSegments ),
(void**)&pSegments )
)
)
{
CComPtr<IDiaSegment> pSegment;
while ( SUCCEEDED( hr = pSegments->Next( 1, &pSegment, &celt ) ) &&
celt == 1 )
{
DWORD rva;
DWORD seg;
pSegment->get_addressSection( &seg );
if ( pSegment->get_relativeVirtualAddress( &rva ) == S_OK )
{
printf( "Segment %i addr: 0x%.8X\n", seg, rva );
pSegment = NULL;
CComPtr<IDiaSymbol> pSym;
if ( psession->findSymbolByRVA( rva, SymTagNull, &pSym ) == S_OK )
{
CDiaBSTR name;
DWORD tag;
pSym->get_symTag( &tag );
pSym->get_name( &name );
printf( "\tClosest symbol: %ws (%ws)\n",
name != NULL ? name : L"",
szTags[ tag ] );
}
}
}
}
}
Требования
Заголовок: Dia2.h
Библиотека: diaguids.lib
DLL: msdia80.dll