Sdílet prostřednictvím


DisassemblyData

Popisuje jednu pokyn k zpětnému překladu pro zobrazení integrovaného vývojového prostředí (IDE).

Syntaxe

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

Členové

dwFields
Konstanta DISASSEMBLY_STREAM_FIELDS , která určuje, která pole jsou vyplněna.

bstrAddress
Adresa jako posun od počátečního bodu (obvykle začátek přidružené funkce).

bstrCodeBytes
Bajty kódu pro tuto instrukci

bstrOpcode
Opcode pro tuto instrukci.

bstrOperands
Operandy pro tuto instrukci.

bstrSymbol
Název symbolu, pokud existuje, přidružený k adrese (veřejný symbol, popisek atd.).

uCodeLocationId
Identifikátor umístění kódu pro tento rozebraný řádek. Pokud je kontextová adresa kódu jednoho řádku větší než kontextová adresa kódu jiného, pak rozebráný identifikátor umístění kódu prvního bude také větší než identifikátor umístění kódu druhého.

posBeg
TEXT_POSITION, která odpovídá pozici v dokumentu, kde začínají data zpětného překladu.

posEnd
TEXT_POSITION, která odpovídá pozici v dokumentu, kde končí data zpětného překladu.

bstrDocumentUrl
U textových dokumentů, které mohou být reprezentovány jako názvy souborů, bstrDocumentUrl je pole vyplněno názvem souboru, kde lze najít zdroj pomocí formátu file://file name.

U textových dokumentů, které nelze reprezentovat jako názvy souborů, bstrDocumentUrl je jedinečný identifikátor dokumentu a ladicí modul musí implementovat Metodu GetDocument .

Toto pole může také obsahovat další informace o kontrolních součtech. Podrobnosti najdete v poznámkách.

dwByteOffset
Počet bajtů, které instrukce spouští, je od začátku řádku kódu.

dwFlags
Konstanta DISASSEMBLY_FLAGS , která určuje, které příznaky jsou aktivní.

Poznámky

Každá DisassemblyData struktura popisuje jednu instrukci zpětného překladu. Z metody Read se vrátí pole těchto struktur.

Struktura TEXT_POSITION se používá pouze pro textové dokumenty. Oblast zdrojového kódu pro tuto instrukci je vyplněna pouze pro první instrukce vygenerované z příkazu nebo řádku, například když dwByteOffset == 0.

U dokumentů, které nejsou textové, lze z kódu získat kontext dokumentu a bstrDocumentUrl pole by mělo mít hodnotu null. bstrDocumentUrl Pokud je pole stejné jako bstrDocumentUrl pole v předchozím DisassemblyData prvku pole, nastavte bstrDocumentUrl hodnotu null.

Pokud má dwFlagsDF_DOCUMENT_CHECKSUM pole nastavený příznak, další informace kontrolního součtu bstrDocumentUrl se řídí řetězcem, na který odkazuje dané pole. Konkrétně po ukončení řetězce s hodnotou null následuje identifikátor GUID identifikující algoritmus kontrolního součtu, za kterým následuje 4 bajtová hodnota označující počet bajtů v kontrolním součtu a za ním následuje bajty kontrolního součtu. Podívejte se na příklad v tomto tématu o kódování a dekódování tohoto pole v jazyce Visual C#.

Příklad

Pole bstrDocumentUrl může obsahovat jiné informace než řetězec, pokud DF_DOCUMENT_CHECKSUM je příznak nastaven. Proces vytváření a čtení tohoto zakódovaného řetězce je v jazyce Visual C++ jednoduchý. V jazyce Visual C# je to ale další věc. Pro ty, kteří jsou zvědaví, následující příklad ukazuje jeden ze způsobů, jak vytvořit kódovaný řetězec z Visual C# a jedním ze způsobů, jak dekódovat kódovaný řetězec v jazyce 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);
                }
            }
        }
    }
}

Viz také