Exemple #1
0
        public static McaChunk ReadChunk(byte[] buffer, int dx, int dz)
        {
            //from mca file header
            int i = 4 * (dx + dz * 32);
            int offset = (buffer [i] << 16) | (buffer [i + 1] << 8) | (buffer [i + 2]);
            int sectors = buffer [i + 3];

            if (offset == 0 && sectors == 0)
                return null;

            Console.WriteLine("Read Chunk " + dx + "," + dz + " @ " + offset + ":" + sectors);

            if (offset == 0 || sectors == 0)
                throw new InvalidDataException("zero offset/sector");

            offset = offset << 12; //4096 = 2**12
            int length = EndianBitConverter.Big.ToInt32(buffer, offset); //byte length
            if (((length + 5 - 1) >> 12) + 1 != sectors)
                throw new InvalidDataException("Body length is larger than the sectors, " + length + " > " + (sectors * 4096));
            if (buffer [offset + 4] != 2)
                throw new NotImplementedException("Only support zlib compression");
            
            McaChunk mc = new McaChunk(dx, dz);

            MemoryStream ms = new MemoryStream(buffer, offset + 5, length);
            
            using (ZlibStream compressed = new ZlibStream(ms, CompressionMode.Decompress))
            {
                EndianBinaryReader r = new EndianBinaryReader(EndianBitConverter.Big, compressed);
                mc.Tag = Tag.ReadTag(r);
            }
            
            return mc;
        }
Exemple #2
0
 public void Load(MemoryStream memory)
 {
     var reader = new EndianBinaryReader(EndianBitConverter.Big, memory);
     switch (Format)
     {
         case BasicHeader.HeaderFormats.F0: //11 bytes
             {
                 var timeStampByte = new byte[4] {0x00, reader.ReadByte(), reader.ReadByte(), reader.ReadByte()};
                 TimeStamp = EndianBitConverter.Big.ToInt32(timeStampByte, 0);
                 var lengthByte = new byte[4] {0x00, reader.ReadByte(), reader.ReadByte(), reader.ReadByte()};
                 MessageLength = EndianBitConverter.Big.ToInt32(lengthByte, 0);
                 MessageType = reader.ReadByte();
                 var messageStreamBytes = reader.ReadBytes(4);
                 MessageStreamId = EndianBitConverter.Little.ToInt32(messageStreamBytes, 0);
             }
             break;
         case BasicHeader.HeaderFormats.F1: //7 bytes
             {
                 var timeStampByte = new byte[4] {0x00, reader.ReadByte(), reader.ReadByte(), reader.ReadByte()};
                 TimeStamp = EndianBitConverter.Big.ToInt32(timeStampByte, 0);
                 var lengthByte = new byte[4] {0x00, reader.ReadByte(), reader.ReadByte(), reader.ReadByte()};
                 MessageLength = EndianBitConverter.Big.ToInt32(lengthByte, 0);
                 MessageType = reader.ReadByte();
             }
             break;
         case BasicHeader.HeaderFormats.F2: //3 bytes
             {
                 var timeStampByte = new byte[4] {0x00, reader.ReadByte(), reader.ReadByte(), reader.ReadByte()};
                 TimeStamp = EndianBitConverter.Big.ToInt32(timeStampByte, 0);
             }
             break;
         case BasicHeader.HeaderFormats.F3: //No bytes
             break;
     }
 }
		public void read(EndianBinaryReader r) {
			Time = r.ReadSingle();
			Measure = r.ReadInt16();
			Beat = r.ReadInt16();
			PhraseIteration = r.ReadInt32();
			Mask = r.ReadInt32();
		}
        private void readPixels(EndianBinaryReader reader, ushort width, ushort height, DmfFile file)
        {
            int totalPixels = width * height;
            uint xLocation = 1;
            uint yLocation = 1;
            for (int i = 0; i < totalPixels; i++)
            {
                short altitude = reader.ReadInt16();
                byte peakRoughness = reader.ReadByte();
                byte fractalRoughness = reader.ReadByte();
                byte cliffStrength = reader.ReadByte();
                byte erosionStrength = reader.ReadByte();
                byte autoLakeStrength = reader.ReadByte();
                byte climateId = reader.ReadByte();
                byte specialTypeId = reader.ReadByte();
                byte specialTypeParam = reader.ReadByte();

                file.addPixel(new DmfPixelInfo(xLocation, yLocation, altitude, peakRoughness, fractalRoughness, cliffStrength, erosionStrength, autoLakeStrength, climateId, specialTypeId, specialTypeParam));

                xLocation++;
                if (xLocation > width)
                {
                    xLocation = 1;
                    yLocation++;
                }
            }

            debugLine("pixel count: " + file.pixels.Count());
        }
        public static Stream ConvertOgg(string inputFile)
        {
            if (needsConversion(inputFile))
            {
                var platform = getPlatform(inputFile);
                EndianBitConverter bitConverter = platform.GetBitConverter();

                using (var outputFileStream = new MemoryStream())
                using (var inputFileStream = File.Open(inputFile, FileMode.Open))
                using (var writer = new EndianBinaryWriter(bitConverter, outputFileStream))
                using (var reader = new EndianBinaryReader(bitConverter, inputFileStream))
                {
                    writer.Write(reader.ReadBytes(4));
                    UInt32 fileSize = reader.ReadUInt32();
                    fileSize -= 8; // We're removing data, so update the size in the header
                    writer.Write(fileSize);
                    writer.Write(reader.ReadBytes(8));
                    writer.Write(66); reader.ReadUInt32(); // New fmt size is 66
                    writer.Write(reader.ReadBytes(16));
                    writer.Write((ushort)48); reader.ReadUInt16(); // New cbSize is 48
                    writer.Write(reader.ReadBytes(6));
                    reader.BaseStream.Seek(8, SeekOrigin.Current); // Skip ahead 8 bytes, we don't want the vorb chunk
                    writer.Write(reader.ReadBytes((int)reader.BaseStream.Length - (int)reader.BaseStream.Position));

                    return new MemoryStream(outputFileStream.GetBuffer(), 0, (int)outputFileStream.Length);
                }
            }

            return File.OpenRead(inputFile);
        }
		protected override void Parse (EndianBinaryReader r)
		{
			/*
            string channel = ReadString8(r);
            Varint int length = r.ReadInt16();
            if (length > MaxDataSize)
                throw new InvalidDataException("Plugin package payload size > " + MaxDataSize + " bytes");
            byte[] data = r.ReadBytesOrThrow(length);
            switch (channel)
            {
                case MCItemName.ChannelID:
                    return new MCItemName(data);
                case "MC|AdvCdm":
                case "MC|Beacon":
                case "MC|TPack":
                case "MC|TrList":
                case "MC|TrSel":
                case "MC|Brand":
                    return new UnknownPluginMessageServer(channel, data);
                default:
#if DEBUG
                    throw new InvalidOperationException("New Plugin channel: " + channel);
#else
                    return new UnknownPluginMessageServer(channel, data);
#endif
            }
*/
		}
Exemple #7
0
        private static List<Texture2D> LoadTEX1FromFile(EndianBinaryReader reader, long chunkStart)
        {
            ushort textureCount = reader.ReadUInt16();
            ushort padding = reader.ReadUInt16(); // Usually 0xFFFF?
            uint textureHeaderOffset = reader.ReadUInt32(); // textureCount # bti image headers are stored here, relative to chunkStart.
            uint stringTableOffset = reader.ReadUInt32(); // One filename per texture. relative to chunkStart.
            List<Texture2D> textureList = new List<Texture2D>();

            // Get all Texture Names
            reader.BaseStream.Position = chunkStart + stringTableOffset;
            StringTable stringTable = StringTable.FromStream(reader);

            for (int t = 0; t < textureCount; t++)
            {
                // 0x20 is the length of the BinaryTextureImage header which all come in a row, but then the stream gets jumped around while loading the BTI file.
                reader.BaseStream.Position = chunkStart + textureHeaderOffset + (t * 0x20);
                BinaryTextureImage texture = new BinaryTextureImage();
                texture.Load(reader, chunkStart + 0x20, t);

                Texture2D texture2D = new Texture2D(texture.Width, texture.Height);
                texture2D.Name = stringTable[t];
                texture2D.PixelData = texture.GetData();
                textureList.Add(texture2D);

                string executionPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
                texture.SaveImageToDisk(executionPath + "/TextureDump/" + string.Format("{0}_({1}-{2}).png", stringTable[t], texture.Format, t));
            }

            return textureList;
        }
Exemple #8
0
    static public void Fill(byte[] bytes)
    {

        var binReader = new EndianBinaryReader(Endian.LittleEndian, new MemoryStream(bytes));
        binReader.Endian = binReader.ReadBoolean() ? Endian.LittleEndian : Endian.BigEndian;
        
        
        var jumpPos = binReader.ReadInt32();
        
        //跳过表头信息
        binReader.BaseStream.Position = jumpPos;
        
        /*
        var headerCount = binReader.ReadInt32();
        var headers = new string[headerCount];
        var types = new string[headerCount];
        for (var i = 0; i < headerCount; i++)
        {
            headers[i] = binReader.ReadUTF();
            types[i] = binReader.ReadUTF();
        }
        */
        
        var count = binReader.ReadInt32();
        for (int i = 0; i < count; i++)
        {
            var vo = new LangVO();
            vo.decode(binReader);
            list_vo.Add(vo);
            dic_vo.Add(vo.Age, vo);
        }

    }
        public static void UnpackSng(Stream input, Stream output, Platform platform) {
            EndianBitConverter conv = platform.GetBitConverter;

            using (var decrypted = new MemoryStream())
            using (var ebrDec = new EndianBinaryReader(conv, decrypted)) {
                byte[] key;
                switch (platform.platform) {
                    case GamePlatform.Mac:
                        key = RijndaelEncryptor.SngKeyMac;
                        break;
                    case GamePlatform.Pc:
                        key = RijndaelEncryptor.SngKeyPC;
                        break;
                    default:
                        key = null;
                        break;
                }
                if (key != null)
                    RijndaelEncryptor.DecryptSngData(input, decrypted, key, conv);
                else {
                    input.CopyTo(decrypted);
                    decrypted.Seek(8, SeekOrigin.Begin);
                }
                //unZip
                long plainLen = ebrDec.ReadUInt32();
                ushort xU = ebrDec.ReadUInt16();
                decrypted.Position -= 2;
                if (xU == 0x78DA || xU == 0xDA78) {//LE 55928 //BE 30938
                    RijndaelEncryptor.Unzip(decrypted, output, false);
                }
            }
        }
Exemple #10
0
 public TEX0(EndianBinaryReader er)
 {
     long basepos = er.BaseStream.Position;
     Signature = er.ReadString(Encoding.ASCII, 4);
     if (Signature != "TEX0") throw new SignatureNotCorrectException(Signature, "TEX0", er.BaseStream.Position - 4);
     SectionSize = er.ReadUInt32();
     TexInfo = new texInfo(er);
     Tex4x4Info = new tex4x4Info(er);
     PlttInfo = new plttInfo(er);
     dictTex = new Dictionary<DictTexData>(er);
     for (int i = 0; i < dictTex.numEntry; i++)
     {
         dictTex[i].Value.ReadData(er, TexInfo.ofsTex, Tex4x4Info.ofsTex, Tex4x4Info.ofsTexPlttIdx, basepos);
     }
     dictPltt = new Dictionary<DictPlttData>(er);
     List<UInt32> Offset = new List<uint>();
     for (int i = 0; i < dictPltt.numEntry; i++)
     {
         Offset.Add(dictPltt[i].Value.offset);
     }
     Offset = Offset.Distinct().ToList();
     Offset.Sort();
     for (int i = 0; i < dictPltt.numEntry; i++)
     {
         int idx = Offset.IndexOf(dictPltt[i].Value.offset);
         if (idx == Offset.Count - 1)
         {
             dictPltt[i].Value.ReadData(er, PlttInfo.ofsPlttData, (uint)er.BaseStream.Length - (Offset[idx] + PlttInfo.ofsPlttData + (uint)basepos), basepos);
         }
         else
         {
             dictPltt[i].Value.ReadData(er, PlttInfo.ofsPlttData, Offset[idx + 1] - Offset[idx], basepos);
         }
     }
 }
Exemple #11
0
        public bool Update()
        {
            var bitStream = downloader.DownloadStream;
            var reader = new EndianBinaryReader(EndianBitConverter.Big, bitStream);

            if(bitStream != null)
            {
                var stream = new StreamReader(bitStream);
                {
                    reader.ReadBytes(3); //"FLV"
                    reader.ReadBytes(6); //Other starter shit

                    while (true)
                    {
                        try
                        {
                            var footer = reader.ReadUInt32();
                            var tag = new FlvTag();
                            tag.Load(reader);

                            AddedTag(tag);

                        }
                        catch (Exception)
                        {
                            reader.Close();
                            //End of stream
                            return false;
                        }
                    }
                }
            }

            return true;
        }
        public FFNT(byte[] Data)
        {
            EndianBinaryReader er = new EndianBinaryReader(new MemoryStream(Data), Endianness.BigEndian);
            Header = new FFNTHeader(er);
            FontInfo = new FINF(er);
            er.BaseStream.Position = FontInfo.TGLPOffset - 8;
            TextureGlyph = new TGLP(er);

            List<CWDH> tmp = new List<CWDH>();
            er.BaseStream.Position = FontInfo.CWDHOffset - 8;
            CWDH Last;
            do
            {
                Last = new CWDH(er);
                tmp.Add(Last);
                if (Last.NextCWDHOffset != 0) er.BaseStream.Position = Last.NextCWDHOffset - 8;
            }
            while (Last.NextCWDHOffset != 0);
            CharWidths = tmp.ToArray();

            List<CMAP> tmp2 = new List<CMAP>();
            er.BaseStream.Position = FontInfo.CMAPOffset - 8;
            CMAP Last2;
            do
            {
                Last2 = new CMAP(er);
                tmp2.Add(Last2);
                if (Last2.NextCMAPOffset != 0) er.BaseStream.Position = Last2.NextCMAPOffset - 8;
            }
            while (Last2.NextCMAPOffset != 0);
            CharMaps = tmp2.ToArray();
            er.Close();
        }
Exemple #13
0
 public wnd1(EndianBinaryReader er)
     : base(er)
 {
     long basepos = er.BaseStream.Position - 0x4C;
     InflationLeft = er.ReadUInt16() / 16f;
     InflationRight = er.ReadUInt16() / 16f;
     InflationTop = er.ReadUInt16() / 16f;
     InflationBottom = er.ReadUInt16() / 16f;
     FrameSizeLeft = er.ReadUInt16();
     FrameSizeRight = er.ReadUInt16();
     FrameSizeTop = er.ReadUInt16();
     FrameSizeBottom = er.ReadUInt16();
     NrFrames = er.ReadByte();
     byte tmp = er.ReadByte();
     UseLTMaterial = (tmp & 1) == 1;
     UseVtxColorForAllWindow = (tmp & 2) == 2;
     Kind = (WindowKind)((tmp >> 2) & 3);
     DontDrawContent = (tmp & 8) == 16;
     Padding = er.ReadUInt16();
     ContentOffset = er.ReadUInt32();
     FrameOffsetTableOffset = er.ReadUInt32();
     er.BaseStream.Position = basepos + ContentOffset;
     Content = new WindowContent(er);
     er.BaseStream.Position = basepos + FrameOffsetTableOffset;
     WindowFrameOffsets = er.ReadUInt32s(NrFrames);
     WindowFrames = new WindowFrame[NrFrames];
     for (int i = 0; i < NrFrames; i++)
     {
         er.BaseStream.Position = basepos + WindowFrameOffsets[i];
         WindowFrames[i] = new WindowFrame(er);
     }
     er.BaseStream.Position = basepos + SectionSize;
 }
Exemple #14
0
 //Constructors
 public ByteBuffer()
 {
     stream = new MemoryStream();
     bitConverter = new LittleEndianBitConverter();
     writer = new EndianBinaryWriter(bitConverter, stream);
     reader = new EndianBinaryReader(bitConverter, stream);
 }
Exemple #15
0
 public POTIRoute(EndianBinaryReader er)
 {
     NrPoints = er.ReadUInt16();
     Setting1 = er.ReadByte();
     Setting2 = er.ReadByte();
     for (int i = 0; i < NrPoints; i++) Points.Add(new POTIPoint(er));
 }
Exemple #16
0
 public override void ClearBody()
 {
     base.ClearBody();
     this.outputBuffer = null;
     this.dataIn = null;
     this.dataOut = null;
     this.length = 0;
 }
Exemple #17
0
 public static Tag Read(string path)
 {
     using (GZipStream gzip = new GZipStream (new FileStream (path, FileMode.Open, FileAccess.Read), CompressionMode.Decompress))
     {
         EndianBinaryReader r = new EndianBinaryReader(EndianBitConverter.Big, gzip);
         return Tag.ReadTag(r);
     }
 }
 public override void ClearBody()
 {
     base.ClearBody();
     this.byteBuffer = null;
     this.dataIn = null;
     this.dataOut = null;
     this.bytesRemaining = -1;
 }
Exemple #19
0
 public ByteBuffer(int capacity)
 {
     stream = new MemoryStream();
     bitConverter = new LittleEndianBitConverter();
     writer = new EndianBinaryWriter(bitConverter, stream);
     reader = new EndianBinaryReader(bitConverter, stream);
     stream.Capacity = capacity;
 }
Exemple #20
0
 public POTI(EndianBinaryReader er)
 {
     Signature = er.ReadString(Encoding.ASCII, 4);
     if (Signature != "ITOP") throw new SignatureNotCorrectException(Signature, "ITOP", er.BaseStream.Position - 4);
     NrRoutes = er.ReadUInt16();
     NrPoints = er.ReadUInt16();
     for (int i = 0; i < NrRoutes; i++) Routes.Add(new POTIRoute(er));
 }
    //private Socket sock;
    //private IPEndPoint ipep;
    //private IPAddress ipAddr;
    /**
         * Create the server connection
         */
    public ConnectionObject(String host, int port)
    {
        tc = new TcpClient(host, port);
            tcS = tc.GetStream();

            bw = new EndianBinaryWriter(new BigEndianBitConverter(), tcS);
            br = new EndianBinaryReader(new BigEndianBitConverter(), tcS);
    }
Exemple #22
0
 public ImageTextureCtr(EndianBinaryReader er)
     : base(er)
 {
     TextureImageOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
     long curpos = er.BaseStream.Position;
     er.BaseStream.Position = TextureImageOffset;
     TextureImage = new PixelBasedImageCtr(er);
     er.BaseStream.Position = curpos;
 }
Exemple #23
0
 protected MessageReader(byte[] backing)
     : this()
 {
     if (backing != null)
     {
         this._ms = new MemoryStream(backing);
         this.Reader = new EndianBinaryReader(Endianness, _ms);
     }
 }
		public void read(EndianBinaryReader r) {
			Solo = r.ReadByte();
			Disparity = r.ReadByte();
			Ignore = r.ReadByte();
			Padding = r.ReadByte();
			MaxDifficulty = r.ReadInt32();
			PhraseIterationLinks = r.ReadInt32();
			Name = r.ReadBytes(32);
		}
 public KCLOctree(EndianBinaryReader er, int NrNodes)
 {
     long baseoffset = er.BaseStream.Position;
     RootNodes = new KCLOctreeNode[NrNodes];
     for (int i = 0; i < NrNodes; i++)
     {
         RootNodes[i] = new KCLOctreeNode(er, baseoffset);
     }
 }
 protected override void Parse(EndianBinaryReader r)
 {
     BlockPosition = CoordInt.Read(r);
     FaceDirection = (Face)r.ReadByte();
     Item = SlotItem.Read(r);
     CursorX = r.ReadByte();
     CursorY = r.ReadByte();
     CursorZ = r.ReadByte();
 }
        public void ReadCharsBeyondInternalBufferSize()
        {
            MemoryStream stream = new MemoryStream(TestBytes);
            EndianBinaryReader subject = new EndianBinaryReader(EndianBitConverter.Little, stream);

            char[] chars = new char[TestString.Length];
            subject.Read(chars, 0, chars.Length);
            Assert.AreEqual(TestString, new string(chars));
        }
Exemple #28
0
 protected override void Parse(EndianBinaryReader r)
 {
     Version = (ProtocolVersion)ReadVarInt(r);
     Host = ReadString8(r);
     Port = r.ReadUInt16();
     State = (HandshakeState)ReadVarInt(r);
     
     DebugGotAll(r);
 }
Exemple #29
0
 public ByteBuffer(int capacity, int position, MemoryStream _stream)
 {
     stream = new MemoryStream();
     bitConverter = new LittleEndianBitConverter();
     writer = new EndianBinaryWriter(bitConverter, stream);
     reader = new EndianBinaryReader(bitConverter, stream);
     stream.Capacity = capacity;
     stream.Position = position;
     stream = _stream;
 }
Exemple #30
0
 public ByteBuffer(Endianness _endianess, System.Text.Encoding _encoding)
 {
     stream = new MemoryStream();
     if (_endianess == Endianness.BigEndian)
         bitConverter = new BigEndianBitConverter();
     else
         bitConverter = new LittleEndianBitConverter();
     writer = new EndianBinaryWriter(bitConverter, stream, _encoding);
     reader = new EndianBinaryReader(bitConverter, stream, _encoding);
 }
Exemple #31
0
 public override void FromBinaryReader(EndianBinaryReader reader)
 {
     SpawnId   = reader.ReadInt32();
     ProcessId = reader.ReadInt32();
     CmdArgs   = reader.ReadString();
 }
        private void ReadResponse()
        {
            using (MemoryStream ms = new MemoryStream(incomingBuffer))
                using (var reader = new EndianBinaryReader(EndianBitConverter.Big, ms, Encoding.UTF8))
                {
                    BinaryInputArchive bbia     = BinaryInputArchive.GetArchive(reader);
                    ReplyHeader        replyHdr = new ReplyHeader();

                    replyHdr.Deserialize(bbia, "header");
                    if (replyHdr.Xid == -2)
                    {
                        // -2 is the xid for pings
                        if (LOG.IsDebugEnabled)
                        {
                            LOG.Debug(string.Format("Got ping response for sessionid: 0x{0:X} after {1}ms", conn.SessionId, (DateTime.Now.Nanos() - lastPingSentNs) / 1000000));
                        }
                        return;
                    }
                    if (replyHdr.Xid == -4)
                    {
                        // -2 is the xid for AuthPacket
                        // TODO: process AuthPacket here
                        if (LOG.IsDebugEnabled)
                        {
                            LOG.Debug(string.Format("Got auth sessionid:0x{0:X}", conn.SessionId));
                        }
                        return;
                    }
                    if (replyHdr.Xid == -1)
                    {
                        // -1 means notification
                        if (LOG.IsDebugEnabled)
                        {
                            LOG.Debug(string.Format("Got notification sessionid:0x{0}", conn.SessionId));
                        }
                        WatcherEvent @event = new WatcherEvent();
                        @event.Deserialize(bbia, "response");

                        // convert from a server path to a client path
                        if (conn.ChrootPath != null)
                        {
                            string serverPath = @event.Path;
                            if (serverPath.CompareTo(conn.ChrootPath) == 0)
                            {
                                @event.Path = "/";
                            }
                            else
                            {
                                @event.Path = serverPath.Substring(conn.ChrootPath.Length);
                            }
                        }

                        WatchedEvent we = new WatchedEvent(@event);
                        if (LOG.IsDebugEnabled)
                        {
                            LOG.Debug(string.Format("Got {0} for sessionid 0x{1:X}", we, conn.SessionId));
                        }

                        conn.consumer.QueueEvent(we);
                        return;
                    }
                    if (pendingQueue.IsEmpty())
                    {
                        throw new IOException(string.Format("Nothing in the queue, but got {0}", replyHdr.Xid));
                    }

                    Packet packet;
                    lock (pendingQueueLock)
                    {
                        packet = pendingQueue.First.Value;
                        pendingQueue.RemoveFirst();
                    }

                    /*
                     * Since requests are processed in order, we better get a response
                     * to the first request!
                     */
                    try
                    {
                        if (packet.header.Xid != replyHdr.Xid)
                        {
                            packet.replyHeader.Err = (int)KeeperException.Code.CONNECTIONLOSS;
                            throw new IOException(string.Format("Xid out of order. Got {0} expected {1}", replyHdr.Xid, packet.header.Xid));
                        }

                        packet.replyHeader.Xid  = replyHdr.Xid;
                        packet.replyHeader.Err  = replyHdr.Err;
                        packet.replyHeader.Zxid = replyHdr.Zxid;
                        if (replyHdr.Zxid > 0)
                        {
                            lastZxid = replyHdr.Zxid;
                        }
                        if (packet.response != null && replyHdr.Err == 0)
                        {
                            packet.response.Deserialize(bbia, "response");
                        }

                        if (LOG.IsDebugEnabled)
                        {
                            LOG.Debug(string.Format("Reading reply sessionid:0x{0:X}, packet:: {1}", conn.SessionId, packet));
                        }
                    }
                    finally
                    {
                        FinishPacket(packet);
                    }
                }
        }
Exemple #33
0
        private static List <T> LoadVertexAttribute <T>(EndianBinaryReader reader, int totalAttributeDataLength, byte decimalPoint, VertexArrayType arrayType, VertexDataType dataType, VertexColorType colorType) where T : new()
        {
            int componentCount = 0;

            switch (arrayType)
            {
            case VertexArrayType.Position:
            case VertexArrayType.Normal:
                componentCount = 3;
                break;

            case VertexArrayType.Color0:
            case VertexArrayType.Color1:
                componentCount = 4;
                break;

            case VertexArrayType.Tex0:
            case VertexArrayType.Tex1:
            case VertexArrayType.Tex2:
            case VertexArrayType.Tex3:
            case VertexArrayType.Tex4:
            case VertexArrayType.Tex5:
            case VertexArrayType.Tex6:
            case VertexArrayType.Tex7:
                componentCount = 2;
                break;

            default:
                WLog.Warning(LogCategory.ModelLoading, null, "Unsupported ArrayType \"{0}\" found while loading VTX1!", arrayType);
                break;
            }


            // We need to know the length of each 'vertex' (which can vary based on how many attributes and what types there are)
            int vertexSize = 0;

            switch (dataType)
            {
            case VertexDataType.Float32:
                vertexSize = componentCount * 4;
                break;

            case VertexDataType.Unsigned16:
            case VertexDataType.Signed16:
                vertexSize = componentCount * 2;
                break;

            case VertexDataType.Signed8:
            case VertexDataType.Unsigned8:
                vertexSize = componentCount * 1;
                break;

            case VertexDataType.None:
                break;

            default:
                WLog.Warning(LogCategory.ModelLoading, null, "Unsupported DataType \"{0}\" found while loading VTX1!", dataType);
                break;
            }

            switch (colorType)
            {
            case VertexColorType.RGB8:
                vertexSize = 3;
                break;

            case VertexColorType.RGBX8:
            case VertexColorType.RGBA8:
                vertexSize = 4;
                break;

            case VertexColorType.None:
                break;

            case VertexColorType.RGB565:
            case VertexColorType.RGBA4:
            case VertexColorType.RGBA6:
            default:
                WLog.Warning(LogCategory.ModelLoading, null, "Unsupported Color Data Type: {0}!", colorType);
                break;
            }


            int      sectionSize = totalAttributeDataLength / vertexSize;
            List <T> values      = new List <T>(sectionSize);
            float    scaleFactor = (float)Math.Pow(0.5, decimalPoint);

            for (int v = 0; v < sectionSize; v++)
            {
                // Create a default version of the object and then fill it up depending on our component count and its data type...
                dynamic value = new T();

                for (int i = 0; i < componentCount; i++)
                {
                    switch (dataType)
                    {
                    case VertexDataType.Float32:
                        value[i] = reader.ReadSingle() * scaleFactor;
                        break;

                    case VertexDataType.Unsigned16:
                        value[i] = (float)reader.ReadUInt16() * scaleFactor;
                        break;

                    case VertexDataType.Signed16:
                        value[i] = (float)reader.ReadInt16() * scaleFactor;
                        break;

                    case VertexDataType.Unsigned8:
                        value[i] = (float)reader.ReadByte() * scaleFactor;
                        break;

                    case VertexDataType.Signed8:
                        value[i] = (float)reader.ReadSByte() * scaleFactor;
                        break;

                    case VertexDataType.None:
                        // Let the next switch statement get it.
                        break;

                    default:
                        WLog.Warning(LogCategory.ModelLoading, null, "Unsupported Data Type: {0}!", dataType);
                        break;
                    }


                    switch (colorType)
                    {
                    case VertexColorType.RGBX8:
                    case VertexColorType.RGB8:
                    case VertexColorType.RGBA8:
                        value[i] = reader.ReadByte() / 255f;
                        break;

                    case VertexColorType.None:
                        break;

                    case VertexColorType.RGB565:
                    case VertexColorType.RGBA4:
                    case VertexColorType.RGBA6:
                    default:
                        WLog.Warning(LogCategory.ModelLoading, null, "Unsupported Color Data Type: {0}!", colorType);
                        break;
                    }
                }
                values.Add(value);
            }

            return(values);
        }
Exemple #34
0
 public DestroyItem(EndianBinaryReader reader)
 {
     Hash = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadUInt16()));
     CollectedByPlayer = reader.ReadBoolean();
     reader.ReadInt16();
 }
Exemple #35
0
 /// <summary>
 /// Parse the buffer into class parameters
 /// </summary>
 protected abstract void Parse(EndianBinaryReader r);
Exemple #36
0
 public DDSHeader(Stream stream, bool leaveOpen = true)
 {
     using (var reader = new EndianBinaryReader(stream, Encoding.Default, leaveOpen, Endianness.LittleEndian))
         Read(reader);
 }
Exemple #37
0
 public override void FromBinaryReader(EndianBinaryReader reader)
 {
     LobbyId  = reader.ReadString();
     TeamName = reader.ReadString();
 }
 public ScriptContext(EndianBinaryReader r)
 {
     _reader = r;
 }
Exemple #39
0
 protected override void Parse(EndianBinaryReader r)
 {
     EID      = ReadVarInt(r);
     Position = CoordInt.Read(r);
 }
        public static Stream ConvertAudioPlatform(string inputFile)
        {
            inputFile.VerifyHeaders();
            var platform = inputFile.GetAudioPlatform();

            EndianBitConverter bitConverter;
            EndianBitConverter targetbitConverter;

            if (!platform.IsConsole)
            {
                bitConverter       = EndianBitConverter.Little;
                targetbitConverter = EndianBitConverter.Big;
            }
            else if (platform.IsConsole)
            {
                bitConverter       = EndianBitConverter.Big;
                targetbitConverter = EndianBitConverter.Little;
            }
            else
            {
                throw new InvalidDataException("The input file doesn't appear to be a valid Wwise file.");
            }

            using (var outputFileStream = new MemoryStream())
                using (var inputFileStream = File.Open(inputFile, FileMode.Open))
                    using (var writer = new EndianBinaryWriter(targetbitConverter, outputFileStream))
                        using (var reader = new EndianBinaryReader(bitConverter, inputFileStream))
                        {
                            // Process Header
                            UInt32 header = reader.ReadUInt32();
                            if (header == 1179011410)//RIFF header to RIFX
                            //raw
                            {
                                writer.Write(1380533848);
                            }
                            else
                            {
                                //raw
                                writer.Write(1179011410);      // 1179011410
                            }
                            writer.Write(reader.ReadUInt32()); // Size of File
                            //raw
                            writer.Write(reader.ReadBytes(4)); // WAVE (RIFF type)

                            //Process Format
                            writer.Write(reader.ReadBytes(4)); // fmt magicID                    //raw
                            writer.Write(reader.ReadUInt32()); // fmt size
                            writer.Write(reader.ReadUInt16()); // fmt tag (-1)
                            writer.Write(reader.ReadUInt16()); // channels
                            writer.Write(reader.ReadUInt32()); // samplesPerSec
                            writer.Write(reader.ReadUInt32()); // avgBytesPerSec                 //SeekTableGranulary?
                            writer.Write(reader.ReadUInt16()); // blockAlign
                            writer.Write(reader.ReadUInt16()); // bitsPerSample
                            writer.Write(reader.ReadUInt16()); //short cbSize 0-22               // WAVEFORMATEXTENSIBLE
                            writer.Write(reader.ReadUInt16()); //short wSamplesPerBlock;         // WAVEFORMATEXTENSIBLE
                            writer.Write(reader.ReadUInt32()); //long  dwChannelMask;            // WAVEFORMATEXTENSIBLE
                            writer.Write(reader.ReadUInt32()); //long  dwTotalPCMFrames;         // Wwise
                            UInt32 start = reader.ReadUInt32();
                            writer.Write(start);               //long  dwLoopStartPacketOffset;   // Wwise
                            UInt32 end = reader.ReadUInt32();
                            writer.Write(end);                 //long  dwLoopEndPacketOffset;     // Wwise
                            writer.Write(reader.ReadUInt16()); //short uLoopBeginExtra;           // Wwise
                            writer.Write(reader.ReadUInt16()); //short uLoopEndExtra;             // Wwise
                            UInt32 seektablesize = reader.ReadUInt32();
                            writer.Write(seektablesize);       //long dwSeekTableSize;            // Wwise
                            writer.Write(reader.ReadUInt32()); //long  dwVorbisDataOffset;        // Wwise
                            writer.Write(reader.ReadUInt16()); //short uMaxPacketSize;            // Wwise
                            writer.Write(reader.ReadUInt16()); //short uLastGranuleExtra;         // Wwise
                            writer.Write(reader.ReadUInt32()); //long  dwDecodeAllocSize;         // Wwise
                            writer.Write(reader.ReadUInt32()); //long  dwDecodeX64AllocSize;      // Wwise
                            //raw
                            writer.Write(reader.ReadBytes(4)); //long  uHashCodebook;             // Wwise vorbis_analysis_headerout
                            writer.Write(reader.ReadByte());   //char  uBlockSizes[2];            // Wwise
                            writer.Write(reader.ReadByte());   //char  uBlockSizes[2];            // Wwise

                            // Process DATA section - contains size, seektable, codebook, stream (biggest part)
                            //raw data
                            writer.Write(reader.ReadBytes(4)); // the word data
                            writer.Write(reader.ReadUInt32()); //data size

                            //seektable
                            var y = seektablesize / 4;
                            for (int i = 0; i < y; i++)
                            {
                                writer.Write(reader.ReadUInt16()); //seekgranularity
                                writer.Write(reader.ReadUInt16()); //unk. actual granularity used??
                            }

                            //codebook
                            UInt16 codebooksize = reader.ReadUInt16();
                            writer.Write(codebooksize); //codebook size
                            for (int i = 0; i < codebooksize; i++)
                            {
                                //raw data
                                writer.Write(reader.ReadByte());
                            }

                            //stream
                            var streamsize = (end - start); //calculate the total stream size till End of File
                            for (int i = 0; i < streamsize; i++)
                            {
                                UInt16 packetsize = reader.ReadUInt16(); // size of packet
                                i++;                                     // increase because two bytes read for size of packet
                                writer.Write(packetsize);
                                for (int z = 0; z < packetsize; z++)
                                {
                                    Byte packet = reader.ReadByte();
                                    writer.Write(packet); // the packets are the same in both pc/console
                                    i++;                  // add the  bytes read to packetsize counter.
                                }
                            }
                            return(new MemoryStream(outputFileStream.GetBuffer(), 0, (int)outputFileStream.Length));
                        }
        }
Exemple #41
0
 public Stop(EndianBinaryReader r)
 {
     SheetTile = r.ReadInt32();
     Time      = r.ReadInt32();
 }
Exemple #42
0
        internal void LoadNonIndexed(EndianBinaryReader input, uint vertexFlags, bool is16Bit)
        {
            // Make sure that only known flags are set
            if ((vertexFlags & (uint)~(GcmfVertexFlags.TransformMatrixRef |
                                       GcmfVertexFlags.Coordinates |
                                       GcmfVertexFlags.Normals |
                                       GcmfVertexFlags.Color |
                                       GcmfVertexFlags.PrimaryTextureCoordinates |
                                       GcmfVertexFlags.SecondaryTextureCoordinates |
                                       GcmfVertexFlags.TertiaryTextureCoordinates |
                                       GcmfVertexFlags.NormalBitangentTangent)) != 0)
            {
                throw new InvalidGmaFileException("[GcmfVertexNonIndexed] Unknown vertex flags.");
            }

            if ((vertexFlags & (uint)GcmfVertexFlags.Coordinates) == 0)
            {
                throw new InvalidGmaFileException("[GcmfVertexNonIndexed] No coordinates flag.");
            }

            if ((vertexFlags & (uint)GcmfVertexFlags.TransformMatrixRef) != 0)
            {
                TransformMatrixRef = input.ReadByte();
            }

            Position = new Vector3(
                ReadNumberOfType(input, is16Bit),
                ReadNumberOfType(input, is16Bit),
                ReadNumberOfType(input, is16Bit));

            if ((vertexFlags & (uint)GcmfVertexFlags.Normals) != 0)
            {
                Normal = new Vector3(
                    ReadNumberOfType(input, is16Bit),
                    ReadNumberOfType(input, is16Bit),
                    ReadNumberOfType(input, is16Bit));
            }

            if ((vertexFlags & (uint)GcmfVertexFlags.Color) != 0)
            {
                VertexColor = UnpackColorRGBA(input.ReadUInt32());
            }

            if ((vertexFlags & (uint)GcmfVertexFlags.PrimaryTextureCoordinates) != 0)
            {
                PrimaryTexCoord = new Vector2(
                    ReadNumberOfType(input, is16Bit),
                    ReadNumberOfType(input, is16Bit));
            }

            if ((vertexFlags & (uint)GcmfVertexFlags.SecondaryTextureCoordinates) != 0)
            {
                SecondaryTexCoord = new Vector2(
                    ReadNumberOfType(input, is16Bit),
                    ReadNumberOfType(input, is16Bit));
            }

            if ((vertexFlags & (uint)GcmfVertexFlags.TertiaryTextureCoordinates) != 0)
            {
                TertiaryTexCoord = new Vector2(
                    ReadNumberOfType(input, is16Bit),
                    ReadNumberOfType(input, is16Bit));
            }

            if ((vertexFlags & (uint)GcmfVertexFlags.NormalBitangentTangent) != 0)
            {
                // TODO should this use readNum or is it always a float?
                Normal2 = new Vector3(
                    ReadNumberOfType(input, false),
                    ReadNumberOfType(input, false),
                    ReadNumberOfType(input, false));

                Bitangent = new Vector3(
                    ReadNumberOfType(input, false),
                    ReadNumberOfType(input, false),
                    ReadNumberOfType(input, false));

                Tangent = new Vector3(
                    ReadNumberOfType(input, false),
                    ReadNumberOfType(input, false),
                    ReadNumberOfType(input, false));
            }
        }
        private static IReadOnlyDictionary <string, object> Read(EndianBinaryReader reader, IReadOnlyList <ClassMember> classMembers, int startIndex, int baseLevel, bool fastReturn)
        {
            var dict = new Dictionary <string, object>();

            for (var i = startIndex; i < classMembers.Count; ++i)
            {
                var member = classMembers[i];
                var level  = member.Level;

                if (level <= baseLevel && fastReturn)
                {
                    return(dict);
                }

                var varName     = member.Name;
                var varType     = member.TypeName;
                var shouldAlign = (member.Flags & 0x4000) != 0;

                object value;
                IReadOnlyList <ClassMember> subList;
                switch (varType)
                {
                case "SInt8":
                    value = reader.ReadSByte();
                    break;

                case "UInt8":
                    value = reader.ReadByte();
                    break;

                case "SInt16":
                case "short":
                    value = reader.ReadInt16();
                    break;

                case "UInt16":
                case "unsigned short":
                    value = reader.ReadUInt16();
                    break;

                case "SInt32":
                case "int":
                    value = reader.ReadInt32();
                    break;

                case "UInt32":
                case "unsigned int":
                    value = reader.ReadUInt32();
                    break;

                case "SInt64":
                case "long long":
                    value = reader.ReadInt64();
                    break;

                case "UInt64":
                case "unsigned long long":
                    value = reader.ReadUInt64();
                    break;

                case "float":
                    value = reader.ReadSingle();
                    break;

                case "double":
                    value = reader.ReadDouble();
                    break;

                case "bool":
                    value = reader.ReadBoolean();
                    break;

                case "string":
                    var strLen = reader.ReadInt32();
                    value = reader.ReadAlignedString(strLen);
                    i    += 3;
                    break;

                case "Array":
                    if (i > 0 && (classMembers[i - 1].Flags & 0x4000) != 0)
                    {
                        shouldAlign = true;
                    }

                    var size = reader.ReadInt32();
                    subList = ReadSubObjectList(classMembers, level, i + 2);

                    var list = new List <object>();
                    for (var j = 0; j < size; ++j)
                    {
                        var d2 = Read(reader, subList);
                        list.Add(d2);
                    }

                    // '1' for "size" field.
                    i += 1 + subList.Count;

                    value = list;
                    break;

                default:
                    var customType = new CustomType {
                        TypeName = varType,
                        Name     = varName,
                        Level    = level
                    };

                    subList = ReadSubObjectList(classMembers, level, i + 1);
                    var objects = Read(reader, subList);
                    customType.Variables = objects;
                    value = customType;

                    i += subList.Count;

                    shouldAlign = false;
                    break;
                }

                dict[varName] = value;

                if (shouldAlign)
                {
                    reader.AlignBy(4);
                }
            }

            return(dict);
        }
 public FieldScene(string filePath) : this()
 {
     using (var reader = new EndianBinaryReader(new MemoryStream(File.ReadAllBytes(filePath)), filePath, Endianness.Little))
         Read(reader);
 }
 private static IReadOnlyDictionary <string, object> Read(EndianBinaryReader reader, IReadOnlyList <ClassMember> classMembers, int startIndex)
 {
     return(Read(reader, classMembers, startIndex, 0, false));
 }
Exemple #46
0
 public SSEQReleaseRateEvent(byte EventID, EndianBinaryReader er)
 {
     this.EventID     = EventID;
     this.ReleaseRate = er.ReadByte();
 }
 static public BinaryInputArchive GetArchive(EndianBinaryReader reader)
 {
     return(new BinaryInputArchive(reader));
 }
Exemple #48
0
        private MeshVertexAttributeHolder LoadVTX1FromFile(EndianBinaryReader reader, long chunkStart, int chunkSize)
        {
            MeshVertexAttributeHolder dataHolder = new MeshVertexAttributeHolder();

            //long headerStart = reader.BaseStream.Position;
            int vertexFormatOffset = reader.ReadInt32();

            int[] vertexDataOffsets = new int[13];
            for (int k = 0; k < vertexDataOffsets.Length; k++)
            {
                vertexDataOffsets[k] = reader.ReadInt32();
            }

            reader.BaseStream.Position = chunkStart + vertexFormatOffset;
            List <VertexFormat> vertexFormats = new List <VertexFormat>();
            VertexFormat        curFormat     = null;

            do
            {
                curFormat                = new VertexFormat();
                curFormat.ArrayType      = (VertexArrayType)reader.ReadInt32();
                curFormat.ComponentCount = reader.ReadInt32();
                curFormat.DataType       = (VertexDataType)reader.ReadInt32();
                curFormat.ColorDataType  = (VertexColorType)curFormat.DataType;
                curFormat.DecimalPoint   = reader.ReadByte();
                reader.ReadBytes(3); // Padding
                vertexFormats.Add(curFormat);
            } while (curFormat.ArrayType != VertexArrayType.NullAttr);

            // Don't count the last vertexFormat as it's the NullAttr one.
            dataHolder.Attributes = vertexFormats.GetRange(0, vertexFormats.Count - 1);

            // Now that we know how the vertexes are described, we can get the various data.
            for (int k = 0; k < vertexDataOffsets.Length; k++)
            {
                if (vertexDataOffsets[k] == 0)
                {
                    continue;
                }

                // Get the total length of this block of data.
                int          totalLength  = GetVertexDataLength(vertexDataOffsets, k, (int)(chunkSize));
                VertexFormat vertexFormat = null;
                reader.BaseStream.Position = chunkStart + vertexDataOffsets[k];

                switch (k)
                {
                // Position Data
                case 0:
                    vertexFormat        = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Position);
                    dataHolder.Position = LoadVertexAttribute <Vector3>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Position, vertexFormat.DataType, VertexColorType.None);
                    break;

                // Normal Data
                case 1:
                    vertexFormat      = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Normal);
                    dataHolder.Normal = LoadVertexAttribute <Vector3>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Normal, vertexFormat.DataType, VertexColorType.None);
                    break;

                // Normal Binormal Tangent Data (presumed)
                case 2:
                    break;

                // Color 0 Data
                case 3:
                    vertexFormat      = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Color0);
                    dataHolder.Color0 = LoadVertexAttribute <Color>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Color0, VertexDataType.None, vertexFormat.ColorDataType);
                    break;

                // Color 1 Data (presumed)
                case 4:
                    vertexFormat      = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Color1);
                    dataHolder.Color1 = LoadVertexAttribute <Color>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Color1, VertexDataType.None, vertexFormat.ColorDataType);
                    break;

                // Tex 0 Data
                case 5:
                    vertexFormat    = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Tex0);
                    dataHolder.Tex0 = LoadVertexAttribute <Vector2>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Tex0, vertexFormat.DataType, VertexColorType.None);
                    break;

                // Tex 1 Data
                case 6:
                    vertexFormat    = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Tex1);
                    dataHolder.Tex1 = LoadVertexAttribute <Vector2>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Tex1, vertexFormat.DataType, VertexColorType.None);
                    break;

                // Tex 2 Data
                case 7:
                    vertexFormat    = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Tex2);
                    dataHolder.Tex2 = LoadVertexAttribute <Vector2>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Tex2, vertexFormat.DataType, VertexColorType.None);
                    break;

                // Tex 3 Data
                case 8:
                    vertexFormat    = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Tex3);
                    dataHolder.Tex3 = LoadVertexAttribute <Vector2>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Tex3, vertexFormat.DataType, VertexColorType.None);
                    break;

                // Tex 4 Data
                case 9:
                    vertexFormat    = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Tex4);
                    dataHolder.Tex4 = LoadVertexAttribute <Vector2>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Tex4, vertexFormat.DataType, VertexColorType.None);
                    break;

                // Tex 5 Data
                case 10:
                    vertexFormat    = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Tex5);
                    dataHolder.Tex5 = LoadVertexAttribute <Vector2>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Tex5, vertexFormat.DataType, VertexColorType.None);
                    break;

                // Tex 6 Data
                case 11:
                    vertexFormat    = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Tex6);
                    dataHolder.Tex6 = LoadVertexAttribute <Vector2>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Tex6, vertexFormat.DataType, VertexColorType.None);
                    break;

                // Tex 7 Data
                case 12:
                    vertexFormat    = vertexFormats.Find(x => x.ArrayType == VertexArrayType.Tex7);
                    dataHolder.Tex7 = LoadVertexAttribute <Vector2>(reader, totalLength, vertexFormat.DecimalPoint, VertexArrayType.Tex7, vertexFormat.DataType, VertexColorType.None);
                    break;
                }
            }

            return(dataHolder);
        }
 /** Creates a new instance of BinaryInputArchive */
 public BinaryInputArchive(EndianBinaryReader reader)
 {
     this.reader = reader;
 }
Exemple #50
0
        public void ReadFields(EndianBinaryReader reader)
        {
            BinaryInputArchive archive = new BinaryInputArchive(reader);

            this.Deserialize(archive, string.Empty);
        }
 public FieldScene(Stream stream, bool leaveOpen = false) : this()
 {
     using (var reader = new EndianBinaryReader(stream, leaveOpen, Endianness.Little))
         Read(reader);
 }
        public IModel LoadModel(ModlModelFileBundle modelFileBundle)
        {
            var flipSign = ModlFlags.FLIP_HORIZONTALLY ? -1 : 1;

            var modlFile = modelFileBundle.ModlFile;

            using var er = new EndianBinaryReader(modlFile.Impl.OpenRead(),
                                                  Endianness.LittleEndian);
            var bwModel = modelFileBundle.ModlType switch {
                ModlType.BW1 => (IModl)er.ReadNew <Bw1Modl>(),
                ModlType.BW2 => er.ReadNew <Bw2Modl>(),
            };

            var model   = new ModelImpl();
            var finMesh = model.Skin.AddMesh();

            var finBones             = new IBone[bwModel.Nodes.Count];
            var finBonesByModlNode   = new Dictionary <IBwNode, IBone>();
            var finBonesByIdentifier = new Dictionary <string, IBone>();

            {
                var nodeQueue =
                    new FinTuple2Queue <IBone, ushort>((model.Skeleton.Root, 0));

                while (nodeQueue.TryDequeue(out var parentFinBone,
                                            out var modlNodeId))
                {
                    var modlNode = bwModel.Nodes[modlNodeId];

                    var transform    = modlNode.Transform;
                    var bonePosition = transform.Position;

                    var modlRotation = transform.Rotation;
                    var rotation     = new Quaternion(
                        flipSign * modlRotation.X,
                        modlRotation.Y,
                        modlRotation.Z,
                        flipSign * modlRotation.W);
                    var eulerRadians = QuaternionUtil.ToEulerRadians(rotation);

                    var finBone =
                        parentFinBone
                        .AddChild(flipSign * bonePosition.X, bonePosition.Y,
                                  bonePosition.Z)
                        .SetLocalRotationRadians(
                            eulerRadians.X, eulerRadians.Y, eulerRadians.Z);

                    var identifier = modlNode.GetIdentifier();
                    finBone.Name                     = identifier;
                    finBones[modlNodeId]             = finBone;
                    finBonesByModlNode[modlNode]     = finBone;
                    finBonesByIdentifier[identifier] = finBone;

                    if (bwModel.CnctParentToChildren.TryGetList(
                            modlNodeId, out var modlChildIds))
                    {
                        nodeQueue.Enqueue(
                            modlChildIds !.Select(modlChildId => (finBone, modlChildId)));
                    }
                }

                foreach (var animFile in modelFileBundle.AnimFiles ??
                         Array.Empty <IFileHierarchyFile>())
                {
                    var anim = modelFileBundle.ModlType switch {
                        ModlType.BW1 => (IAnim)animFile.Impl.ReadNew <Bw1Anim>(
                            Endianness.BigEndian),
                        ModlType.BW2 => animFile.Impl.ReadNew <Bw2Anim>(
                            Endianness.BigEndian)
                    };

                    var maxFrameCount = -1;
                    foreach (var animBone in anim.AnimBones)
                    {
                        maxFrameCount = (int)Math.Max(maxFrameCount,
                                                      Math.Max(
                                                          animBone
                                                          .PositionKeyframeCount,
                                                          animBone
                                                          .RotationKeyframeCount));
                    }

                    var finAnimation = model.AnimationManager.AddAnimation();
                    finAnimation.Name       = animFile.NameWithoutExtension;
                    finAnimation.FrameRate  = 30;
                    finAnimation.FrameCount = maxFrameCount;

                    for (var b = 0; b < anim.AnimBones.Count; ++b)
                    {
                        var animBone       = anim.AnimBones[b];
                        var animBoneFrames = anim.AnimBoneFrames[b];

                        var animNodeIdentifier = animBone.GetIdentifier();
                        if (!finBonesByIdentifier.TryGetValue(
                                animNodeIdentifier, out var finBone))
                        {
                            // TODO: Gross hack for the vet models, what's the real fix???
                            if (animNodeIdentifier == Bw1Node.GetIdentifier(33))
                            {
                                finBone = finBonesByIdentifier[Bw1Node.GetIdentifier(34)];
                            }
                            else if (finBonesByIdentifier.TryGetValue(
                                         animNodeIdentifier + 'X', out var xBone))
                            {
                                finBone = xBone;
                            }
                            else if (finBonesByIdentifier.TryGetValue(
                                         "BONE_" + animNodeIdentifier,
                                         out var prefixBone))
                            {
                                finBone = prefixBone;
                            }
                            else if (animNodeIdentifier == "WF_GRUNT_BACKPAC")
                            {
                                // TODO: Is this right?????
                                finBone = finBonesByIdentifier["BONE_BCK_MISC"];
                            }
                            else
                            {
                                ;
                            }
                        }

                        var finBoneTracks = finAnimation.AddBoneTracks(finBone !);

                        var fbtPositions = finBoneTracks.Positions;
                        for (var f = 0; f < animBone.PositionKeyframeCount; ++f)
                        {
                            var(fPX, fPY, fPZ) = animBoneFrames.PositionFrames[f];

                            fbtPositions.Set(f, 0, flipSign * fPX);
                            fbtPositions.Set(f, 1, fPY);
                            fbtPositions.Set(f, 2, fPZ);
                        }

                        var fbtRotations = finBoneTracks.Rotations;
                        for (var f = 0; f < animBone.RotationKeyframeCount; ++f)
                        {
                            var(fRX, fRY, fRZ, frW) = animBoneFrames.RotationFrames[f];

                            var animationQuaternion =
                                new Quaternion(flipSign * fRX, fRY, fRZ, flipSign * frW);
                            var eulerRadians =
                                QuaternionUtil.ToEulerRadians(animationQuaternion);

                            fbtRotations.Set(f, 0, eulerRadians.X);
                            fbtRotations.Set(f, 1, eulerRadians.Y);
                            fbtRotations.Set(f, 2, eulerRadians.Z);
                        }
                    }
                }

                var textureDictionary = new LazyDictionary <string, ITexture>(
                    textureName => {
                    var textureFile =
                        modlFile.Parent.Files.Single(
                            file => file.Name.ToLower() == $"{textureName}.png");

                    var image = FinImage.FromFile(textureFile.Impl);

                    var finTexture =
                        model.MaterialManager.CreateTexture(image);
                    finTexture.Name = textureName;

                    // TODO: Need to handle wrapping
                    finTexture.WrapModeU = WrapMode.REPEAT;
                    finTexture.WrapModeV = WrapMode.REPEAT;

                    return(finTexture);
                });

                foreach (var modlNode in bwModel.Nodes)
                {
                    var finMaterials =
                        modlNode.Materials.Select(modlMaterial => {
                        var textureName = modlMaterial.Texture1.ToLower();
                        if (textureName == "")
                        {
                            return(null);
                        }

                        var finTexture = textureDictionary[textureName];

                        var finMaterial =
                            model.MaterialManager
                            .AddTextureMaterial(finTexture);

                        return(finMaterial);
                    })
                        .ToArray();

                    foreach (var modlMesh in modlNode.Meshes)
                    {
                        var finMaterial = finMaterials[modlMesh.MaterialIndex];

                        foreach (var triangleStrip in modlMesh.TriangleStrips)
                        {
                            var vertices =
                                new IVertex[triangleStrip.VertexAttributeIndicesList.Count];
                            for (var i = 0; i < vertices.Length; i++)
                            {
                                var vertexAttributeIndices =
                                    triangleStrip.VertexAttributeIndicesList[i];

                                var position =
                                    modlNode.Positions[vertexAttributeIndices.PositionIndex];
                                var vertex = vertices[i] = model.Skin.AddVertex(
                                    flipSign * position.X * modlNode.Scale,
                                    position.Y * modlNode.Scale,
                                    position.Z * modlNode.Scale);

                                if (vertexAttributeIndices.NormalIndex != null)
                                {
                                    var normal =
                                        modlNode.Normals[
                                            vertexAttributeIndices.NormalIndex.Value];
                                    vertex.SetLocalNormal(flipSign * normal.X, normal.Y,
                                                          normal.Z);
                                }

                                if (vertexAttributeIndices.NodeIndex != null)
                                {
                                    var finBone =
                                        finBones[vertexAttributeIndices.NodeIndex.Value];
                                    vertex.SetBoneWeights(
                                        model.Skin
                                        .GetOrCreateBoneWeights(
                                            PreprojectMode.NONE,
                                            new BoneWeight(finBone, null, 1)));
                                }
                                else
                                {
                                    var finBone = finBonesByModlNode[modlNode];
                                    vertex.SetBoneWeights(
                                        model.Skin.GetOrCreateBoneWeights(
                                            PreprojectMode.BONE, finBone));
                                }

                                var texCoordIndex0 = vertexAttributeIndices.TexCoordIndices[0];
                                var texCoordIndex1 = vertexAttributeIndices.TexCoordIndices[1];
                                if (texCoordIndex1 != null)
                                {
                                    int texCoordIndex;
                                    if (texCoordIndex0 != null)
                                    {
                                        texCoordIndex =
                                            (texCoordIndex0.Value << 8) | texCoordIndex1.Value;
                                    }
                                    else
                                    {
                                        texCoordIndex = texCoordIndex1.Value;
                                    }

                                    var uv = modlNode.UvMaps[0][texCoordIndex];
                                    vertex.SetUv(uv.U, uv.V);
                                }
                            }

                            var triangleStripPrimitive = finMesh.AddTriangleStrip(vertices);
                            if (finMaterial != null)
                            {
                                triangleStripPrimitive.SetMaterial(finMaterial);
                            }
                        }
                    }
                }
            }

            return(model);
        }
    }
Exemple #53
0
 public PSFSv1File(EndianBinaryReader reader)
 {
     Filename = Encoding.ASCII.GetString(reader.ReadBytes(0x30)).TrimEnd('\0');
     FileSize = reader.ReadInt64();
     Offset   = reader.ReadInt64();
 }
            //DCMTK djcodecd.cxx
            public static int ScanJpegForBitDepth(DicomPixelData pixelData)
            {
                DicomItem   item = pixelData.Dataset.Get <DicomItem>(DicomTag.PixelData);
                IByteBuffer buffer;

                if (item is DicomFragmentSequence)
                {
                    buffer = (item as DicomFragmentSequence).Fragments[0];
                }
                else
                {
                    buffer = (item as DicomElement).Buffer;
                }
                MemoryStream ms = new MemoryStream(buffer.Data);
                BinaryReader br = EndianBinaryReader.Create(ms, Endian.Big);

                long length = ms.Length;

                while (ms.Position < length)
                {
                    ushort marker = br.ReadUInt16();
                    switch (marker)
                    {
                    case 0xffc0:             // SOF_0: JPEG baseline
                    case 0xffc1:             // SOF_1: JPEG extended sequential DCT
                    case 0xffc2:             // SOF_2: JPEG progressive DCT
                    case 0xffc3:             // SOF_3: JPEG lossless sequential
                    case 0xffc5:             // SOF_5: differential (hierarchical) extended sequential, Huffman
                    case 0xffc6:             // SOF_6: differential (hierarchical) progressive, Huffman
                    case 0xffc7:             // SOF_7: differential (hierarchical) lossless, Huffman
                        ms.Seek(2, SeekOrigin.Current);
                        return((int)br.ReadByte());

                    case 0xffc8:             // Reserved for JPEG extentions
                        ms.Seek(br.ReadUInt16() - 2, SeekOrigin.Current);
                        break;

                    case 0xffc9:             // SOF_9: extended sequential, arithmetic
                    case 0xffca:             // SOF_10: progressive, arithmetic
                    case 0xffcb:             // SOF_11: lossless, arithmetic
                    case 0xffcd:             // SOF_13: differential (hierarchical) extended sequential, arithmetic
                    case 0xffce:             // SOF_14: differential (hierarchical) progressive, arithmetic
                    case 0xffcf:             // SOF_15: differential (hierarchical) lossless, arithmetic
                        ms.Seek(2, SeekOrigin.Current);
                        return((int)br.ReadByte());

                    case 0xffc4:             // DHT
                    case 0xffcc:             // DAC
                        ms.Seek(br.ReadUInt16() - 2, SeekOrigin.Current);
                        break;

                    case 0xffd0:             // RST m
                    case 0xffd1:
                    case 0xffd2:
                    case 0xffd3:
                    case 0xffd4:
                    case 0xffd5:
                    case 0xffd6:
                    case 0xffd7:
                    case 0xffd8:             // SOI
                    case 0xffd9:             // EOI
                        break;

                    case 0xffda:             // SOS
                    case 0xffdb:             // DQT
                    case 0xffdc:             // DNL
                    case 0xffdd:             // DRI
                    case 0xffde:             // DHP
                    case 0xffdf:             // EXP
                    case 0xffe0:             // APPn
                    case 0xffe1:
                    case 0xffe2:
                    case 0xffe3:
                    case 0xffe4:
                    case 0xffe5:
                    case 0xffe6:
                    case 0xffe7:
                    case 0xffe8:
                    case 0xffe9:
                    case 0xffea:
                    case 0xffeb:
                    case 0xffec:
                    case 0xffed:
                    case 0xffee:
                    case 0xffef:
                    case 0xfff0:             // JPGn
                    case 0xfff1:
                    case 0xfff2:
                    case 0xfff3:
                    case 0xfff4:
                    case 0xfff5:
                    case 0xfff6:
                    case 0xfff7:
                    case 0xfff8:
                    case 0xfff9:
                    case 0xfffa:
                    case 0xfffb:
                    case 0xfffc:
                    case 0xfffd:
                    case 0xfffe:             // COM
                        ms.Seek(br.ReadUInt16() - 2, SeekOrigin.Current);
                        break;

                    case 0xff01:             // TEM
                        break;

                    default:
                        int b1 = br.ReadByte();
                        int b2 = br.ReadByte();
                        if (b1 == 0xff && b2 > 2 && b2 <= 0xbf)                 // RES reserved markers
                        {
                            break;
                        }
                        else
                        {
                            throw new DicomCodecException("Unable to determine bit depth: JPEG syntax error!");
                        }
                    }
                }
                throw new DicomCodecException("Unable to determine bit depth: no JPEG SOF marker found!");
            }
Exemple #55
0
 protected void SkipParse(EndianBinaryReader r)
 {
     r.BaseStream.Seek(0, SeekOrigin.End);
 }
 public void ReadFields(EndianBinaryReader reader)
 {
     this.Deserialize((IInputArchive) new BinaryInputArchive(reader), string.Empty);
 }
Exemple #57
0
        private void LoadTagDataFromFile(EndianBinaryReader reader)
        {
            long tagStart = reader.BaseStream.Position;

            string tagName = reader.ReadString(4);
            int    tagSize = reader.ReadInt32();

            LoopMode = (LoopType)reader.ReadByte();
            byte angleMultiplier = reader.ReadByte(); // Probably just padding in BRK

            AnimLengthInFrames = reader.ReadInt16();
            short colorAnimEntryCount = reader.ReadInt16();
            short konstAnimEntryCount = reader.ReadInt16();

            short numColorREntries = reader.ReadInt16();
            short numColorGEntries = reader.ReadInt16();
            short numColorBEntries = reader.ReadInt16();
            short numColorAEntries = reader.ReadInt16();

            short numKonstREntries = reader.ReadInt16();
            short numKonstGEntries = reader.ReadInt16();
            short numKonstBEntries = reader.ReadInt16();
            short numKonstAEntries = reader.ReadInt16();

            int colorAnimDataOffset = reader.ReadInt32();
            int konstAnimDataOffset = reader.ReadInt32();

            int colorRemapTableOffset = reader.ReadInt32();
            int konstRemapTableOffset = reader.ReadInt32();

            int colorStringTableOffset = reader.ReadInt32();
            int konstStringTableOffset = reader.ReadInt32();

            int colorRTableOffset = reader.ReadInt32();
            int colorGTableOffset = reader.ReadInt32();
            int colorBTableOffset = reader.ReadInt32();
            int colorATableOffset = reader.ReadInt32();

            int konstRTableOffset = reader.ReadInt32();
            int konstGTableOffset = reader.ReadInt32();
            int konstBTableOffset = reader.ReadInt32();
            int konstATableOffset = reader.ReadInt32();

            reader.Skip(8); // padding

            float[] colorRData = new float[numColorREntries];
            reader.BaseStream.Position = tagStart + colorRTableOffset;
            for (int i = 0; i < numColorREntries; i++)
            {
                colorRData[i] = reader.ReadInt16();
            }

            float[] colorGData = new float[numColorGEntries];
            reader.BaseStream.Position = tagStart + colorGTableOffset;
            for (int i = 0; i < numColorGEntries; i++)
            {
                colorGData[i] = reader.ReadInt16();
            }

            float[] colorBData = new float[numColorBEntries];
            reader.BaseStream.Position = tagStart + colorBTableOffset;
            for (int i = 0; i < numColorBEntries; i++)
            {
                colorBData[i] = reader.ReadInt16();
            }

            float[] colorAData = new float[numColorAEntries];
            reader.BaseStream.Position = tagStart + colorATableOffset;
            for (int i = 0; i < numColorAEntries; i++)
            {
                colorAData[i] = reader.ReadInt16();
            }

            float[] konstRData = new float[numKonstREntries];
            reader.BaseStream.Position = tagStart + konstRTableOffset;
            for (int i = 0; i < numKonstREntries; i++)
            {
                konstRData[i] = reader.ReadInt16();
            }

            float[] konstGData = new float[numKonstGEntries];
            reader.BaseStream.Position = tagStart + konstGTableOffset;
            for (int i = 0; i < numKonstGEntries; i++)
            {
                konstGData[i] = reader.ReadInt16();
            }

            float[] konstBData = new float[numKonstBEntries];
            reader.BaseStream.Position = tagStart + konstBTableOffset;
            for (int i = 0; i < numKonstBEntries; i++)
            {
                konstBData[i] = reader.ReadInt16();
            }

            float[] konstAData = new float[numKonstAEntries];
            reader.BaseStream.Position = tagStart + konstATableOffset;
            for (int i = 0; i < numKonstAEntries; i++)
            {
                konstAData[i] = reader.ReadInt16();
            }

            m_colorRemapTable          = new int[colorAnimEntryCount];
            reader.BaseStream.Position = tagStart + colorRemapTableOffset;
            for (int i = 0; i < colorAnimEntryCount; i++)
            {
                m_colorRemapTable[i] = reader.ReadInt16();
            }

            m_konstRemapTable          = new int[konstAnimEntryCount];
            reader.BaseStream.Position = tagStart + konstRemapTableOffset;
            for (int i = 0; i < konstAnimEntryCount; i++)
            {
                m_konstRemapTable[i] = reader.ReadInt16();
            }

            reader.BaseStream.Position = tagStart + colorStringTableOffset;
            m_colorStringTable         = StringTable.FromStream(reader);

            reader.BaseStream.Position = tagStart + konstStringTableOffset;
            m_konstStringTable         = StringTable.FromStream(reader);

            m_colorAnimationData = new List <RegisterAnim>();

            reader.BaseStream.Position = tagStart + colorAnimDataOffset;
            for (int i = 0; i < colorAnimEntryCount; i++)
            {
                AnimIndex colorRIndex = ReadAnimIndex(reader);
                AnimIndex colorGIndex = ReadAnimIndex(reader);
                AnimIndex colorBIndex = ReadAnimIndex(reader);
                AnimIndex colorAIndex = ReadAnimIndex(reader);
                int       colorID     = reader.ReadByte();
                reader.Skip(3);

                RegisterAnim regAnim = new RegisterAnim();
                regAnim.ColorID = colorID;

                regAnim.RedChannel   = ReadComp(colorRData, colorRIndex);
                regAnim.GreenChannel = ReadComp(colorGData, colorGIndex);
                regAnim.BlueChannel  = ReadComp(colorBData, colorBIndex);
                regAnim.AlphaChannel = ReadComp(colorAData, colorAIndex);

                foreach (Key key in regAnim.RedChannel)
                {
                    key.Value      = key.Value / 255.0f;
                    key.TangentIn  = (float)key.TangentIn / 65535.0f;
                    key.TangentOut = (float)key.TangentOut / 65535.0f;
                }

                foreach (Key key in regAnim.GreenChannel)
                {
                    key.Value      = key.Value / 255.0f;
                    key.TangentIn  = (float)key.TangentIn / 65535.0f;
                    key.TangentOut = (float)key.TangentOut / 65535.0f;
                }

                foreach (Key key in regAnim.BlueChannel)
                {
                    key.Value      = key.Value / 255.0f;
                    key.TangentIn  = (float)key.TangentIn / 65535.0f;
                    key.TangentOut = (float)key.TangentOut / 65535.0f;
                }

                foreach (Key key in regAnim.AlphaChannel)
                {
                    key.Value      = key.Value / 255.0f;
                    key.TangentIn  = (float)key.TangentIn / 65535.0f;
                    key.TangentOut = (float)key.TangentOut / 65535.0f;
                }

                m_colorAnimationData.Add(regAnim);
            }

            m_konstAnimationData = new List <RegisterAnim>();

            reader.BaseStream.Position = tagStart + konstAnimDataOffset;
            for (int i = 0; i < konstAnimEntryCount; i++)
            {
                AnimIndex konstRIndex = ReadAnimIndex(reader);
                AnimIndex konstGIndex = ReadAnimIndex(reader);
                AnimIndex konstBIndex = ReadAnimIndex(reader);
                AnimIndex konstAIndex = ReadAnimIndex(reader);
                int       colorID     = reader.ReadByte();
                reader.Skip(3);

                RegisterAnim regAnim = new RegisterAnim();
                regAnim.ColorID = colorID;

                regAnim.RedChannel   = ReadComp(konstRData, konstRIndex);
                regAnim.GreenChannel = ReadComp(konstGData, konstGIndex);
                regAnim.BlueChannel  = ReadComp(konstBData, konstBIndex);
                regAnim.AlphaChannel = ReadComp(konstAData, konstAIndex);

                foreach (Key key in regAnim.RedChannel)
                {
                    key.Value      = key.Value / 65535.0f;
                    key.TangentIn  = (float)key.TangentIn / 65535.0f;
                    key.TangentOut = (float)key.TangentOut / 65535.0f;
                }

                foreach (Key key in regAnim.GreenChannel)
                {
                    key.Value      = key.Value / 255.0f;
                    key.TangentIn  = (float)key.TangentIn / 65535.0f;
                    key.TangentOut = (float)key.TangentOut / 65535.0f;
                }

                foreach (Key key in regAnim.BlueChannel)
                {
                    key.Value      = key.Value / 255.0f;
                    key.TangentIn  = (float)key.TangentIn / 65535.0f;
                    key.TangentOut = (float)key.TangentOut / 65535.0f;
                }

                foreach (Key key in regAnim.AlphaChannel)
                {
                    key.Value      = key.Value / 255.0f;
                    key.TangentIn  = (float)key.TangentIn / 65535.0f;
                    key.TangentOut = (float)key.TangentOut / 65535.0f;
                }

                m_konstAnimationData.Add(regAnim);
            }
        }
Exemple #58
0
        internal void Read(EndianBinaryReader reader, bool isModern)
        {
            if (Type == KeySetType.Static)
            {
                Keys.Add(new Key {
                    Value = reader.ReadSingle()
                });
            }

            else if (Type != KeySetType.None)
            {
                IsInterpolated = Type == KeySetType.Interpolated;

                if (isModern)
                {
                    ReadModern();
                }
                else
                {
                    ReadClassic();
                }

                void ReadClassic()
                {
                    ushort keyCount = reader.ReadUInt16();

                    Keys.Capacity = keyCount;
                    for (int i = 0; i < keyCount; i++)
                    {
                        Keys.Add(new Key {
                            Frame = reader.ReadUInt16()
                        });
                    }

                    reader.Align(4);

                    foreach (var key in Keys)
                    {
                        key.Value = reader.ReadSingle();
                        if (IsInterpolated)
                        {
                            key.Interpolation = reader.ReadSingle();
                        }
                    }
                }

                void ReadModern()
                {
                    ushort keyCount = reader.ReadUInt16();
                    ushort type     = reader.ReadUInt16();

                    Keys.Capacity = keyCount;
                    for (int i = 0; i < keyCount; i++)
                    {
                        Keys.Add(new Key());
                    }

                    if (IsInterpolated)
                    {
                        foreach (var key in Keys)
                        {
                            key.Interpolation = reader.ReadSingle();
                        }
                    }

                    reader.Align(4);
                    foreach (var key in Keys)
                    {
                        key.Value = type == 1
                            ? reader.ReadHalf()
                            : reader.ReadSingle();
                    }

                    reader.Align(4);
                    foreach (var key in Keys)
                    {
                        key.Frame = reader.ReadUInt16();
                    }

                    reader.Align(4);
                }
            }
        }
Exemple #59
0
        private static void Main(string[] args)
        {
            ConfigureLogging();

            string flatFilename    = null;
            string structuredOut   = null;
            string disassemblyFile = null;

            var options = new OptionSet
            {
                { "f|flat=", "Dump flat output to file", _ => flatFilename = _ },
                { "o|out=", "Dump structured output to file", _ => structuredOut = _ },
                { "d|disassembly=", "Disassemble associated .exe when available to file", _ => disassemblyFile = _ }
            };

            IList <string> extraArgs;

            try
            {
                extraArgs = options.Parse(args);
            }
            catch (OptionException e)
            {
                logger.Error(e.Message);
                options.WriteOptionDescriptions(Console.Out);
                Console.WriteLine("Note that '-' is a valid filename, resulting in outputting to the console");
                return;
            }

            if (extraArgs.Count != 1)
            {
                logger.Error("Please provide a .SYM file for processing");
                options.WriteOptionDescriptions(Console.Out);
                Console.WriteLine("Note that '-' is a valid filename, resulting in outputting to the console");
                return;
            }

            if (flatFilename != null)
            {
                logger.Info($"Dumping {extraArgs[0]} to {flatFilename} in flat format");
                using (var fs = new FileStream(extraArgs[0], FileMode.Open))
                {
                    // ReSharper disable once ObjectCreationAsStatement
                    new SymFile(new BinaryReader(fs), flatFilename);
                }
            }

            if (structuredOut == null && disassemblyFile == null)
            {
                return;
            }

            SymFile symFile;

            using (var fs = new FileStream(extraArgs[0], FileMode.Open))
            {
                symFile = new SymFile(new BinaryReader(fs), null);
                if (structuredOut != null)
                {
                    logger.Info($"Dumping {extraArgs[0]} to {structuredOut} in structured format");
                    using (var outFs = structuredOut == "-" ? Console.Out : File.CreateText(structuredOut))
                    {
                        symFile.Dump(outFs);
                    }
                }
            }

            if (disassemblyFile == null)
            {
                return;
            }

            var exeFilename = Path.ChangeExtension(extraArgs[0], "EXE");

            if (!File.Exists(exeFilename))
            {
                logger.Warn($"EXE file {exeFilename} does not exist, skipping disassembly");
                return;
            }

            logger.Info($"Dumping {exeFilename} disassembly to {disassemblyFile}");
            using (var fs = new EndianBinaryReader(new FileStream(exeFilename, FileMode.Open)))
            {
                var exeFile = new ExeFile(fs, symFile);
                exeFile.Disassemble();
                using (var outFs = disassemblyFile == "-" ? Console.Out : File.CreateText(disassemblyFile))
                    using (var writer = new IndentedTextWriter(outFs))
                    {
                        exeFile.Dump(writer);
                    }
            }
        }
Exemple #60
0
 public override void Read(EndianBinaryReader er)
 {
     offset = (uint)(er.ReadUInt16() << 3);
     flag   = er.ReadUInt16();
 }