public static void Parse(RhydonContext ctx) { var heapname = ctx.Parameters["heap", "Koi"]; ctx.Logger.Debug($"Looking for #{heapname} stream..."); var heap = ctx.Module.Metadata.AllStreams.SingleOrDefault(s => s.Name == $"#{heapname}"); if (heap == null) { ctx.Logger.Error($"#{heapname} stream not found..."); return; } ctx.Logger.Info("Parsing KoiVM header"); var dnlibreader = heap.CreateReader(); ctx.StartOffset = dnlibreader.StartOffset; ctx.Reader = new BinaryReader(dnlibreader.AsStream()); var magic = ctx.ReadUInt32(); if (magic != 0x68736966) { ctx.Logger.Warning($"Magic wasn't 'fish' (0x68736966), instead: 0x{magic:X}"); } var refCount = (int)ctx.ReadUInt32(); var strCount = (int)ctx.ReadUInt32(); var metCount = (int)ctx.ReadUInt32(); var hdr = new KoiHeader(); hdr.ReadReferences(ctx, refCount); ctx.Logger.Success($"Parsed {refCount} references"); hdr.ReadStrings(ctx, strCount); ctx.Logger.Success($"Parsed {strCount} strings"); hdr.ReadMethods(ctx, metCount); ctx.Logger.Success($"Parsed {metCount} exports"); ctx.Header = hdr; }
public static MethodExport Create(RhydonContext ctx) { var obj = new MethodExport { Offset = ctx.Reader.ReadUInt32() }; if (obj.Offset != 0) { obj.Key = ctx.Reader.ReadUInt32(); } obj.Flags = ctx.Reader.ReadByte(); obj.ArgumentTypes = new ITypeDefOrRef[ctx.Reader.ReadCompressedUint()]; for (var i = 0; i < obj.ArgumentTypes.Length; i++) { obj.ArgumentTypes[i] = (ITypeDefOrRef)ctx.Module.ResolveToken(KoiHeader.FromCodedToken(ctx.Reader.ReadCompressedUint())); } obj.ReturnType = (ITypeDefOrRef)ctx.Module.ResolveToken(KoiHeader.FromCodedToken(ctx.Reader.ReadCompressedUint())); return(obj); }