From: Lennart Poettering Date: Fri, 5 Jul 2024 08:05:59 +0000 (+0200) Subject: pe-binary: add helper pe_is_addon() for detecting whether we are looking at PE EFI... X-Git-Tag: v257-rc1~441^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a8e912f01ba85bcb6e42e395d39301f81671b845;p=thirdparty%2Fsystemd.git pe-binary: add helper pe_is_addon() for detecting whether we are looking at PE EFI add-on --- diff --git a/src/shared/pe-binary.c b/src/shared/pe-binary.c index 997e0e49a61..a3aceb909e4 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 2ef44d7e492..f0979711c83 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);