Condividi tramite


DisassemblyData

Descrive un'istruzione disassembly per l'ambiente di sviluppo integrato (IDE) da visualizzare.

Sintassi

public struct DisassemblyData { 
    public uint          dwFields;
    public string        bstrAddress;
    public string        bstrAddressOffset;
    public string        bstrCodeBytes;
    public string        bstrOpcode;
    public string        bstrOperands;
    public string        bstrSymbol;
    public ulong         uCodeLocationId;
    public TEXT_POSITION posBeg;
    public TEXT_POSITION posEnd;
    public string        bstrDocumentUrl;
    public uint          dwByteOffset;
    public uint          dwFlags;
};

Membri

dwFields
Costante DISAS edizione StandardMBLY_STREAM_FIELDS che specifica i campi compilati.

bstrAddress
Indirizzo come offset da un punto iniziale (in genere l'inizio della funzione associata).

bstrCodeBytes
Byte di codice per questa istruzione.

bstrOpcode
Codice operativo per questa istruzione.

bstrOperands
Operandi per questa istruzione.

bstrSymbol
Nome del simbolo, se presente, associato all'indirizzo (simbolo pubblico, etichetta e così via).

uCodeLocationId
Identificatore del percorso del codice per questa riga disassemblata. Se l'indirizzo del contesto di codice di una riga è maggiore dell'indirizzo del contesto di codice di un altro, l'identificatore del percorso del codice disassemblato del primo sarà maggiore dell'identificatore del percorso del codice del secondo.

posBeg
Il TEXT_POSITION che corrisponde alla posizione in un documento in cui iniziano i dati del disassembly.

posEnd
Il TEXT_POSITION che corrisponde alla posizione in un documento in cui terminano i dati disassembly.

bstrDocumentUrl
Per i documenti di testo che possono essere rappresentati come nomi di file, il bstrDocumentUrl campo viene compilato con il nome del file in cui è possibile trovare l'origine, usando il formato file://file name.

Per i documenti di testo che non possono essere rappresentati come nomi di file, bstrDocumentUrl è un identificatore univoco per il documento e il motore di debug deve implementare il metodo GetDocument .

Questo campo può contenere anche informazioni aggiuntive sui checksum. Pe altri dettagli, vedere la sezione Osservazioni.

dwByteOffset
Il numero di byte che l'istruzione proviene dall'inizio della riga di codice.

dwFlags
Costante DISAS edizione StandardMBLY_FLAGS che specifica quali flag sono attivi.

Osservazioni:

Ogni DisassemblyData struttura descrive un'istruzione di disassembly. Una matrice di queste strutture viene restituita dal metodo Read .

La struttura TEXT_POSITION viene utilizzata solo per i documenti basati su testo. L'intervallo di codice sorgente per questa istruzione viene compilato solo per la prima istruzione generata da un'istruzione o da una riga, ad esempio quando dwByteOffset == 0.

Per i documenti non testuali, è possibile ottenere un contesto di documento dal codice e il bstrDocumentUrl campo deve essere un valore Null. Se il bstrDocumentUrl campo è uguale al bstrDocumentUrl campo nell'elemento della matrice precedente DisassemblyData , impostare su bstrDocumentUrl un valore Null.

Se il dwFlags campo ha il DF_DOCUMENT_CHECKSUM flag impostato, le informazioni aggiuntive sul checksum seguono la stringa a cui punta il bstrDocumentUrl campo. In particolare, dopo il carattere di terminazione della stringa Null, viene seguito un GUID che identifica l'algoritmo checksum seguito da un valore di 4 byte che indica il numero di byte nel checksum e che a sua volta è seguito dai byte di checksum. Vedere l'esempio in questo argomento su come codificare e decodificare questo campo in Visual C#.

Esempio

Il bstrDocumentUrl campo può contenere informazioni aggiuntive diverse da una stringa se il DF_DOCUMENT_CHECKSUM flag è impostato. Il processo di creazione e lettura di questa stringa codificata è semplice in Visual C++. Tuttavia, in Visual C#, è un'altra questione. Per coloro che sono curiosi, l'esempio seguente illustra un modo per creare la stringa codificata da Visual C# e un modo per decodificare la stringa codificata in Visual C#.

using System;
using System.Runtime.InteropServices;

namespace MyNamespace
{
    class MyClass
    {
        string EncodeData(string documentString,
                          Guid checksumGuid,
                          byte[] checksumData)
        {
            string returnString = documentString;

            if (checksumGuid == null || checksumData == null)
            {
                // Nothing more to do. Just return the string.
                return returnString;
            }

            returnString += '\0'; // separating null value

            // Add checksum GUID to string.
            byte[] guidDataArray  = checksumGuid.ToByteArray();
            int    guidDataLength = guidDataArray.Length;
            IntPtr pBuffer        = Marshal.AllocCoTaskMem(guidDataLength);
            for (int i = 0; i < guidDataLength; i++)
            {
                Marshal.WriteByte(pBuffer, i, guidDataArray[i]);
            }
            // Copy guid data bytes to string as wide characters.
            // Assumption: sizeof(char) == 2.
            for (int i = 0; i < guidDataLength / sizeof(char); i++)
            {
                returnString += (char)Marshal.ReadInt16(pBuffer, i * sizeof(char));
            }

            // Add checksum count (a 32-bit value).
            Int32 checksumCount = checksumData.Length;
            Marshal.StructureToPtr(checksumCount, pBuffer, true);
            for (int i = 0; i < sizeof(Int32) / sizeof(char); i++)
            {
                returnString += (char)Marshal.ReadInt16(pBuffer, i * sizeof(char));
            }

            // Add checksum data.
            pBuffer = Marshal.AllocCoTaskMem(checksumCount);
            for (int i = 0; i < checksumCount; i++)
            {
                Marshal.WriteByte(pBuffer, i, checksumData[i]);
            }
            for (int i = 0; i < checksumCount / sizeof(char); i++)
            {
                returnString += (char)Marshal.ReadInt16(pBuffer, i * sizeof(char));
            }
            Marshal.FreeCoTaskMem(pBuffer);

            return returnString;
        }

        void DecodeData(    string encodedString,
                        out string documentString,
                        out Guid   checksumGuid,
                        out byte[] checksumData)
        {
            documentString = String.Empty;
            checksumGuid = Guid.Empty;
            checksumData = null;

            IntPtr pBuffer = Marshal.StringToBSTR(encodedString);
            if (null != pBuffer)
            {
                int bufferOffset = 0;

                // Parse string out. String is assumed to be Unicode.
                documentString = Marshal.PtrToStringUni(pBuffer);
                bufferOffset += (documentString.Length + 1) * sizeof(char);

                // Parse Guid out.
                // Read guid bytes from buffer and store in temporary
                // buffer that contains only the guid bytes. Then the
                // Marshal.PtrToStructure() can work properly.
                byte[] guidDataArray  = checksumGuid.ToByteArray();
                int    guidDataLength = guidDataArray.Length;
                IntPtr pGuidBuffer    = Marshal.AllocCoTaskMem(guidDataLength);
                for (int i = 0; i < guidDataLength; i++)
                {
                    Marshal.WriteByte(pGuidBuffer, i,
                                      Marshal.ReadByte(pBuffer, bufferOffset + i));
                }
                bufferOffset += guidDataLength;
                checksumGuid = (Guid)Marshal.PtrToStructure(pGuidBuffer, typeof(Guid));
                Marshal.FreeCoTaskMem(pGuidBuffer);

                // Parse out the number of checksum data bytes (always 32-bit value).
                int dataCount = Marshal.ReadInt32(pBuffer, bufferOffset);
                bufferOffset += sizeof(Int32);

                // Parse out the checksum data.
                checksumData = new byte[dataCount];
                for (int i = 0; i < dataCount; i++)
                {
                    checksumData[i] = Marshal.ReadByte(pBuffer, bufferOffset + i);
                }
            }
        }
    }
}

Vedi anche