public Model(Stream stream, byte[] header, string path) { base._data = Data = new AviFormat(this, stream, path); ParseRiff(header); var buf = new byte[0xC0]; stream.Position = 0; int got = stream.Read(buf, 0, 0xC0); if (got != 0xC0) { IssueModel.Add("File is short", Severity.Fatal); return; } Data.StreamCount = ConvertTo.FromLit32ToInt32(buf, 0x38); Data.Width = ConvertTo.FromLit32ToInt32(buf, 0x40); Data.Height = ConvertTo.FromLit32ToInt32(buf, 0x44); Data.Codec = Encoding.ASCII.GetString(buf, 0xBC, 4).Trim(); CalcMark(); GetDiagsForMarkable(); }
public Model(Stream stream, string path) { base._data = Data = new IcoFormat(this, stream, path); // Arbitrary sanity limit. if (Data.FileSize > 50000000) { IssueModel.Add("File insanely large", Severity.Fatal); return; } var buf = new byte[Data.FileSize]; stream.Position = 0; var got = stream.Read(buf, 0, (int)Data.FileSize); if (got != Data.FileSize) { IssueModel.Add("Read error", Severity.Fatal); return; } int headerCount = ConvertTo.FromLit16ToInt32(buf, 4); if (headerCount <= 0) { IssueModel.Add("Corrupt header count", Severity.Fatal); return; } int pos = 6; int stop = pos + 16 * headerCount; int actualStart = stop; for (pos = 6; pos < stop; pos += 16) { int width, height, bpp, paletteSize; int storedSize = ConvertTo.FromLit32ToInt32(buf, pos + 8); int storedStart = ConvertTo.FromLit32ToInt32(buf, pos + 12); if (storedStart != actualStart || storedSize <= 0) { IssueModel.Add($"Corrupt header near byte {Data.ValidSize}", Severity.Fatal); return; } bool isPNG = buf[actualStart] == 0x89 && buf[actualStart + 1] == 'P' && buf[actualStart + 2] == 'N' && buf[actualStart + 3] == 'G'; if (isPNG) { width = ConvertTo.FromBig32ToInt32(buf, actualStart + 16); height = ConvertTo.FromBig32ToInt32(buf, actualStart + 20); paletteSize = 0; bpp = buf[actualStart + 24]; } else { width = buf[pos]; if (width == 0) { width = 256; } height = buf[pos + 1]; if (height == 0) { height = 256; } paletteSize = buf[pos + 2]; bpp = buf[pos + 6]; } Data.icons.Add(new IconItem(width, height, paletteSize, bpp, storedStart, storedSize, isPNG)); actualStart += storedSize; } if (actualStart != Data.FileSize) { IssueModel.Add("Incorrect file size"); return; } }
public Model(Stream stream, byte[] hdr, string path) { base._data = Data = new WavFormat(this, stream, path); ParseRiff(hdr); Data.ActualCRC32 = null; if (Data.Issues.HasFatal) { return; } if (hdr.Length < 0x2C) { IssueModel.Add("File truncated near header", Severity.Fatal); return; } if (Data.IffChunkCount > 1) { IssueModel.Add("Contains multiple RIFF chunks", Severity.Fatal); return; } int hPos = 0x0C; if (hdr[hPos] != 'f' || hdr[hPos + 1] != 'm' || hdr[hPos + 2] != 't' || hdr[hPos + 3] != 0x20) { IssueModel.Add("Missing 'fmt' section", Severity.Fatal); return; } Data.CompCode = hdr[hPos + 8] | hdr[hPos + 9] << 8; Data.ChannelCount = hdr[hPos + 0x0A] | hdr[hPos + 0x0B] << 8; Data.SampleRate = ConvertTo.FromLit32ToUInt32(hdr, hPos + 0x0C); Data.AverageBPS = ConvertTo.FromLit32ToUInt32(hdr, hPos + 0x10); Data.BlockAlign = hdr[hPos + 0x14] | hdr[hPos + 0x15] << 8; Data.BitsPerSample = hdr[hPos + 0x16] | hdr[hPos + 0x17] << 8; if ((hdr[hPos] & 0x80) != 0) { IssueModel.Add("Header size insanely huge", Severity.Fatal); return; } long hdrDataSize = ConvertTo.FromLit32ToInt32(hdr, hPos + 4); long dataPos = hPos + 8 + hdrDataSize; stream.Position = dataPos; var dHdr = new byte[8]; if (stream.Read(dHdr, 0, 8) != 8) { IssueModel.Add("Read failed", Severity.Fatal); return; } if (dHdr[0] != 'd' || dHdr[1] != 'a' || dHdr[2] != 't' || dHdr[3] != 'a') { IssueModel.Add("Missing 'data' section", Severity.Fatal); return; } Data.mediaPosition = dataPos + 8; Data.MediaCount = ConvertTo.FromLit32ToUInt32(dHdr, 4); if (Data.mediaPosition + Data.MediaCount > Data.IffSize) { IssueModel.Add("Invalid data size", Severity.Fatal); return; } Data.HasTags = Data.mediaPosition + Data.MediaCount < Data.IffSize; GetDiagnostics(); }