diff --git a/src/shared/pe-binary.c b/src/shared/pe-binary.c index 997e0e49a6..a3aceb909e 100644 --- a/src/shared/pe-binary.c +++ b/src/shared/pe-binary.c @@ -240,3 +240,17 @@ bool pe_is_uki(const PeHeader *pe_header, const IMAGE_SECTION_HEADER *sections) pe_header_find_section(pe_header, sections, ".osrel") && pe_header_find_section(pe_header, sections, ".linux"); } + +bool pe_is_addon(const PeHeader *pe_header, const IMAGE_SECTION_HEADER *sections) { + assert(pe_header); + assert(sections || le16toh(pe_header->pe.NumberOfSections) == 0); + + if (le16toh(pe_header->optional.Subsystem) != IMAGE_SUBSYSTEM_EFI_APPLICATION) + return false; + + /* Add-ons do not have a Linux kernel, but do have either .cmdline or .dtb (currently) */ + return !pe_header_find_section(pe_header, sections, ".linux") && + (pe_header_find_section(pe_header, sections, ".cmdline") || + pe_header_find_section(pe_header, sections, ".dtb") || + pe_header_find_section(pe_header, sections, ".ucode")); +} diff --git a/src/shared/pe-binary.h b/src/shared/pe-binary.h index 2ef44d7e49..f0979711c8 100644 --- a/src/shared/pe-binary.h +++ b/src/shared/pe-binary.h @@ -142,3 +142,4 @@ int pe_load_sections(int fd, const IMAGE_DOS_HEADER *dos_header, const PeHeader int pe_read_section_data(int fd, const PeHeader *pe_header, const IMAGE_SECTION_HEADER *sections, const char *name, size_t max_size, void **ret, size_t *ret_size); bool pe_is_uki(const PeHeader *pe_header, const IMAGE_SECTION_HEADER *sections); +bool pe_is_addon(const PeHeader *pe_header, const IMAGE_SECTION_HEADER *sections);