private static List <WadEntry> ReadEntriesOrThrow(byte[] wadData) { ByteReader reader = ByteReader.From(ByteOrder.Little, wadData); // The header must exist fully or else we can't read it. if (!reader.HasRemaining(12)) { throw new Exception("Cannot read Wad"); } WadResourceNamespaceTracker namespaceTracker = new WadResourceNamespaceTracker(); List <WadEntry> entries = new List <WadEntry>(); WadHeader header = ReadHeader(reader); reader.Offset = header.DirectoryTableOffset; for (int i = 0; i < header.EntryCount; i++) { WadDirectoryEntry dirEntry = ReadWadEntry(reader); ResourceNamespace resourceNamespace = namespaceTracker.Update(dirEntry); byte[] data = reader.Bytes(dirEntry.Size, dirEntry.Offset); // Unfortunately binary readers can silently fail and just // consume the remaining data. We want to let the caller // know the wad is in fact corrupt if it can't read enough. if (data.Length != dirEntry.Size) { throw new Exception("Malformed wad entry length"); } WadEntry entry = new WadEntry(dirEntry.Name, resourceNamespace, data); entries.Add(entry); } return(entries); }