Share via


DisassemblyData

Descreve uma instrução de desmontagem para o ambiente de desenvolvimento integrado (IDE) a ser exibido.

Sintaxe

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

Membros

dwFields
A constante DISASSEMBLY_STREAM_FIELDS que especifica quais campos são preenchidos.

bstrAddress
O endereço como um deslocamento de algum ponto de partida (geralmente o início da função associada).

bstrCodeBytes
Os bytes de código para esta instrução.

bstrOpcode
O opcode para esta instrução.

bstrOperands
Os operandos para esta instrução.

bstrSymbol
O nome do símbolo, se houver, associado ao endereço (símbolo público, rótulo e assim por diante).

uCodeLocationId
O identificador de local de código para essa linha desmontada. Se o endereço de contexto de código de uma linha for maior do que o endereço de contexto de código de outra, o identificador de local de código desmontado da primeira também será maior do que o identificador de local de código da segunda.

posBeg
O TEXT_POSITION que corresponde à posição em um documento onde os dados de desmontagem começam.

posEnd
O TEXT_POSITION que corresponde à posição em um documento onde os dados de desmontagem terminam.

bstrDocumentUrl
Para documentos de texto que podem ser representados como nomes de arquivo, o campo é preenchido com o nome do arquivo onde a fonte pode ser encontrada, usando o bstrDocumentUrl formato file://file name.

Para documentos de texto que não podem ser representados como nomes de arquivo, é um identificador exclusivo para o documento, bstrDocumentUrl e o mecanismo de depuração deve implementar o método GetDocument .

Esse campo também pode conter informações adicionais sobre somas de verificação. Consulte Comentários para obter detalhes.

dwByteOffset
O número de bytes que a instrução é do início da linha de código.

dwFlags
A constante DISASSEMBLY_FLAGS que especifica quais sinalizadores estão ativos.

Comentários

Cada DisassemblyData estrutura descreve uma instrução de desmontagem. Uma matriz dessas estruturas é retornada do método Read .

A estrutura TEXT_POSITION é usada apenas para documentos baseados em texto. O intervalo de código-fonte para esta instrução é preenchido apenas para a primeira instrução gerada a partir de uma instrução ou linha, por exemplo, quando dwByteOffset == 0.

Para documentos que não são textuais, um contexto de documento pode ser obtido a partir do código, e o bstrDocumentUrl campo deve ser um valor nulo. Se o campo for igual ao bstrDocumentUrl campo no elemento de matriz anteriorDisassemblyData, defina o bstrDocumentUrlbstrDocumentUrl como um valor nulo.

Se o campo tiver o dwFlagsDF_DOCUMENT_CHECKSUM sinalizador definido, as informações adicionais de soma de verificação seguirão a cadeia de caracteres apontada bstrDocumentUrl pelo campo. Especificamente, após o terminador de cadeia de caracteres nulo, segue-se um GUID identificando o algoritmo de soma de verificação que, por sua vez, é seguido por um valor de 4 bytes indicando o número de bytes na soma de verificação e que, por sua vez, é seguido pelos bytes de soma de verificação. Consulte o exemplo neste tópico sobre como codificar e decodificar esse campo no Visual C#.

Exemplo

O bstrDocumentUrl campo pode conter informações adicionais diferentes de uma cadeia de caracteres se o DF_DOCUMENT_CHECKSUM sinalizador estiver definido. O processo de criação e leitura dessa cadeia de caracteres codificada é simples no Visual C++. No entanto, no Visual C#, é outra questão. Para aqueles que estão curiosos, o exemplo a seguir mostra uma maneira de criar a cadeia de caracteres codificada do Visual C# e uma maneira de decodificar a cadeia de caracteres codificada no 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);
                }
            }
        }
    }
}

Confira também