/* 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
#include "log.h"
#include "pe-binary.h"
#include "string-util.h"
+#include "uki.h"
bool pe_header_is_64bit(const PeHeader *h) {
assert(h);
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
+}
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);