Condividi tramite


IDiaSegment

Esegue il mapping dei dati dal numero di sezione ai segmenti dello spazio degli indirizzi.

Sintassi

IDiaSegment : IUnknown

Metodi nell'ordine Vtable

Nella tabella seguente vengono illustrati i metodi di IDiaSegment.

metodo Descrizione
IDiaSegment::get_frame Recupera il numero di segmento.
IDiaSegment::get_offset Recupera l'offset nei segmenti in cui inizia la sezione.
IDiaSegment::get_length Recupera il numero di byte nel segmento.
IDiaSegment::get_read Recupera un flag che indica se il segmento può essere letto.
IDiaSegment::get_write Recupera un flag che indica se il segmento può essere modificato.
IDiaSegment::get_execute Recupera un flag che indica se il segmento è eseguibile.
IDiaSegment::get_addressSection Recupera il numero di sezione mappato a questo segmento.
IDiaSegment::get_relativeVirtualAddress Recupera l'indirizzo virtuale relativo (RVA) dell'inizio della sezione.
IDiaSegment::get_virtualAddress Recupera l'indirizzo virtuale (VA) dell'inizio della sezione.

Osservazioni:

Poiché Debug Interface Access (DIA) SDK esegue già traduzioni dall'offset di sezione agli indirizzi virtuali relativi, la maggior parte delle applicazioni non userà le informazioni nella mappa dei segmenti.

Note per i chiamanti

Ottenere questa interfaccia chiamando i metodi IDiaEnumSegments::Item o IDiaEnumSegments::Next . Per informazioni dettagliate, vedere l'esempio.

Esempio

Questa funzione visualizza l'indirizzo di tutti i segmenti in una tabella e il simbolo più vicino.

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

Requisiti

Intestazione: Dia2.h

Libreria: diaguids.lib

DLL: msdia80.dll

Vedi anche