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); }
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); }
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; }
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); }
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); } }
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); }
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); }