private unsafe void EnsureHeader() { if (_readyToRunHeader != null) { return; } uint machine = (uint)PEReader.PEHeaders.CoffHeader.Machine; _operatingSystem = OperatingSystem.Unknown; foreach (OperatingSystem os in Enum.GetValues(typeof(OperatingSystem))) { _machine = (Machine)(machine ^ (uint)os); if (Enum.IsDefined(typeof(Machine), _machine)) { _operatingSystem = os; break; } } if (_operatingSystem == OperatingSystem.Unknown) { throw new BadImageFormatException($"Invalid Machine: {machine}"); } switch (_machine) { case Machine.I386: _architecture = Architecture.X86; break; case Machine.Amd64: _architecture = Architecture.X64; break; case Machine.Arm: case Machine.Thumb: case Machine.ArmThumb2: _architecture = Architecture.Arm; break; case Machine.Arm64: _architecture = Architecture.Arm64; break; default: throw new NotImplementedException(Machine.ToString()); } _imageBase = PEReader.PEHeaders.PEHeader.ImageBase; // Initialize R2RHeader DirectoryEntry r2rHeaderDirectory = PEReader.PEHeaders.CorHeader.ManagedNativeHeaderDirectory; int r2rHeaderOffset = GetOffset(r2rHeaderDirectory.RelativeVirtualAddress); _readyToRunHeader = new ReadyToRunHeader(Image, r2rHeaderDirectory.RelativeVirtualAddress, r2rHeaderOffset); if (r2rHeaderDirectory.Size != ReadyToRunHeader.Size) { throw new BadImageFormatException("The calculated size of the R2RHeader doesn't match the size saved in the ManagedNativeHeaderDirectory"); } }
private unsafe void EnsureHeader() { if (_readyToRunHeader != null) { return; } uint machine = (uint)PEReader.PEHeaders.CoffHeader.Machine; _operatingSystem = OperatingSystem.Unknown; foreach (OperatingSystem os in Enum.GetValues(typeof(OperatingSystem))) { _machine = (Machine)(machine ^ (uint)os); if (Enum.IsDefined(typeof(Machine), _machine)) { _operatingSystem = os; break; } } if (_operatingSystem == OperatingSystem.Unknown) { throw new BadImageFormatException($"Invalid Machine: {machine}"); } switch (_machine) { case Machine.I386: _architecture = Architecture.X86; break; case Machine.Amd64: _architecture = Architecture.X64; break; case Machine.Arm: case Machine.Thumb: case Machine.ArmThumb2: _architecture = Architecture.Arm; break; case Machine.Arm64: _architecture = Architecture.Arm64; break; default: throw new NotImplementedException(Machine.ToString()); } _imageBase = PEReader.PEHeaders.PEHeader.ImageBase; // Initialize R2RHeader Debug.Assert(_readyToRunHeaderRVA != 0); int r2rHeaderOffset = GetOffset(_readyToRunHeaderRVA); _readyToRunHeader = new ReadyToRunHeader(Image, _readyToRunHeaderRVA, r2rHeaderOffset); }