IDiaSegment
セクション番号のデータをアドレス空間のセグメントにマップします。
構文
IDiaSegment : IUnknown
Vtable 順序のメソッド
次の表に、IDiaSegment
のメソッドを示します。
メソッド | 説明 |
---|---|
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) を取得します。 |
解説
デバッグ インターフェイス アクセス (DIA) SDK は既にセクション オフセットから相対仮想アドレスへの変換を実行しているため、ほとんどのアプリケーションではセグメント マップ内の情報は使用されません。
呼び出し元に関する注意事項
このインターフェイスを取得するには、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