Esempio n. 1
0
        internal static List read(StreamAccessor accessor)
        {
            List ret = new List();

            if ("LIST" != accessor.ReadString(EncodingType.CC4))
            {
                throw new System.ApplicationException("読み込もうとしているデータは LIST チャンクではないです。");
            }

            uint size = accessor.ReadUInt32(EncodingType.U4);

            ret.type = accessor.ReadString(EncodingType.CC4);

            ret.chunks = new Gen::List <Chunk>();
            StreamAccessor acChunks = new StreamAccessor(accessor.ReadSubStream(size - 4));

            try{
                while (acChunks.RestLength > 0)
                {
                    ret.chunks.Add(acChunks.Read <Chunk>());
                }
            }finally{
                acChunks.Stream.Close();
            }
            return(ret);
        }
Esempio n. 2
0
        private static new RiffFile read(StreamAccessor accessor)
        {
            if ("RIFF" != accessor.ReadString(EncodingType.CC4))
            {
                throw new System.ApplicationException("指定したデータは RIFF データではありません。");
            }

            RiffFile ret  = new RiffFile();
            uint     size = accessor.ReadUInt32(EncodingType.U4);

            ret.type = accessor.ReadString(EncodingType.CC4);

            ret.chunks = new Gen::List <Chunk>();
            StreamAccessor acChunks = new StreamAccessor(accessor.ReadSubStream(size - 4));

            try{
                while (acChunks.RestLength > 0)
                {
                    ret.chunks.Add(acChunks.Read <Chunk>());
                }
            }finally{
                acChunks.Stream.Close();
            }
            return(ret);
        }
Esempio n. 3
0
        private void ReadExtHeader(StreamAccessor accessor, out uint crc32, out int padding)
        {
            uint num = accessor.ReadUInt32(EncodingType.U4BE);

            if ((num != 6) && (num != 10))
            {
                throw new FileFormatException("Extended Header Size は 6B 亦は 10B で在るべきです。");
            }
            ushort num2 = accessor.ReadUInt16(EncodingType.I2BE);

            this.hascrc = (num2 & 0x8000) != 0;
            if (num != (this.hascrc ? ((long)10) : ((long)6)))
            {
                throw new FileFormatException(string.Format("Extended Header Size の大きさが不正です。\r\nCRC Checkを{0}場合には{1}B であるべきです。", this.hascrc ? "行う" : "行わない", this.hascrc ? "10" : "6"));
            }
            padding = accessor.ReadInt32(EncodingType.U4BE);
            crc32   = this.hascrc ? accessor.ReadUInt32(EncodingType.U4BE) : 0;
        }
Esempio n. 4
0
        private static ImageDirectory read(StreamAccessor accessor)
        {
            ImageDirectory dir = new ImageDirectory(accessor.ReadString(EncodingType.NoSpecified));

            uint count = accessor.ReadUInt32(EncodingType.U4);

            for (int i = 0; i < count; i++)
            {
                dir.images.Add(accessor.ReadInt32(EncodingType.I4));
            }

            dir.dirs = accessor.Read <DirectoryCollection>();
            return(dir);
        }
Esempio n. 5
0
        public static unsafe void WritePEChecksum(string filePath, uint checkSum)
        {
            using (var accessor = new StreamAccessor(new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite)))
            {
                // DOS
                DOSHeader dosHeader;
                fixed(byte *pBuff = accessor.ReadBytes(PEConstants.DosHeaderSize))
                {
                    dosHeader = *(DOSHeader *)pBuff;
                }

                if (dosHeader.Signature != PEConstants.DosSignature)
                {
                    throw new BadImageFormatException(SR.DOSHeaderSignatureNotValid);
                }

                accessor.Position = dosHeader.Lfanew;

                // NT Signature
                if (accessor.ReadUInt32() != PEConstants.NTSignature)
                {
                    throw new BadImageFormatException(SR.PESignatureNotValid);
                }

                // COFF
                accessor.ReadBytes(PEConstants.COFFHeaderSize);

                // PE
                ushort peMagic = accessor.ReadUInt16();
                if (peMagic == PEConstants.PEMagic32)
                {
                    accessor.ReadBytes(62);
                }
                else if (peMagic == 0x20b)
                {
                    accessor.ReadBytes(62);
                }
                else
                {
                    throw new BadImageFormatException(SR.PEHeaderSignatureNotValid);
                }

                accessor.Write((uint)checkSum);
            }
        }
Esempio n. 6
0
        private static Chunk read(StreamAccessor accessor)
        {
            string name = accessor.ReadString(EncodingType.CC4);

            if (name == "LIST")
            {
                accessor.Stream.Seek(-4, System.IO.SeekOrigin.Current);
                return(List.read(accessor));
            }

            Chunk ret = new Chunk(name);

            uint size = accessor.ReadUInt32(EncodingType.U4);

            ret._stream = accessor.ReadSubStream(size);

            return(ret);
        }
Esempio n. 7
0
        private static DirectoryCollection read(StreamAccessor accessor)
        {
            DirectoryCollection ret = new DirectoryCollection();

            uint           size   = accessor.ReadUInt32(EncodingType.U4);
            StreamAccessor acdirs = new StreamAccessor(accessor.ReadSubStream(size));

            try{
                while (acdirs.RestLength > 0)
                {
                    ImageDirectory item = acdirs.Read <ImageDirectory>();
                    ret.Add(item);
                    ret.paths[item.name] = item;
                }
            }catch (afh.File.StreamOverRunException) {
            }catch (System.Exception e) {
                afh.File.__dll__.log.WriteError(e, ".thm 内の画像ディレクトリを読込中にエラーが発生しました。");
            }

            return(ret);
        }