@@ -9,6 +9,16 @@ use object::pe::{
99} ;
1010use object:: read:: pe:: { ImageNtHeaders as _, SectionTable } ;
1111
12+ /// `IMAGE_FILE_MACHINE` value required for kernels loaded by this target.
13+ #[ cfg( target_arch = "x86_64" ) ]
14+ pub ( crate ) const EXPECTED_MACHINE : u16 = object:: pe:: IMAGE_FILE_MACHINE_AMD64 ;
15+ /// `IMAGE_FILE_MACHINE` value required for kernels loaded by this target.
16+ #[ cfg( target_arch = "aarch64" ) ]
17+ pub ( crate ) const EXPECTED_MACHINE : u16 = object:: pe:: IMAGE_FILE_MACHINE_ARM64 ;
18+ /// `IMAGE_FILE_MACHINE` value required for kernels loaded by this target.
19+ #[ cfg( target_arch = "riscv64" ) ]
20+ pub ( crate ) const EXPECTED_MACHINE : u16 = object:: pe:: IMAGE_FILE_MACHINE_RISCV64 ;
21+
1222/// `IMAGE_DLLCHARACTERISTICS_NX_COMPAT`.
1323const NX_COMPAT : u16 = 0x0100 ;
1424
@@ -42,6 +52,13 @@ impl<'a> Image<'a> {
4252 . sections ( data, offset)
4353 . context ( "invalid section table" ) ?;
4454
55+ let machine = nt_headers. file_header . machine . get ( LE ) ;
56+ ensure ! (
57+ machine == EXPECTED_MACHINE ,
58+ "kernel PE machine 0x{machine:04x} is not supported on this target \
59+ (expected 0x{EXPECTED_MACHINE:04x})"
60+ ) ;
61+
4562 let optional_header = & nt_headers. optional_header ;
4663 let entry_point_rva = optional_header. address_of_entry_point . get ( LE ) ;
4764 let base_address = optional_header. image_base . get ( LE ) ;
@@ -127,6 +144,21 @@ mod tests {
127144 assert ! ( err. to_string( ) . contains( "invalid PE headers" ) , "{err}" ) ;
128145 }
129146
147+ #[ test]
148+ fn parse_wrong_machine_rejected ( ) {
149+ // ARRANGE
150+ let mut builder = Builder :: new ( ) ;
151+ builder. add_section ( * b".text\0 \0 \0 " , & [ 0_u8 ; 16 ] ) ;
152+ builder. set_machine ( 0 ) ;
153+ let data = builder. build ( ) ;
154+
155+ // ACT
156+ let err = Image :: parse ( & data) . unwrap_err ( ) ;
157+
158+ // ASSERT
159+ assert ! ( err. to_string( ) . contains( "machine" ) , "{err}" ) ;
160+ }
161+
130162 #[ test]
131163 fn parse_no_entry_point ( ) {
132164 // ARRANGE
0 commit comments