public HeaderHunk ParseHeader(Action <Hunk> h) { var hunk = new HeaderHunk(); h(hunk); var names = new List <string>(); hunk.HunkNames = names; while (true) { var t = this.ReadString(); if (t == null) { throw new BadImageFormatException("Error parsing header hunk names."); } else if (t.Length == 0) { break; } names.Add(t); } // Table size and hunk range var table_size = f.ReadBeInt32(); var first_hunk = f.ReadBeInt32(); var last_hunk = f.ReadBeInt32(); if (table_size < 0 || first_hunk < 0 || last_hunk < 0) { throw new BadImageFormatException("Invalid header hunk."); } hunk.table_size = table_size; hunk.FirstHunkId = first_hunk; hunk.LastHunkId = last_hunk; // Determine number of hunks in size table int num_hunks = last_hunk - first_hunk + 1; var hunkInfos = new List <HunkInfo>(); for (int a = 0; a < num_hunks; ++a) { var hunk_info = new HunkInfo(); int hunk_size = this.read_long(); hunk_size &= 0x3FFFFFFF; // Top 2 bits not handled yet. if (hunk_size < 0) { throw new BadImageFormatException("Head hunk contains invalid hunk_size."); } int hunk_bytes = (hunk_size & ~Hunk.HUNKF_ALL) * 4; hunk_info.Size = hunk_bytes; hunk_info.Flags = this.SetMemoryFlags(hunk_size & Hunk.HUNKF_ALL, 30); hunkInfos.Add(hunk_info); } hunk.HunkInfos = hunkInfos; return(hunk); }
public HeaderHunk ParseHeader(Action<Hunk> h) { var hunk = new HeaderHunk(); h(hunk); var names = new List<string>(); hunk.HunkNames = names; while (true) { var t = this.ReadString(); if (t == null) throw new BadImageFormatException("Error parsing header hunk names."); else if (t.Length == 0) { break; } names.Add(t); } // Table size and hunk range var table_size = f.ReadBeInt32(); var first_hunk = f.ReadBeInt32(); var last_hunk = f.ReadBeInt32(); if (table_size < 0 || first_hunk < 0 || last_hunk < 0) throw new BadImageFormatException("Invalid header hunk."); hunk.table_size = table_size; hunk.FirstHunkId = first_hunk; hunk.LastHunkId = last_hunk; // Determine number of hunks in size table int num_hunks = last_hunk - first_hunk + 1; var hunkInfos = new List<HunkInfo>(); for (int a = 0; a < num_hunks; ++a) { var hunk_info = new HunkInfo(); int hunk_size = this.read_long(); hunk_size &= 0x3FFFFFFF; // Top 2 bits not handled yet. if (hunk_size < 0) throw new BadImageFormatException("Head hunk contains invalid hunk_size."); int hunk_bytes = (hunk_size & ~Hunk.HUNKF_ALL) * 4; hunk_info.Size = hunk_bytes; hunk_info.Flags = this.SetMemoryFlags(hunk_size & Hunk.HUNKF_ALL, 30); hunkInfos.Add(hunk_info); } hunk.HunkInfos = hunkInfos; return hunk; }