+ /* now we are ready for the basic tests */
+
+ if (header->pe.pe_magic == 0x10B) {
+ offset += sizeof (MonoDotNetHeader);
+ SWAP32 (header->pe.pe_data_size);
+ if (header->coff.coff_opt_header_size != (sizeof (MonoDotNetHeader) - sizeof (MonoCOFFHeader) - 4))
+ return -1;
+
+ SWAP32 (header->nt.pe_image_base); /* must be 0x400000 */
+ SWAP32 (header->nt.pe_stack_reserve);
+ SWAP32 (header->nt.pe_stack_commit);
+ SWAP32 (header->nt.pe_heap_reserve);
+ SWAP32 (header->nt.pe_heap_commit);
+ } else if (header->pe.pe_magic == 0x20B) {
+ /* PE32+ file format */
+ if (header->coff.coff_opt_header_size != (sizeof (MonoDotNetHeader64) - sizeof (MonoCOFFHeader) - 4))
+ return -1;
+ memcpy (&header64, image->raw_data + offset, sizeof (MonoDotNetHeader64));
+ offset += sizeof (MonoDotNetHeader64);
+ /* copy the fields already swapped. the last field, pe_data_size, is missing */
+ memcpy (&header64, header, sizeof (MonoDotNetHeader) - 4);
+ /* FIXME: we lose bits here, but we don't use this stuff internally, so we don't care much.
+ * will be fixed when we change MonoDotNetHeader to not match the 32 bit variant
+ */
+ SWAP64 (header64.nt.pe_image_base);
+ header->nt.pe_image_base = header64.nt.pe_image_base;
+ SWAP64 (header64.nt.pe_stack_reserve);
+ header->nt.pe_stack_reserve = header64.nt.pe_stack_reserve;
+ SWAP64 (header64.nt.pe_stack_commit);
+ header->nt.pe_stack_commit = header64.nt.pe_stack_commit;
+ SWAP64 (header64.nt.pe_heap_reserve);
+ header->nt.pe_heap_reserve = header64.nt.pe_heap_reserve;
+ SWAP64 (header64.nt.pe_heap_commit);
+ header->nt.pe_heap_commit = header64.nt.pe_heap_commit;
+
+ header->nt.pe_section_align = header64.nt.pe_section_align;
+ header->nt.pe_file_alignment = header64.nt.pe_file_alignment;
+ header->nt.pe_os_major = header64.nt.pe_os_major;
+ header->nt.pe_os_minor = header64.nt.pe_os_minor;
+ header->nt.pe_user_major = header64.nt.pe_user_major;
+ header->nt.pe_user_minor = header64.nt.pe_user_minor;
+ header->nt.pe_subsys_major = header64.nt.pe_subsys_major;
+ header->nt.pe_subsys_minor = header64.nt.pe_subsys_minor;
+ header->nt.pe_reserved_1 = header64.nt.pe_reserved_1;
+ header->nt.pe_image_size = header64.nt.pe_image_size;
+ header->nt.pe_header_size = header64.nt.pe_header_size;
+ header->nt.pe_checksum = header64.nt.pe_checksum;
+ header->nt.pe_subsys_required = header64.nt.pe_subsys_required;
+ header->nt.pe_dll_flags = header64.nt.pe_dll_flags;
+ header->nt.pe_loader_flags = header64.nt.pe_loader_flags;
+ header->nt.pe_data_dir_count = header64.nt.pe_data_dir_count;
+
+ /* copy the datadir */
+ memcpy (&header->datadir, &header64.datadir, sizeof (MonoPEDatadir));
+ } else {
+ return -1;
+ }
+