다음을 통해 공유


DisassemblyData

표시 하는 통합된 개발 환경 (IDE)에 대 한 하나의 디스어셈블리 명령을 설명 합니다.

typedef struct tagDisassemblyData { 
   DISASSEMBLY_STREAM_FIELDS dwFields;
   BSTR                      bstrAddress;
   BSTR                      bstrAddressOffset;
   BSTR                      bstrCodeBytes;
   BSTR                      bstrOpcode;
   BSTR                      bstrOperands;
   BSTR                      bstrSymbol;
   UINT64                    uCodeLocationId;
   TEXT_POSITION             posBeg;
   TEXT_POSITION             posEnd;
   BSTR                      bstrDocumentUrl;
   DWORD                     dwByteOffset;
   DISASSEMBLY_FLAGS         dwFlags;
} DisassemblyData;
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
    DISASSEMBLY_STREAM_FIELDS 채워진 필드를 지정 하는 상수입니다.

  • bstrAddress
    일부 시작 위치 (일반적으로 연관 된 함수 부분)에서 오프셋으로 주소입니다.

  • bstrCodeBytes
    이 명령에 대해 코드 바이트 수입니다.

  • bstrOpcode
    이 명령에 대 한 opcode입니다.

  • bstrOperands
    이 명령에 대 한 피연산자입니다.

  • bstrSymbol
    기호 이름이 있는 경우 주소 (공용 기호, 레이블 등)와 관련 된.

  • uCodeLocationId
    이 분해 된 줄의 코드 위치 식별자입니다. 다음 한 줄의 코드가 컨텍스트 주소 다른 컨텍스트의 코드 주소 보다 클 경우 디스어셈블된 코드 위치 식별자의 첫 번째도 두 번째 코드 위치 식별자 보다 크면 안 됩니다.

  • posBeg
    TEXT_POSITION 디스어셈블리 데이터가 시작 되는 위치에 위치에서 문서에 해당 합니다.

  • posEnd
    TEXT_POSITION 문서에서 디스어셈블리 데이터 끝나는 위치에 해당 합니다.

  • bstrDocumentUrl
    파일 이름으로 표현 될 수 있습니다 텍스트 문서에 대 한의 bstrDocumentUrl 필드 위치 원본을 찾을 수 있습니다, 파일 이름에 포함 된 형식을 사용 하 여 file://file 이름.

    파일 이름으로 표시 될 수 없는 텍스트 문서에 대 한 bstrDocumentUrl 문서에 대 한 고유 식별자 이며 디버그 엔진 구현 해야는 IDebugDisassemblyStream2::GetDocument 메서드.

    체크섬에 대 한 자세한 정보가이 필드에 포함 될 수도 있습니다. 에 대 한 자세한 내용은 설명 부분을 참조 하십시오.

  • dwByteOffset
    코드 줄의 시작 부분에서 명령입니다 바이트 수입니다.

  • dwFlags
    DISASSEMBLY_FLAGS 활성 플래그를 지정 하는 상수입니다.

설명

DisassemblyData 구조 디스어셈블리 명령에 설명 합니다. 이러한 구조의 배열 로부터 반환 되는 IDebugDisassemblyStream2::Read 메서드.

TEXT_POSITION 구조는 텍스트 기반 문서에 대해서만 사용 됩니다. 이 명령에 대 한 소스 코드 범위 예 문이나 줄에서 생성 된 첫 번째 명령에 대 한만 채울 때, dwByteOffset == 0.

아닌 있는 문서의 경우 문서 컨텍스트 코드를 얻을 수 있습니다 및 해당 bstrDocumentUrl 필드 null 값 이어야 합니다. 경우는 bstrDocumentUrl 필드와 동일는 bstrDocumentUrl 필드 이전에 DisassemblyData 배열 요소를 다음 설정의 bstrDocumentUrl null 값입니다.

경우는 dwFlags 필드는 DF_DOCUMENT_CHECKSUM 추가 체크섬 정보 포인터가 가리키는 문자열 뒤에 오는 다음 플래그 집합을는 bstrDocumentUrl 필드입니다. 특히 null 문자열 종료 문자 뒤는 차례로 체크섬 바이트 수를 나타내는 4 바이트 값으로 오며 차례로 체크섬 바이트 뒤에 체크섬 알고리즘을 식별 하는 GUID는 다음과 같습니다. 인코딩 및 디코딩이 필드에 방법에이 항목의 예제를 참조 하십시오. Visual C#.

예제

bstrDocumentUrl 필드 경우 문자열 이외의 추가 정보를 포함할 수 있습니다의 DF_DOCUMENT_CHECKSUM 플래그가 설정 되었습니다. 만들고이 인코딩된 문자열을 읽는 과정에서 간단 Visual C++. 그러나, Visual C#, 다른 문제입니다. 사람들에 대해 궁금할 것입니다, 다음 예제에서는 인코딩된 문자열을 작성 하는 방법을 보여 줍니다 Visual C# 하 고 인코딩된 문자열을 디코딩 하는 한 가지 방법은 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; 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);
              }
           }
       }
    }
}

참고 항목

참조

구조체 및 공용 구조체

IDebugDisassemblyStream2::Read

DISASSEMBLY_STREAM_FIELDS

IDebugCodeContext2

IDebugDocumentContext2

TEXT_POSITION

DISASSEMBLY_FLAGS