DisassemblyData

Describe una instrucción de desensamblaje para que se muestre el entorno de desarrollo integrado (IDE).

Sintaxis

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

Miembros

dwFields
Constante DISASSEMBLY_STREAM_FIELDS que especifica qué campos se rellenan.

bstrAddress
Dirección como desplazamiento desde algún punto de partida (normalmente el principio de la función asociada).

bstrCodeBytes
Bytes de código para esta instrucción.

bstrOpcode
Código de operación para esta instrucción.

bstrOperands
Operandos para esta instrucción.

bstrSymbol
El nombre del símbolo, si existe, asociado a la dirección (símbolo público, etiqueta, etc.).

uCodeLocationId
Identificador de ubicación de código para esta línea desensambblada. Si la dirección de contexto de código de una línea es mayor que la dirección de contexto de código de otra, el identificador de ubicación del código desensambblado del primero también será mayor que el identificador de ubicación del código del segundo.

posBeg
El TEXT_POSITION que corresponde a la posición de un documento donde comienzan los datos de desensamblar.

posEnd
El TEXT_POSITION que corresponde a la posición de un documento donde finalizan los datos de desensamblar.

bstrDocumentUrl
Para los documentos de texto que se pueden representar como nombres de archivo, el bstrDocumentUrl campo se rellena con el nombre de archivo donde se puede encontrar el origen, con el formato file://file name.

Para los documentos de texto que no se pueden representar como nombres de archivo, bstrDocumentUrl es un identificador único para el documento y el motor de depuración debe implementar el método GetDocument .

Este campo también puede contener información adicional sobre sumas de comprobación. Consulte Comentarios para obtener más detalles.

dwByteOffset
El número de bytes que la instrucción es desde el principio de la línea de código.

dwFlags
Constante DISASSEMBLY_FLAGS que especifica qué marcas están activas.

Comentarios

Cada DisassemblyData estructura describe una instrucción de desensamblaje. Se devuelve una matriz de estas estructuras desde el método Read .

La estructura TEXT_POSITION solo se usa para documentos basados en texto. El intervalo de código fuente de esta instrucción se rellena solo para la primera instrucción generada a partir de una instrucción o línea, por ejemplo, cuando dwByteOffset == 0.

Para los documentos que no son textuales, se puede obtener un contexto de documento del código y el bstrDocumentUrl campo debe ser un valor NULL. Si el bstrDocumentUrl campo es el mismo que el bstrDocumentUrl campo del elemento de matriz anterior DisassemblyData , establezca en bstrDocumentUrl un valor NULL.

Si el dwFlags campo tiene la DF_DOCUMENT_CHECKSUM marca establecida, la información adicional de suma de comprobación sigue la cadena a la que apunta el bstrDocumentUrl campo. En concreto, después del terminador de cadena NULL, sigue un GUID que identifica el algoritmo de suma de comprobación que, a su vez, va seguido de un valor de 4 bytes que indica el número de bytes de la suma de comprobación y, a su vez, va seguido de los bytes de suma de comprobación. Vea el ejemplo de este tema sobre cómo codificar y descodificar este campo en Visual C#.

Ejemplo

El bstrDocumentUrl campo puede contener información adicional distinta de una cadena si se establece la DF_DOCUMENT_CHECKSUM marca. El proceso de creación y lectura de esta cadena codificada es sencillo en Visual C++. Sin embargo, en Visual C#, es otra cuestión. Para aquellos que tienen curiosidad, en el ejemplo siguiente se muestra una manera de crear la cadena codificada desde Visual C# y una manera de descodificar la cadena codificada en 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);
                }
            }
        }
    }
}

Consulte también