IDiaSegment

Mappe les données du numéro de section à des segments d’espace d’adressage.

Syntax

IDiaSegment : IUnknown

Méthodes dans l'ordre Vtable

Le tableau suivant présente les méthodes de IDiaSegment.

Méthode Description
IDiaSegment::get_frame Récupère le numéro de segment.
IDiaSegment::get_offset Récupère le décalage, en segments, où commence la section.
IDiaSegment::get_length Récupère le nombre d’octets dans le segment.
IDiaSegment::get_read Récupère un indicateur qui spécifie si le segment peut être lu.
IDiaSegment::get_write Récupère un indicateur qui spécifie si le segment peut être modifié.
IDiaSegment::get_execute Récupère un indicateur qui spécifie si le segment est exécutable.
IDiaSegment::get_addressSection Récupère le numéro de section mappé à ce segment.
IDiaSegment::get_relativeVirtualAddress Récupère l’adresse virtuelle relative (RVA) du début de la section.
IDiaSegment::get_virtualAddress Récupère l’adresse virtuelle (VA) du début de la section.

Remarques

Étant donné que le SDK DIA effectue déjà la traduction des adresses de la section de décalage en adresses virtuelles relatives, la plupart des applications n’utilisent pas les informations fournies dans le mappage de segments.

Remarques pour les appelants

Obtenez cette interface en appelant les méthodes IDiaEnumSegments::Item ou IDiaEnumSegments::Next. Pour plus de détails, voir les exemples.

Exemple

Cette fonction affiche l’adresse de tous les segments d’une table et le symbole le plus proche.

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 ] );
                }
            }
        }
    }
}

Configuration requise

En-tête : Dia2.h

Bibliothèque : diaguids.lib

DLL : msdia80.dll

Voir aussi