summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2024-07-05 16:15:35 +0200
committerLennart Poettering <lennart@poettering.net>2024-09-12 10:02:15 +0200
commit9de565dd5d8dc768c1e9e2edb1eb5461d75505ef (patch)
treea0ca54ce8ca331fd9a4694c5fb3e498df6328a33 /src
parentpe-binary: split pe_header_find_section() in two (diff)
downloadsystemd-9de565dd5d8dc768c1e9e2edb1eb5461d75505ef.tar.xz
systemd-9de565dd5d8dc768c1e9e2edb1eb5461d75505ef.zip
pe-binary: add pe_is_native() for checking if PE is native
Diffstat (limited to 'src')
-rw-r--r--src/fundamental/uki.h22
-rw-r--r--src/shared/pe-binary.c11
-rw-r--r--src/shared/pe-binary.h2
3 files changed, 35 insertions, 0 deletions
diff --git a/src/fundamental/uki.h b/src/fundamental/uki.h
index 2fcde690d9..e7c59100e1 100644
--- a/src/fundamental/uki.h
+++ b/src/fundamental/uki.h
@@ -31,3 +31,25 @@ static inline bool unified_section_measure(UnifiedSection section) {
/* Max number of profiles per UKI */
#define UNIFIED_PROFILES_MAX 256U
+
+/* The native PE machine type, if known, for a full list see:
+ * https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#machine-types */
+#ifndef _IMAGE_FILE_MACHINE_NATIVE
+# if defined(__x86_64__)
+# define _IMAGE_FILE_MACHINE_NATIVE UINT16_C(0x8664)
+# elif defined(__i386__)
+# define _IMAGE_FILE_MACHINE_NATIVE UINT16_C(0x014c)
+# elif defined(__ia64__)
+# define _IMAGE_FILE_MACHINE_NATIVE UINT16_C(0x0200)
+# elif defined(__aarch64__)
+# define _IMAGE_FILE_MACHINE_NATIVE UINT16_C(0xaa64)
+# elif defined(__arm__)
+# define _IMAGE_FILE_MACHINE_NATIVE UINT16_C(0x01c0)
+# elif defined(__riscv)
+# if __SIZEOF_POINTER__ == 4
+# define _IMAGE_FILE_MACHINE_NATIVE UINT16_C(0x5032)
+# elif __SIZEOF_POINTER__ == 8
+# define _IMAGE_FILE_MACHINE_NATIVE UINT16_C(0x5064)
+# endif
+# endif
+#endif
diff --git a/src/shared/pe-binary.c b/src/shared/pe-binary.c
index bfeaf3f1e1..3893ffaf97 100644
--- a/src/shared/pe-binary.c
+++ b/src/shared/pe-binary.c
@@ -6,6 +6,7 @@
#include "log.h"
#include "pe-binary.h"
#include "string-util.h"
+#include "uki.h"
bool pe_header_is_64bit(const PeHeader *h) {
assert(h);
@@ -273,3 +274,13 @@ bool pe_is_addon(const PeHeader *pe_header, const IMAGE_SECTION_HEADER *sections
pe_header_find_section(pe_header, sections, ".dtb") ||
pe_header_find_section(pe_header, sections, ".ucode"));
}
+
+bool pe_is_native(const PeHeader *pe_header) {
+ assert(pe_header);
+
+#ifdef _IMAGE_FILE_MACHINE_NATIVE
+ return le16toh(pe_header->pe.Machine) == _IMAGE_FILE_MACHINE_NATIVE;
+#else
+ return false;
+#endif
+}
diff --git a/src/shared/pe-binary.h b/src/shared/pe-binary.h
index 20f839e9a0..f508989185 100644
--- a/src/shared/pe-binary.h
+++ b/src/shared/pe-binary.h
@@ -145,3 +145,5 @@ int pe_read_section_data_by_name(int fd, const PeHeader *pe_header, const IMAGE_
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);
+
+bool pe_is_native(const PeHeader *pe_header);