public static DDTEntry GetEntry(DDTEntry parent, BinaryReader reader) { int nameOffset = reader.ReadInt32(); uint dataOffset = reader.ReadUInt32(); int numData = reader.ReadInt32(); long posNextEntry = reader.GetPosition(); DDTEntry entry; if (numData < 0) { int numChildren = ~numData + 1; entry = new DDTDirectoryEntry(reader, parent, nameOffset, dataOffset, numChildren); } else { entry = new DDTFileEntry(reader, parent, nameOffset, dataOffset, numData); } reader.Seek(posNextEntry, SeekOrigin.Begin); return entry; }
private void InternalRead(BinaryReader reader) { long posStart = reader.GetPosition(); byte length = reader.ReadByte(); byte extLength = reader.ReadByte(); _LBA = reader.ReadInt32(); reader.Seek(0x04, SeekOrigin.Current); // LBA_BE _size = reader.ReadInt32(); reader.Seek(0x04 + 0x07, SeekOrigin.Current); // size_BE + datetime _flags = reader.ReadByte(); reader.Seek(0x06, SeekOrigin.Current); // unit size + interleave gap + volume seq number byte nameLength = reader.ReadByte(); byte[] nameBytes = reader.ReadBytes(nameLength); if (nameBytes.Length == 1) { if (nameBytes[0] == 0) _name = "."; else if (nameBytes[0] == 1) _name = ".."; } else { _name = Encoding.ASCII.GetString(nameBytes).Split(';')[0]; } bool isDirectory = (_flags & (int)RecordFlags.DirectoryRecord) == (int)RecordFlags.DirectoryRecord; bool isNotParentOrGrandparentDirectory = nameLength != 1 || _parent == null; if (isDirectory && isNotParentOrGrandparentDirectory) { reader.Seek(CVMFile.CVM_HEADER_SIZE + ((long)_LBA * CVMFile.ISO_BLOCKSIZE), SeekOrigin.Begin); _subEntries = new List<ISODirectoryRecord>(); // Set the initial sector start position long posSubEntriesSectorStart = reader.BaseStream.Position; long posSubEntriesDataEnd = posSubEntriesSectorStart + _size; while (reader.BaseStream.Position < posSubEntriesDataEnd) { ISODirectoryRecord record = new ISODirectoryRecord(reader, this); _subEntries.Add(record); // Skip padding byte test = reader.ReadByte(); while (test == 0 && reader.BaseStream.Position < posSubEntriesDataEnd) { test = reader.ReadByte(); } // Break out of the loop if we've read to or past the end position if (reader.BaseStream.Position >= posSubEntriesDataEnd) { break; } // We've found a non-zero byte, seek back reader.BaseStream.Position -= 1; } } reader.Seek(posStart + length + extLength, SeekOrigin.Begin); }
// Private Methods private void InternalRead(BinaryReader reader) { Stream stream = reader.BaseStream; int posFileStart = (int)reader.GetPosition(); SPR4Header header = stream.ReadStructure<SPR4Header>(); stream.Seek(posFileStart + header.texturePointerTableOffset, SeekOrigin.Begin); TypePointerTable[] texturePointerTable = stream.ReadStructures<TypePointerTable>(header.numTextures); stream.Seek(posFileStart + header.keyFramePointerTableOffset, SeekOrigin.Begin); TypePointerTable[] keyFramePointerTable = stream.ReadStructures<TypePointerTable>(header.numKeyFrames); _textures = new List<TGAFile>(header.numTextures); for (int i = 0; i < header.numTextures; i++) { stream.Seek(posFileStart + texturePointerTable[i].offset, SeekOrigin.Begin); _textures.Add(new TGAFile(stream, true)); } _keyFrames = new List<SPRKeyFrame>(header.numKeyFrames); for (int i = 0; i < header.numKeyFrames; i++) { stream.Seek(posFileStart + keyFramePointerTable[i].offset, SeekOrigin.Begin); _keyFrames.Add(new SPRKeyFrame(reader)); } }
private void InternalRead(BinaryReader reader) { long posFileStart = reader.GetPosition(); short flag = reader.ReadInt16(); short userID = reader.ReadInt16(); int length = reader.ReadInt32(); string tag = reader.ReadCString(4); reader.AlignPosition(16); if (tag != TAG) { throw new InvalidDataException(); } PaletteCount = reader.ReadByte(); PaletteFormat = (PS2PixelFormat)reader.ReadByte(); Width = reader.ReadUInt16(); Height = reader.ReadUInt16(); PixelFormat = (PS2PixelFormat)reader.ReadByte(); MipMapCount = reader.ReadByte(); _mipKL = reader.ReadUInt16(); byte reserved = reader.ReadByte(); _wrapModes = reader.ReadByte(); UserTextureID = reader.ReadInt32(); UserClutID = reader.ReadInt32(); UserComment = reader.ReadCString(28); // Check if there's any palettes and read them if (UsesPalette) { ReadPalette(reader); } // Read the pixels for the image and mipmaps ReadPixels(reader); }
private void InternalRead(BinaryReader reader) { long posFileStart = reader.GetPosition(); short flag = reader.ReadInt16(); short userID = reader.ReadInt16(); int length = reader.ReadInt32(); string tag = reader.ReadCString(4); int unused = reader.ReadInt32(); if (tag != TAG) { throw new InvalidDataException("Identifier mismatch."); } int numTypeTableEntries = reader.ReadInt32(); int numUnknown = reader.ReadInt32(); reader.AlignPosition(16); TypeTableEntry[] typeTable = new TypeTableEntry[numTypeTableEntries]; for (int i = 0; i < numTypeTableEntries; i++) { typeTable[i] = new TypeTableEntry(reader); } System.Diagnostics.Debug.Assert(typeTable[(int)TypeTableType.Strings].elementCount == 0xF0); for (int i = 0; i < numTypeTableEntries; i++) { reader.Seek(posFileStart + typeTable[i].dataOffset, SeekOrigin.Begin); switch ((TypeTableType)typeTable[i].type) { case TypeTableType.Procedures: ReadCodeLabels(reader, ref _procedures, typeTable[i].elementCount, out _requireSortProcedures); break; case TypeTableType.JumpLabels: ReadCodeLabels(reader, ref _jumpLabels, typeTable[i].elementCount, out _requireSortJumps); break; case TypeTableType.Opcodes: { bool hasExtendedOpcodes; _opcodes = BFDisassembler.ParseCodeblock(reader.ReadUInt32Array(typeTable[i].elementCount), out hasExtendedOpcodes); if (hasExtendedOpcodes) // only fix up the opcode indices if they have to be FixupOpcodeIndices(); // this function is kinda 2*O(n^2) } break; case TypeTableType.Messages: if (typeTable[i].elementCount > 0) _messageFile = new BMDFile(StreamHelper.ReadStream(reader, typeTable[i].elementCount), false); break; case TypeTableType.Strings: // TODO: Implement this break; } } }
private void InternalRead(BinaryReader reader) { long posFileStart = reader.GetPosition(); short flag = reader.ReadInt16(); short userID = reader.ReadInt16(); int length = reader.ReadInt32(); string tag = reader.ReadCString(4); reader.AlignPosition(16); if (tag != TAG) { throw new InvalidDataException(); } int addressRelocTableOffset = reader.ReadInt32(); int addressRelocTableSize = reader.ReadInt32(); int numMessages = reader.ReadInt32(); short isRelocated = reader.ReadInt16(); // actually a byte but not very important short unk0x1E = reader.ReadInt16(); /* if (unk0x1C != UNK_CONSTANT) { Console.WriteLine("_unk0x1C isn't 0x20000"); } */ BMDMessageTable[] messagePointerTable = new BMDMessageTable[numMessages]; for (int i = 0; i < messagePointerTable.Length; i++) { messagePointerTable[i].Type = (BMDMessageType)reader.ReadInt32(); messagePointerTable[i].Offset = reader.ReadInt32(); } int actorNamePointerTableOffset = reader.ReadInt32(); int numActors = reader.ReadInt32(); reader.BaseStream.Seek(posFileStart + DATA_START_ADDRESS + actorNamePointerTableOffset, SeekOrigin.Begin); int[] actorNamePointerTable = reader.ReadInt32Array(numActors); _actorNames = new string[numActors]; for (int i = 0; i < _actorNames.Length; i++) { reader.BaseStream.Seek(posFileStart + DATA_START_ADDRESS + actorNamePointerTable[i], SeekOrigin.Begin); _actorNames[i] = reader.ReadCString(); } _messages = new BMDMessage[numMessages]; for (int i = 0; i < _messages.Length; i++) { _messages[i] = BMDMessageFactory.GetMessage(reader, (int)posFileStart, messagePointerTable[i]); } }