1use zerocopy_derive::*;
2
3use crate::IMAGE_DLLCHARACTERISTICS;
4
5#[repr(C)]
6#[derive(
7 Clone,
8 Default,
9 Eq,
10 PartialEq,
11 Ord,
12 PartialOrd,
13 Hash,
14 IntoBytes,
15 FromBytes,
16 Immutable,
17 KnownLayout,
18)]
19pub struct IMAGE_FILE_HEADER {
20 pub machine: u16,
21 pub number_of_sections: u16,
22 pub time_date_stamp: u32,
23 pub pointer_to_symbol_table: u32,
24 pub number_of_symbols: u32,
25 pub size_of_optional_header: u16,
26 pub characteristics: u16,
27}
28
29#[repr(C)]
30#[derive(
31 Clone,
32 Default,
33 Eq,
34 PartialEq,
35 Ord,
36 PartialOrd,
37 Hash,
38 IntoBytes,
39 FromBytes,
40 Immutable,
41 KnownLayout,
42)]
43pub struct IMAGE_DATA_DIRECTORY {
44 pub virtual_address: u32,
45 pub size: u32,
46}
47
48pub const IMAGE_NUMBEROF_DIRECTORY_ENTRIES: usize = 16;
49
50#[repr(C)]
51#[derive(
52 Clone,
53 Default,
54 Eq,
55 PartialEq,
56 Ord,
57 PartialOrd,
58 Hash,
59 IntoBytes,
60 FromBytes,
61 Immutable,
62 KnownLayout,
63)]
64pub struct IMAGE_OPTIONAL_HEADER32 {
65 pub magic: u16,
66 pub major_linker_version: u8,
67 pub minor_linker_version: u8,
68 pub size_of_code: u32,
69 pub size_of_initialized_data: u32,
70 pub size_of_uninitialized_data: u32,
71 pub address_of_entry_point: u32,
72 pub base_of_code: u32,
73 pub base_of_data: u32,
74 pub image_base: u32,
75 pub section_alignment: u32,
76 pub file_alignment: u32,
77 pub major_operating_system_version: u16,
78 pub minor_operating_system_version: u16,
79 pub major_image_version: u16,
80 pub minor_image_version: u16,
81 pub major_subsystem_version: u16,
82 pub minor_subsystem_version: u16,
83 pub win32_version_value: u32,
84 pub size_of_image: u32,
85 pub size_of_headers: u32,
86 pub check_sum: u32,
87 pub subsystem: u16,
88 pub dll_characteristics: IMAGE_DLLCHARACTERISTICS,
89 pub size_of_stack_reserve: u32,
90 pub size_of_stack_commit: u32,
91 pub size_of_heap_reserve: u32,
92 pub size_of_heap_commit: u32,
93 pub loader_flags: u32,
94 pub number_of_rva_and_sizes: u32,
95 pub data_directory: [IMAGE_DATA_DIRECTORY; IMAGE_NUMBEROF_DIRECTORY_ENTRIES],
96}
97
98#[repr(C)]
99#[derive(
100 Clone,
101 Default,
102 Eq,
103 PartialEq,
104 Ord,
105 PartialOrd,
106 Hash,
107 IntoBytes,
108 FromBytes,
109 Immutable,
110 KnownLayout,
111)]
112pub struct IMAGE_OPTIONAL_HEADER64 {
113 pub magic: u16,
114 pub major_linker_version: u8,
115 pub minor_linker_version: u8,
116 pub size_of_code: u32,
117 pub size_of_initialized_data: u32,
118 pub size_of_uninitialized_data: u32,
119 pub address_of_entry_point: u32,
120 pub base_of_code: u32,
121 pub image_base: u64,
122 pub section_alignment: u32,
123 pub file_alignment: u32,
124 pub major_operating_system_version: u16,
125 pub minor_operating_system_version: u16,
126 pub major_image_version: u16,
127 pub minor_image_version: u16,
128 pub major_subsystem_version: u16,
129 pub minor_subsystem_version: u16,
130 pub win32_version_value: u32,
131 pub size_of_image: u32,
132 pub size_of_headers: u32,
133 pub check_sum: u32,
134 pub subsystem: u16,
135 pub dll_characteristics: IMAGE_DLLCHARACTERISTICS,
136 pub size_of_stack_reserve: u64,
137 pub size_of_stack_commit: u64,
138 pub size_of_heap_reserve: u64,
139 pub size_of_heap_commit: u64,
140 pub loader_flags: u32,
141 pub number_of_rva_and_sizes: u32,
142 pub data_directory: [IMAGE_DATA_DIRECTORY; IMAGE_NUMBEROF_DIRECTORY_ENTRIES],
143}
144
145pub const IMAGE_NT_OPTIONAL_HDR32_MAGIC: u16 = 0x10b;
146pub const IMAGE_NT_OPTIONAL_HDR64_MAGIC: u16 = 0x20b;
147pub const IMAGE_ROM_OPTIONAL_HDR_MAGIC: u16 = 0x107;
148
149pub struct IMAGE_NT_HEADERS64 {
150 pub signature: u32,
151 pub file_header: IMAGE_FILE_HEADER,
152 pub optional_header: IMAGE_OPTIONAL_HEADER64,
153}
154
155pub struct IMAGE_NT_HEADERS32 {
156 pub signature: u32,
157 pub file_header: IMAGE_FILE_HEADER,
158 pub optional_header: IMAGE_OPTIONAL_HEADER32,
159}
160
161pub struct IMAGE_ROM_OPTIONAL_HEADER {
162 pub magic: u16,
163 pub major_linker_version: u8,
164 pub minor_linker_version: u8,
165 pub size_of_code: u32,
166 pub size_of_initialized_data: u32,
167 pub size_of_uninitialized_data: u32,
168 pub address_of_entry_point: u32,
169 pub base_of_code: u32,
170 pub base_of_data: u32,
171 pub base_of_bss: u32,
172 pub gpr_mask: u32,
173 pub cpr_mask: [u32; 4],
174 pub gp_value: u32,
175}
176
177pub struct IMAGE_ROM_HEADERS {
178 pub file_header: IMAGE_FILE_HEADER,
179 pub optional_header: IMAGE_ROM_OPTIONAL_HEADER,
180}