Delen via


DisassemblyData

Beschrijft één ontmantelingsinstructie voor de IDE (Integrated Development Environment) die weergegeven moet worden.

Syntax

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

Members

dwFields
De DISASSEMBLY_STREAM_FIELDS constante die aangeeft welke velden worden ingevuld.

bstrAddress
Het adres als offset van een bepaald beginpunt (meestal het begin van de bijbehorende functie).

bstrCodeBytes
De codebytes voor deze instructie.

bstrOpcode
De opcode voor deze instructie.

bstrOperands
De operanden voor deze instructie.

bstrSymbol
De naam van het symbool, indien aanwezig, die is gekoppeld aan het adres (openbaar symbool, label, enzovoort).

uCodeLocationId
De codelocatie-identificatie voor deze gedemonteerde regel. Als het codecontextadres van de ene regel groter is dan het codecontextadres van een andere regel, is de gedemonteerde codelocatie-id van de eerste ook groter dan de id van de codelocatie van de tweede.

posBeg
De TEXT_POSITION die overeenkomt met de positie in een document waar de demontagegegevens beginnen.

posEnd
De TEXT_POSITION die overeenkomt met de positie in een document waar de demontagegegevens eindigen.

bstrDocumentUrl
Voor tekstdocumenten die kunnen worden weergegeven als bestandsnamen, wordt het bstrDocumentUrl veld ingevuld met de bestandsnaam waar de bron kan worden gevonden, met behulp van de indeling file://file name.

Voor tekstdocumenten die niet als bestandsnamen kunnen worden weergegeven, bstrDocumentUrl is dit een unieke id voor het document en moet de engine voor foutopsporing de Methode GetDocument implementeren.

Dit veld kan ook aanvullende informatie bevatten over controlesommen. Zie Opmerkingen voor meer informatie.

dwByteOffset
Het aantal bytes dat de afstand van de instructie vanaf het begin van de coderegel aangeeft.

dwFlags
De DISASSEMBLY_FLAGS constante die aangeeft welke vlaggen actief zijn.

Remarks

Elke DisassemblyData structuur beschrijft één instructie van demontage. Een matrix van deze structuren wordt geretourneerd door de leesmethode .

De TEXT_POSITION-structuur wordt alleen gebruikt voor op tekst gebaseerde documenten. Het broncodebereik voor deze instructie wordt alleen ingevuld voor de eerste instructie die is gegenereerd op basis van een instructie of regel, bijvoorbeeld wanneer dwByteOffset == 0.

Voor documenten die niet-tekstueel zijn, kan een documentcontext worden verkregen uit de code en moet het bstrDocumentUrl veld een null-waarde zijn. Als het bstrDocumentUrl veld hetzelfde is als het veld in het bstrDocumentUrl vorige DisassemblyData matrixelement, stelt u de bstrDocumentUrl waarde in op een null-waarde.

Als in het dwFlags veld de DF_DOCUMENT_CHECKSUM vlag is ingesteld, volgt aanvullende checksuminformatie de tekenreeks waarnaar het bstrDocumentUrl veld verwijst. Na de nultekenreeks volgt een GUID die het controlesomalgoritme identificeert, gevolgd door een 4-bytewaarde die het aantal bytes in de controlesom aangeeft, en die op zijn beurt wordt gevolgd door de controlesombytes. Zie het voorbeeld in dit onderwerp over het coderen en decoderen van dit veld in Visual C#.

Example

Het bstrDocumentUrl veld kan andere informatie bevatten dan een tekenreeks als de DF_DOCUMENT_CHECKSUM vlag is ingesteld. Het proces voor het maken en lezen van deze gecodeerde tekenreeks is eenvoudig in Visual C++. In Visual C# is het echter een andere zaak. Voor degenen die nieuwsgierig zijn, ziet u in het volgende voorbeeld een manier om de gecodeerde tekenreeks te maken van Visual C# en één manier om de gecodeerde tekenreeks in Visual C# te decoderen.

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

Zie ook