diff options
-rw-r--r-- | Mono.Cecil.PE/Image.cs | 3 | ||||
-rw-r--r-- | Mono.Cecil.PE/ImageReader.cs | 3 | ||||
-rw-r--r-- | Mono.Cecil.PE/ImageWriter.cs | 12 | ||||
-rw-r--r-- | Mono.Cecil/ModuleDefinition.cs | 2 | ||||
-rw-r--r-- | Test/Mono.Cecil.Tests/ImageReadTests.cs | 8 | ||||
-rw-r--r-- | Test/Resources/assemblies/anycpu32bitpreferred.exe | bin | 0 -> 3584 bytes |
6 files changed, 22 insertions, 6 deletions
diff --git a/Mono.Cecil.PE/Image.cs b/Mono.Cecil.PE/Image.cs index 1092061..97e69c0 100644 --- a/Mono.Cecil.PE/Image.cs +++ b/Mono.Cecil.PE/Image.cs @@ -25,9 +25,10 @@ namespace Mono.Cecil.PE { public string FileName; public ModuleKind Kind; + public uint Characteristics; public string RuntimeVersion; public TargetArchitecture Architecture; - public ModuleCharacteristics Characteristics; + public ModuleCharacteristics DllCharacteristics; public ushort LinkerVersion; public ushort SubSystemMajor; public ushort SubSystemMinor; diff --git a/Mono.Cecil.PE/ImageReader.cs b/Mono.Cecil.PE/ImageReader.cs index 84fdeb6..5358129 100644 --- a/Mono.Cecil.PE/ImageReader.cs +++ b/Mono.Cecil.PE/ImageReader.cs @@ -88,8 +88,9 @@ namespace Mono.Cecil.PE { ReadMetadata (); ReadDebugHeader (); + image.Characteristics = characteristics; image.Kind = GetModuleKind (characteristics, subsystem); - image.Characteristics = (ModuleCharacteristics) dll_characteristics; + image.DllCharacteristics = (ModuleCharacteristics) dll_characteristics; } TargetArchitecture ReadArchitecture () diff --git a/Mono.Cecil.PE/ImageWriter.cs b/Mono.Cecil.PE/ImageWriter.cs index 7e5e923..a8a3fa8 100644 --- a/Mono.Cecil.PE/ImageWriter.cs +++ b/Mono.Cecil.PE/ImageWriter.cs @@ -194,12 +194,18 @@ namespace Mono.Cecil.PE { WriteUInt32 (metadata.timestamp); WriteUInt32 (0); // PointerToSymbolTable WriteUInt32 (0); // NumberOfSymbols - WriteUInt16 (SizeOfOptionalHeader ()); // SizeOfOptionalHeader + WriteUInt16 (SizeOfOptionalHeader ()); // SizeOfOptionalHeader - // ExecutableImage | (pe64 ? 32BitsMachine : LargeAddressAware) - var characteristics = (ushort) (0x0002 | (!pe64 ? 0x0100 : 0x0020)); + const ushort LargeAddressAware = 0x0020; + + // ExecutableImage | (!pe64 ? 32BitsMachine : LargeAddressAware) + var characteristics = (ushort) (0x0002 | (!pe64 ? 0x0100 : LargeAddressAware)); if (module.Kind == ModuleKind.Dll || module.Kind == ModuleKind.NetModule) characteristics |= 0x2000; + + if (module.Image != null && (module.Image.Characteristics & LargeAddressAware) != 0) + characteristics |= LargeAddressAware; + WriteUInt16 (characteristics); // Characteristics } diff --git a/Mono.Cecil/ModuleDefinition.cs b/Mono.Cecil/ModuleDefinition.cs index 8fb35a5..b17f7c4 100644 --- a/Mono.Cecil/ModuleDefinition.cs +++ b/Mono.Cecil/ModuleDefinition.cs @@ -586,7 +586,7 @@ namespace Mono.Cecil { this.RuntimeVersion = image.RuntimeVersion; this.architecture = image.Architecture; this.attributes = image.Attributes; - this.characteristics = image.Characteristics; + this.characteristics = image.DllCharacteristics; this.linker_version = image.LinkerVersion; this.subsystem_major = image.SubSystemMajor; this.subsystem_minor = image.SubSystemMinor; diff --git a/Test/Mono.Cecil.Tests/ImageReadTests.cs b/Test/Mono.Cecil.Tests/ImageReadTests.cs index de7a2cc..ef6ab06 100644 --- a/Test/Mono.Cecil.Tests/ImageReadTests.cs +++ b/Test/Mono.Cecil.Tests/ImageReadTests.cs @@ -101,6 +101,14 @@ namespace Mono.Cecil.Tests { } [Test] + public void AnyCPU32BitPreferred () + { + TestModule ("anycpu32bitpreferred.exe", module => { + Assert.AreNotEqual (0, module.Image.Characteristics & 0x0020); + }); + } + + [Test] public void X64ModuleTextOnlySection () { TestModule ("hello.textonly.x64.exe", module => { diff --git a/Test/Resources/assemblies/anycpu32bitpreferred.exe b/Test/Resources/assemblies/anycpu32bitpreferred.exe Binary files differnew file mode 100644 index 0000000..e758a7f --- /dev/null +++ b/Test/Resources/assemblies/anycpu32bitpreferred.exe |