Ejemplo n.º 1
0
		public const UInt32 FAT_CIGAM = 0xBEBAFECA; // For little Endian.

		protected void Read(ReadingContext SR)
		{
			// Read the header to see if it is a FAT Binary or not.
			SR.bStreamLittleEndian = false;
			Magic = SR.ReadUInt32();
			bIsFatBinary = (Magic == FAT_MAGIC);

			if (bIsFatBinary)
			{
				Archs =  new List<FatBinaryArch>();
				NumArchs = SR.ReadUInt32();

				for (int ArchIdx = 0; ArchIdx < NumArchs; ArchIdx++)
				{
					SR.bStreamLittleEndian = false;

					FatBinaryArch Arch = new FatBinaryArch();

					Arch.CpuType = SR.ReadUInt32();
					Arch.CpuSubType = SR.ReadUInt32();
					Arch.Offset = SR.ReadUInt32();
					Arch.Size = SR.ReadUInt32();
					Arch.Align = SR.ReadUInt32();

					Archs.Add(Arch);

					MachObjectFile Exe = new MachObjectFile();

					SR.bStreamLittleEndian = true;
					SR.OpenFatArchiveAt(Arch.Offset);
					Exe.Read(SR);
					SR.CloseFatArchive();

					MachObjectFiles.Add(Exe);
				}
				SR.bStreamLittleEndian = true;
			}
			else
			{
				SR.bStreamLittleEndian = true;
				MachObjectFile Exe = new MachObjectFile();
				SR.Position = 0;
				Exe.Read(SR);
				MachObjectFiles.Add(Exe);
			}
		}