DisassemblyData
Décrit une instruction de désassemblement pour l’affichage de l’environnement de développement intégré (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;
};
Membres
dwFields
Constante DISASSE MoLY_STREAM_FIELDS qui spécifie les champs à remplir.
bstrAddress
Adresse en tant que décalage par rapport à un point de départ (généralement le début de la fonction associée).
bstrCodeBytes
Octets de code pour cette instruction.
bstrOpcode
Opcode pour cette instruction.
bstrOperands
Opérandes pour cette instruction.
bstrSymbol
Nom du symbole, le cas échéant, associé à l’adresse (symbole public, étiquette, etc.).
uCodeLocationId
Identificateur d’emplacement du code pour cette ligne désassemblé. Si l’adresse du contexte de code d’une ligne est supérieure à l’adresse du contexte de code d’une autre, l’identificateur d’emplacement de code désassemblé du premier est également supérieur à l’identificateur d’emplacement du code du second.
posBeg
Le TEXT_POSITION qui correspond à la position dans un document où commencent les données désassemblantes.
posEnd
Le TEXT_POSITION qui correspond à la position dans un document où se terminent les données désassemblantes.
bstrDocumentUrl
Pour les documents texte qui peuvent être représentés en tant que noms de fichiers, le bstrDocumentUrl
champ est renseigné avec le nom de fichier où la source est trouvée, à l’aide du format file://file name
.
Pour les documents texte qui ne peuvent pas être représentés en tant que noms de fichiers, bstrDocumentUrl
il s’agit d’un identificateur unique pour le document, et le moteur de débogage doit implémenter la méthode GetDocument .
Ce champ peut également contenir des informations supplémentaires sur les case activée sums. Pour plus d’informations, consultez Remarques.
dwByteOffset
Le nombre d’octets que l’instruction est à partir du début de la ligne de code.
dwFlags
Constante DISASSE MoLY_FLAGS qui spécifie les indicateurs actifs.
Notes
Chaque DisassemblyData
structure décrit une instruction de désassemblement. Un tableau de ces structures est retourné par la méthode Read .
La structure TEXT_POSITION est utilisée uniquement pour les documents textuels. La plage de code source de cette instruction est remplie uniquement pour la première instruction générée à partir d’une instruction ou d’une ligne, par exemple, quand dwByteOffset == 0
.
Pour les documents qui ne sont pas textuels, un contexte de document peut être obtenu à partir du code et le bstrDocumentUrl
champ doit être une valeur Null. Si le bstrDocumentUrl
champ est identique bstrDocumentUrl
au champ de l’élément de tableau précédent DisassemblyData
, définissez la bstrDocumentUrl
valeur null.
Si le dwFlags
champ a le jeu d’indicateursDF_DOCUMENT_CHECKSUM
, des informations supplémentaires case activée sum suivent la chaîne pointée par le bstrDocumentUrl
champ. Plus précisément, après la fin de chaîne null, il suit un GUID identifiant l’algorithme de case activée sum qui est à son tour suivi d’une valeur de 4 octets indiquant le nombre d’octets dans le case activée sum et qui à son tour est suivi des octets de case activée sum. Consultez l’exemple de cette rubrique sur l’encodage et le décodage de ce champ en Visual C#.
Exemple
Le bstrDocumentUrl
champ peut contenir des informations supplémentaires autres qu’une chaîne si l’indicateur DF_DOCUMENT_CHECKSUM
est défini. Le processus de création et de lecture de cette chaîne encodée est simple dans Visual C++. Toutefois, dans Visual C#, il s’agit d’une autre question. Pour ceux qui sont curieux, l’exemple suivant montre une façon de créer la chaîne encodée à partir de Visual C# et d’une façon de décoder la chaîne encodée 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);
}
}
}
}
}