本文整理汇总了C#中Microsoft.Cci.UtilityDataStructures.MemoryReader.GetMemoryBlockAt方法的典型用法代码示例。如果您正苦于以下问题:C# MemoryReader.GetMemoryBlockAt方法的具体用法?C# MemoryReader.GetMemoryBlockAt怎么用?C# MemoryReader.GetMemoryBlockAt使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Microsoft.Cci.UtilityDataStructures.MemoryReader
的用法示例。
在下文中一共展示了MemoryReader.GetMemoryBlockAt方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetMethodIL
internal MethodIL/*?*/ GetMethodIL(
uint methodDefRowId
) {
MethodRow methodRow = this.MethodTable[methodDefRowId];
if (
(methodRow.ImplFlags & MethodImplFlags.CodeTypeMask) != MethodImplFlags.ILCodeType
|| methodRow.RVA == 0
) {
return null;
}
MemoryBlock memBlock = this.RVAToMemoryBlock(methodRow.RVA);
// Error need to check if the Memory Block is empty. This is calse for all the calls...
MemoryReader memReader = new MemoryReader(memBlock);
byte headByte = memReader.ReadByte();
if ((headByte & CILMethodFlags.ILFormatMask) == CILMethodFlags.ILTinyFormat) {
int size = headByte >> CILMethodFlags.ILTinyFormatSizeShift;
return new MethodIL(
true,
8,
0x00000000,
memReader.GetMemoryBlockAt(0, size),
null
);
} else if ((headByte & CILMethodFlags.ILFormatMask) != CILMethodFlags.ILFatFormat) {
// PEFileFormat Error...
return null;
}
// FatILFormat
byte headByte2 = memReader.ReadByte();
if ((headByte2 >> CILMethodFlags.ILFatFormatHeaderSizeShift) != CILMethodFlags.ILFatFormatHeaderSize) {
// PEFile Format Error...
return null;
}
bool localVarInited = (headByte & CILMethodFlags.ILInitLocals) == CILMethodFlags.ILInitLocals;
bool moreSectsPresent = (headByte & CILMethodFlags.ILMoreSects) == CILMethodFlags.ILMoreSects;
ushort maxStack = memReader.ReadUInt16();
int codeSize = memReader.ReadInt32();
uint localSignatureToken = memReader.ReadUInt32();
MemoryBlock ilCodeMemBlock = memReader.GetMemoryBlockAt(0, codeSize);
SEHTableEntry[]/*?*/ sehTableEntries = null;
if (moreSectsPresent) {
memReader.SkipBytes(codeSize);
memReader.Align(4);
byte sectHeader = memReader.ReadByte();
if ((sectHeader & CILMethodFlags.SectEHTable) != CILMethodFlags.SectEHTable) {
// PEFile Format Error...
return null;
}
bool sectFatFormat = (sectHeader & CILMethodFlags.SectFatFormat) == CILMethodFlags.SectFatFormat;
int dataSize = memReader.ReadByte();
if (sectFatFormat) {
dataSize += (int)memReader.ReadUInt16() << 8;
sehTableEntries = PEFileReader.GetFatSEHEntries(memReader, dataSize / 24);
} else {
memReader.SkipBytes(2); //skip over reserved field
sehTableEntries = PEFileReader.GetSmallSEHEntries(memReader, dataSize / 12);
}
}
return new MethodIL(
localVarInited,
maxStack,
localSignatureToken,
ilCodeMemBlock,
sehTableEntries
);
}