grub_efi_modules_addr (void)
{
grub_efi_loaded_image_t *image;
- struct grub_pe32_header *header;
+ struct grub_msdos_image_header *header;
+ struct grub_pe_image_header *pe_image_header;
struct grub_pe32_coff_header *coff_header;
struct grub_pe32_section_table *sections;
struct grub_pe32_section_table *section;
return 0;
header = image->image_base;
- coff_header = &(header->coff_header);
+ pe_image_header
+ = (struct grub_pe_image_header *) ((char *) header
+ + header->pe_image_header_offset);
+ coff_header = &(pe_image_header->coff_header);
sections
= (struct grub_pe32_section_table *) ((char *) coff_header
+ sizeof (*coff_header)
#define GRUB_PE32_MAGIC 0x5a4d
+struct grub_msdos_image_header
+{
+ /* This is always 'MZ'. (GRUB_PE32_MAGIC) */
+ grub_uint16_t msdos_magic;
+
+ grub_uint16_t reserved[29];
+
+ /* The file offset of the PE image header. */
+ grub_uint32_t pe_image_header_offset;
+};
+
/* According to the spec, the minimal alignment is 512 bytes...
But some examples (such as EFI drivers in the Intel
Sample Implementation) use 32 bytes (0x20) instead, and it seems
#define GRUB_PE32_SIGNATURE_SIZE 4
-struct grub_pe32_header
+struct grub_pe_image_header
{
- /* This should be filled in with GRUB_PE32_MSDOS_STUB. */
- grub_uint8_t msdos_stub[GRUB_PE32_MSDOS_STUB_SIZE];
-
/* This is always PE\0\0. */
char signature[GRUB_PE32_SIGNATURE_SIZE];