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;
};
Члены
dwFields
DISASSEMBLY_STREAM_FIELDS константа, указывающая, какие поля заполнянны.bstrAddress
Адрес в качестве смещения относительно определенной начальной точки (обычно начала присоединенной функции).bstrCodeBytes
Байты кода для этой инструкции.bstrOpcode
Код операции для инструкции.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.
Для документов, non-текстуальны, контекст рисования можно получить из кода. bstrDocumentUrl поле должно быть значение NULL. Если bstrDocumentUrl поле аналогичен bstrDocumentUrl поле в предыдущей DisassemblyData элемент массива, затем присвойте bstrDocumentUrl в значение NULL.
Если dwFlags поле обладает DF_DOCUMENT_CHECKSUM набор, затем пометить дополнительные сведения о контрольной сумме за строкой, указанной в bstrDocumentUrl поле. В частности, признака конца строки со значением NULL, то следуйте GUID, задающее алгоритм контрольной суммы, который, в свою очередь, указывающими за 4 байта число байтов в контрольной суммы, и, в свою очередь, соответствует байт контрольной суммы. См. пример в этом разделе для кодирования и декодирования это поле Visual C#.
Пример
bstrDocumentUrl это поле может содержать дополнительную информацию, за исключением строки, если DF_DOCUMENT_CHECKSUM пометить задан. Процесс создания и чтение эта кодируемая строка является прямолинейным in 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);
}
}
}
}
}