public static DataDescriptor FromReader(DisReader reader) { DataDescriptor result = new DataDescriptor { Code = 0 }; int code = reader.ReadByte(); if (code == 0) { return(result); } int count = code & 0x0f; if (count == 0) { count = reader.ReadOP(); } result.Code = (code & 0xf0) >> 4; result.Count = count; result.Offset = reader.ReadOP(); int dataSize = 0; if (result.Code == INT8) { dataSize = 1; } else if (result.Code == INT32) { dataSize = 4; } else if (result.Code == FLOAT) { dataSize = 8; } else if (result.Code == STRING) { result.Data = Encoding.UTF8.GetBytes(reader.ReadString(count)); } if (dataSize != 0 && count != 0) { result.Data = reader.ReadBytes(count * dataSize); // big endian to little endian result.Data = result.Data.Reverse().ToArray(); } return(result); }
public static ObjectFile FromReader(DisReader reader) { int magic = reader.ReadOP(); if ((magic != XMAGIC) && (magic != SMAGIC)) { throw new InvalidDataException("Invalid magic number"); } if (magic == SMAGIC) { int slength = reader.ReadOP(); byte[] signature = reader.ReadBytes(slength); } int runtimeFlag = reader.ReadOP(); int stackExtent = reader.ReadOP(); int codeSize = reader.ReadOP(); int dataSize = reader.ReadOP(); int typeSize = reader.ReadOP(); int linkSize = reader.ReadOP(); int entryPc = reader.ReadOP(); int entryType = reader.ReadOP(); ObjectFile result = new ObjectFile(); result.ShareMP = ((runtimeFlag & FLAG_SHAREMP) != 0); result.StackExtent = stackExtent; result.EntryPC = entryPc; result.EntryFrameType = entryType; result.Instructions = new Instruction[codeSize]; for (int i = 0; i < codeSize; i++) { Instruction inst = Instruction.FromReader(reader); result.Instructions[i] = inst; } result.Types = new TypeDescriptor[typeSize]; for (int i = 0; i < typeSize; i++) { result.Types[i] = TypeDescriptor.FromReader(reader); } List <DataDescriptor> data = new List <DataDescriptor> (); while (true) { DataDescriptor descriptor = DataDescriptor.FromReader(reader); if (descriptor.Code == 0) { break; } data.Add(descriptor); } result.Data = data.ToArray(); result.Name = reader.ReadString(); result.Link = new ExportDescriptor[linkSize]; for (int i = 0; i < linkSize; i++) { ExportDescriptor desc = ExportDescriptor.FromReader(reader); desc.FrameSize = result.Types[desc.FrameTypeId].Size; result.Link[i] = desc; } if (!reader.AtEndOfStream) { int importCount = reader.ReadOP(); List <ModuleImportDescriptor> imports = new List <ModuleImportDescriptor> (importCount); for (int i = 0; i < importCount; i++) { imports.Add(ModuleImportDescriptor.FromReader(reader)); } result.Imports = imports.ToArray(); } if (!reader.AtEndOfStream) { int handlerCount = reader.ReadOP(); List <HandlerDescriptor> handlers = new List <HandlerDescriptor> (handlerCount); for (int i = 0; i < handlerCount; i++) { handlers.Add(HandlerDescriptor.FromReader(reader)); } result.Handlers = handlers.ToArray(); } return(result); }