1 //! PE/COFF definitions.
3 //! These definitions are independent of read/write support, although we do implement
4 //! some traits useful for those.
6 //! This module is based heavily on "winnt.h" (10.0.17763.0).
8 #![allow(missing_docs)]
10 use crate::endian
::{LittleEndian as LE, U16Bytes, U32Bytes, I32, U16, U32, U64}
;
14 pub const IMAGE_DOS_SIGNATURE
: u16 = 0x5A4D;
16 pub const IMAGE_OS2_SIGNATURE
: u16 = 0x454E;
18 pub const IMAGE_OS2_SIGNATURE_LE
: u16 = 0x454C;
20 pub const IMAGE_VXD_SIGNATURE
: u16 = 0x454C;
22 pub const IMAGE_NT_SIGNATURE
: u32 = 0x0000_4550;
25 #[derive(Debug, Clone, Copy)]
27 pub struct ImageDosHeader
{
30 /// Bytes on last page of file
36 /// Size of header in paragraphs
37 pub e_cparhdr
: U16
<LE
>,
38 /// Minimum extra paragraphs needed
39 pub e_minalloc
: U16
<LE
>,
40 /// Maximum extra paragraphs needed
41 pub e_maxalloc
: U16
<LE
>,
42 /// Initial (relative) SS value
50 /// Initial (relative) CS value
52 /// File address of relocation table
53 pub e_lfarlc
: U16
<LE
>,
57 pub e_res
: [U16
<LE
>; 4],
58 /// OEM identifier (for e_oeminfo)
60 /// OEM information; e_oemid specific
61 pub e_oeminfo
: U16
<LE
>,
63 pub e_res2
: [U16
<LE
>; 10],
64 /// File address of new exe header
65 pub e_lfanew
: U32
<LE
>,
69 #[derive(Debug, Clone, Copy)]
71 pub struct ImageOs2Header
{
73 pub ne_magic
: U16
<LE
>,
78 /// Offset of Entry Table
79 pub ne_enttab
: U16
<LE
>,
80 /// Number of bytes in Entry Table
81 pub ne_cbenttab
: U16
<LE
>,
82 /// Checksum of whole file
85 pub ne_flags
: U16
<LE
>,
86 /// Automatic data segment number
87 pub ne_autodata
: U16
<LE
>,
88 /// Initial heap allocation
90 /// Initial stack allocation
91 pub ne_stack
: U16
<LE
>,
92 /// Initial CS:IP setting
94 /// Initial SS:SP setting
96 /// Count of file segments
98 /// Entries in Module Reference Table
100 /// Size of non-resident name table
101 pub ne_cbnrestab
: U16
<LE
>,
102 /// Offset of Segment Table
103 pub ne_segtab
: U16
<LE
>,
104 /// Offset of Resource Table
105 pub ne_rsrctab
: U16
<LE
>,
106 /// Offset of resident name table
107 pub ne_restab
: U16
<LE
>,
108 /// Offset of Module Reference Table
109 pub ne_modtab
: U16
<LE
>,
110 /// Offset of Imported Names Table
111 pub ne_imptab
: U16
<LE
>,
112 /// Offset of Non-resident Names Table
113 pub ne_nrestab
: I32
<LE
>,
114 /// Count of movable entries
115 pub ne_cmovent
: U16
<LE
>,
116 /// Segment alignment shift count
117 pub ne_align
: U16
<LE
>,
118 /// Count of resource segments
119 pub ne_cres
: U16
<LE
>,
120 /// Target Operating system
123 pub ne_flagsothers
: u8,
124 /// offset to return thunks
125 pub ne_pretthunks
: U16
<LE
>,
126 /// offset to segment ref. bytes
127 pub ne_psegrefbytes
: U16
<LE
>,
128 /// Minimum code swap area size
129 pub ne_swaparea
: U16
<LE
>,
130 /// Expected Windows version number
131 pub ne_expver
: U16
<LE
>,
134 /// Windows VXD header
135 #[derive(Debug, Clone, Copy)]
137 pub struct ImageVxdHeader
{
139 pub e32_magic
: U16
<LE
>,
140 /// The byte ordering for the VXD
142 /// The word ordering for the VXD
144 /// The EXE format level for now = 0
145 pub e32_level
: U32
<LE
>,
147 pub e32_cpu
: U16
<LE
>,
151 pub e32_ver
: U32
<LE
>,
153 pub e32_mflags
: U32
<LE
>,
155 pub e32_mpages
: U32
<LE
>,
156 /// Object # for instruction pointer
157 pub e32_startobj
: U32
<LE
>,
158 /// Extended instruction pointer
159 pub e32_eip
: U32
<LE
>,
160 /// Object # for stack pointer
161 pub e32_stackobj
: U32
<LE
>,
162 /// Extended stack pointer
163 pub e32_esp
: U32
<LE
>,
165 pub e32_pagesize
: U32
<LE
>,
166 /// Last page size in VXD
167 pub e32_lastpagesize
: U32
<LE
>,
168 /// Fixup section size
169 pub e32_fixupsize
: U32
<LE
>,
170 /// Fixup section checksum
171 pub e32_fixupsum
: U32
<LE
>,
172 /// Loader section size
173 pub e32_ldrsize
: U32
<LE
>,
174 /// Loader section checksum
175 pub e32_ldrsum
: U32
<LE
>,
176 /// Object table offset
177 pub e32_objtab
: U32
<LE
>,
178 /// Number of objects in module
179 pub e32_objcnt
: U32
<LE
>,
180 /// Object page map offset
181 pub e32_objmap
: U32
<LE
>,
182 /// Object iterated data map offset
183 pub e32_itermap
: U32
<LE
>,
184 /// Offset of Resource Table
185 pub e32_rsrctab
: U32
<LE
>,
186 /// Number of resource entries
187 pub e32_rsrccnt
: U32
<LE
>,
188 /// Offset of resident name table
189 pub e32_restab
: U32
<LE
>,
190 /// Offset of Entry Table
191 pub e32_enttab
: U32
<LE
>,
192 /// Offset of Module Directive Table
193 pub e32_dirtab
: U32
<LE
>,
194 /// Number of module directives
195 pub e32_dircnt
: U32
<LE
>,
196 /// Offset of Fixup Page Table
197 pub e32_fpagetab
: U32
<LE
>,
198 /// Offset of Fixup Record Table
199 pub e32_frectab
: U32
<LE
>,
200 /// Offset of Import Module Name Table
201 pub e32_impmod
: U32
<LE
>,
202 /// Number of entries in Import Module Name Table
203 pub e32_impmodcnt
: U32
<LE
>,
204 /// Offset of Import Procedure Name Table
205 pub e32_impproc
: U32
<LE
>,
206 /// Offset of Per-Page Checksum Table
207 pub e32_pagesum
: U32
<LE
>,
208 /// Offset of Enumerated Data Pages
209 pub e32_datapage
: U32
<LE
>,
210 /// Number of preload pages
211 pub e32_preload
: U32
<LE
>,
212 /// Offset of Non-resident Names Table
213 pub e32_nrestab
: U32
<LE
>,
214 /// Size of Non-resident Name Table
215 pub e32_cbnrestab
: U32
<LE
>,
216 /// Non-resident Name Table Checksum
217 pub e32_nressum
: U32
<LE
>,
218 /// Object # for automatic data object
219 pub e32_autodata
: U32
<LE
>,
220 /// Offset of the debugging information
221 pub e32_debuginfo
: U32
<LE
>,
222 /// The length of the debugging info. in bytes
223 pub e32_debuglen
: U32
<LE
>,
224 /// Number of instance pages in preload section of VXD file
225 pub e32_instpreload
: U32
<LE
>,
226 /// Number of instance pages in demand load section of VXD file
227 pub e32_instdemand
: U32
<LE
>,
228 /// Size of heap - for 16-bit apps
229 pub e32_heapsize
: U32
<LE
>,
231 pub e32_res3
: [u8; 12],
232 pub e32_winresoff
: U32
<LE
>,
233 pub e32_winreslen
: U32
<LE
>,
234 /// Device ID for VxD
235 pub e32_devid
: U16
<LE
>,
236 /// DDK version for VxD
237 pub e32_ddkver
: U16
<LE
>,
241 // File header format.
244 #[derive(Debug, Clone, Copy)]
246 pub struct ImageFileHeader
{
247 pub machine
: U16
<LE
>,
248 pub number_of_sections
: U16
<LE
>,
249 pub time_date_stamp
: U32
<LE
>,
250 pub pointer_to_symbol_table
: U32
<LE
>,
251 pub number_of_symbols
: U32
<LE
>,
252 pub size_of_optional_header
: U16
<LE
>,
253 pub characteristics
: U16
<LE
>,
256 pub const IMAGE_SIZEOF_FILE_HEADER
: usize = 20;
258 /// Relocation info stripped from file.
259 pub const IMAGE_FILE_RELOCS_STRIPPED
: u16 = 0x0001;
260 /// File is executable (i.e. no unresolved external references).
261 pub const IMAGE_FILE_EXECUTABLE_IMAGE
: u16 = 0x0002;
262 /// Line nunbers stripped from file.
263 pub const IMAGE_FILE_LINE_NUMS_STRIPPED
: u16 = 0x0004;
264 /// Local symbols stripped from file.
265 pub const IMAGE_FILE_LOCAL_SYMS_STRIPPED
: u16 = 0x0008;
266 /// Aggressively trim working set
267 pub const IMAGE_FILE_AGGRESIVE_WS_TRIM
: u16 = 0x0010;
268 /// App can handle >2gb addresses
269 pub const IMAGE_FILE_LARGE_ADDRESS_AWARE
: u16 = 0x0020;
270 /// Bytes of machine word are reversed.
271 pub const IMAGE_FILE_BYTES_REVERSED_LO
: u16 = 0x0080;
272 /// 32 bit word machine.
273 pub const IMAGE_FILE_32BIT_MACHINE
: u16 = 0x0100;
274 /// Debugging info stripped from file in .DBG file
275 pub const IMAGE_FILE_DEBUG_STRIPPED
: u16 = 0x0200;
276 /// If Image is on removable media, copy and run from the swap file.
277 pub const IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
: u16 = 0x0400;
278 /// If Image is on Net, copy and run from the swap file.
279 pub const IMAGE_FILE_NET_RUN_FROM_SWAP
: u16 = 0x0800;
281 pub const IMAGE_FILE_SYSTEM
: u16 = 0x1000;
283 pub const IMAGE_FILE_DLL
: u16 = 0x2000;
284 /// File should only be run on a UP machine
285 pub const IMAGE_FILE_UP_SYSTEM_ONLY
: u16 = 0x4000;
286 /// Bytes of machine word are reversed.
287 pub const IMAGE_FILE_BYTES_REVERSED_HI
: u16 = 0x8000;
289 pub const IMAGE_FILE_MACHINE_UNKNOWN
: u16 = 0;
290 /// Useful for indicating we want to interact with the host and not a WoW guest.
291 pub const IMAGE_FILE_MACHINE_TARGET_HOST
: u16 = 0x0001;
293 pub const IMAGE_FILE_MACHINE_I386
: u16 = 0x014c;
294 /// MIPS little-endian, 0x160 big-endian
295 pub const IMAGE_FILE_MACHINE_R3000
: u16 = 0x0162;
296 /// MIPS little-endian
297 pub const IMAGE_FILE_MACHINE_R4000
: u16 = 0x0166;
298 /// MIPS little-endian
299 pub const IMAGE_FILE_MACHINE_R10000
: u16 = 0x0168;
300 /// MIPS little-endian WCE v2
301 pub const IMAGE_FILE_MACHINE_WCEMIPSV2
: u16 = 0x0169;
303 pub const IMAGE_FILE_MACHINE_ALPHA
: u16 = 0x0184;
304 /// SH3 little-endian
305 pub const IMAGE_FILE_MACHINE_SH3
: u16 = 0x01a2;
306 pub const IMAGE_FILE_MACHINE_SH3DSP
: u16 = 0x01a3;
307 /// SH3E little-endian
308 pub const IMAGE_FILE_MACHINE_SH3E
: u16 = 0x01a4;
309 /// SH4 little-endian
310 pub const IMAGE_FILE_MACHINE_SH4
: u16 = 0x01a6;
312 pub const IMAGE_FILE_MACHINE_SH5
: u16 = 0x01a8;
313 /// ARM Little-Endian
314 pub const IMAGE_FILE_MACHINE_ARM
: u16 = 0x01c0;
315 /// ARM Thumb/Thumb-2 Little-Endian
316 pub const IMAGE_FILE_MACHINE_THUMB
: u16 = 0x01c2;
317 /// ARM Thumb-2 Little-Endian
318 pub const IMAGE_FILE_MACHINE_ARMNT
: u16 = 0x01c4;
319 pub const IMAGE_FILE_MACHINE_AM33
: u16 = 0x01d3;
320 /// IBM PowerPC Little-Endian
321 pub const IMAGE_FILE_MACHINE_POWERPC
: u16 = 0x01F0;
322 pub const IMAGE_FILE_MACHINE_POWERPCFP
: u16 = 0x01f1;
324 pub const IMAGE_FILE_MACHINE_IA64
: u16 = 0x0200;
326 pub const IMAGE_FILE_MACHINE_MIPS16
: u16 = 0x0266;
328 pub const IMAGE_FILE_MACHINE_ALPHA64
: u16 = 0x0284;
330 pub const IMAGE_FILE_MACHINE_MIPSFPU
: u16 = 0x0366;
332 pub const IMAGE_FILE_MACHINE_MIPSFPU16
: u16 = 0x0466;
333 pub const IMAGE_FILE_MACHINE_AXP64
: u16 = IMAGE_FILE_MACHINE_ALPHA64
;
335 pub const IMAGE_FILE_MACHINE_TRICORE
: u16 = 0x0520;
336 pub const IMAGE_FILE_MACHINE_CEF
: u16 = 0x0CEF;
338 pub const IMAGE_FILE_MACHINE_EBC
: u16 = 0x0EBC;
340 pub const IMAGE_FILE_MACHINE_AMD64
: u16 = 0x8664;
341 /// M32R little-endian
342 pub const IMAGE_FILE_MACHINE_M32R
: u16 = 0x9041;
343 /// ARM64 Little-Endian
344 pub const IMAGE_FILE_MACHINE_ARM64
: u16 = 0xAA64;
345 pub const IMAGE_FILE_MACHINE_CEE
: u16 = 0xC0EE;
351 #[derive(Debug, Clone, Copy)]
353 pub struct ImageDataDirectory
{
354 pub virtual_address
: U32
<LE
>,
358 pub const IMAGE_NUMBEROF_DIRECTORY_ENTRIES
: usize = 16;
361 // Optional header format.
364 #[derive(Debug, Clone, Copy)]
366 pub struct ImageOptionalHeader32
{
369 pub major_linker_version
: u8,
370 pub minor_linker_version
: u8,
371 pub size_of_code
: U32
<LE
>,
372 pub size_of_initialized_data
: U32
<LE
>,
373 pub size_of_uninitialized_data
: U32
<LE
>,
374 pub address_of_entry_point
: U32
<LE
>,
375 pub base_of_code
: U32
<LE
>,
376 pub base_of_data
: U32
<LE
>,
378 // NT additional fields.
379 pub image_base
: U32
<LE
>,
380 pub section_alignment
: U32
<LE
>,
381 pub file_alignment
: U32
<LE
>,
382 pub major_operating_system_version
: U16
<LE
>,
383 pub minor_operating_system_version
: U16
<LE
>,
384 pub major_image_version
: U16
<LE
>,
385 pub minor_image_version
: U16
<LE
>,
386 pub major_subsystem_version
: U16
<LE
>,
387 pub minor_subsystem_version
: U16
<LE
>,
388 pub win32_version_value
: U32
<LE
>,
389 pub size_of_image
: U32
<LE
>,
390 pub size_of_headers
: U32
<LE
>,
391 pub check_sum
: U32
<LE
>,
392 pub subsystem
: U16
<LE
>,
393 pub dll_characteristics
: U16
<LE
>,
394 pub size_of_stack_reserve
: U32
<LE
>,
395 pub size_of_stack_commit
: U32
<LE
>,
396 pub size_of_heap_reserve
: U32
<LE
>,
397 pub size_of_heap_commit
: U32
<LE
>,
398 pub loader_flags
: U32
<LE
>,
399 pub number_of_rva_and_sizes
: U32
<LE
>,
400 //pub data_directory: [ImageDataDirectory; IMAGE_NUMBEROF_DIRECTORY_ENTRIES],
403 #[derive(Debug, Clone, Copy)]
405 pub struct ImageRomOptionalHeader
{
407 pub major_linker_version
: u8,
408 pub minor_linker_version
: u8,
409 pub size_of_code
: U32
<LE
>,
410 pub size_of_initialized_data
: U32
<LE
>,
411 pub size_of_uninitialized_data
: U32
<LE
>,
412 pub address_of_entry_point
: U32
<LE
>,
413 pub base_of_code
: U32
<LE
>,
414 pub base_of_data
: U32
<LE
>,
415 pub base_of_bss
: U32
<LE
>,
416 pub gpr_mask
: U32
<LE
>,
417 pub cpr_mask
: [U32
<LE
>; 4],
418 pub gp_value
: U32
<LE
>,
421 #[derive(Debug, Clone, Copy)]
423 pub struct ImageOptionalHeader64
{
425 pub major_linker_version
: u8,
426 pub minor_linker_version
: u8,
427 pub size_of_code
: U32
<LE
>,
428 pub size_of_initialized_data
: U32
<LE
>,
429 pub size_of_uninitialized_data
: U32
<LE
>,
430 pub address_of_entry_point
: U32
<LE
>,
431 pub base_of_code
: U32
<LE
>,
432 pub image_base
: U64
<LE
>,
433 pub section_alignment
: U32
<LE
>,
434 pub file_alignment
: U32
<LE
>,
435 pub major_operating_system_version
: U16
<LE
>,
436 pub minor_operating_system_version
: U16
<LE
>,
437 pub major_image_version
: U16
<LE
>,
438 pub minor_image_version
: U16
<LE
>,
439 pub major_subsystem_version
: U16
<LE
>,
440 pub minor_subsystem_version
: U16
<LE
>,
441 pub win32_version_value
: U32
<LE
>,
442 pub size_of_image
: U32
<LE
>,
443 pub size_of_headers
: U32
<LE
>,
444 pub check_sum
: U32
<LE
>,
445 pub subsystem
: U16
<LE
>,
446 pub dll_characteristics
: U16
<LE
>,
447 pub size_of_stack_reserve
: U64
<LE
>,
448 pub size_of_stack_commit
: U64
<LE
>,
449 pub size_of_heap_reserve
: U64
<LE
>,
450 pub size_of_heap_commit
: U64
<LE
>,
451 pub loader_flags
: U32
<LE
>,
452 pub number_of_rva_and_sizes
: U32
<LE
>,
453 //pub data_directory: [ImageDataDirectory; IMAGE_NUMBEROF_DIRECTORY_ENTRIES],
456 pub const IMAGE_NT_OPTIONAL_HDR32_MAGIC
: u16 = 0x10b;
457 pub const IMAGE_NT_OPTIONAL_HDR64_MAGIC
: u16 = 0x20b;
458 pub const IMAGE_ROM_OPTIONAL_HDR_MAGIC
: u16 = 0x107;
460 #[derive(Debug, Clone, Copy)]
462 pub struct ImageNtHeaders64
{
463 pub signature
: U32
<LE
>,
464 pub file_header
: ImageFileHeader
,
465 pub optional_header
: ImageOptionalHeader64
,
468 #[derive(Debug, Clone, Copy)]
470 pub struct ImageNtHeaders32
{
471 pub signature
: U32
<LE
>,
472 pub file_header
: ImageFileHeader
,
473 pub optional_header
: ImageOptionalHeader32
,
476 #[derive(Debug, Clone, Copy)]
478 pub struct ImageRomHeaders
{
479 pub file_header
: ImageFileHeader
,
480 pub optional_header
: ImageRomOptionalHeader
,
483 // Values for `ImageOptionalHeader*::subsystem`.
485 /// Unknown subsystem.
486 pub const IMAGE_SUBSYSTEM_UNKNOWN
: u16 = 0;
487 /// Image doesn't require a subsystem.
488 pub const IMAGE_SUBSYSTEM_NATIVE
: u16 = 1;
489 /// Image runs in the Windows GUI subsystem.
490 pub const IMAGE_SUBSYSTEM_WINDOWS_GUI
: u16 = 2;
491 /// Image runs in the Windows character subsystem.
492 pub const IMAGE_SUBSYSTEM_WINDOWS_CUI
: u16 = 3;
493 /// image runs in the OS/2 character subsystem.
494 pub const IMAGE_SUBSYSTEM_OS2_CUI
: u16 = 5;
495 /// image runs in the Posix character subsystem.
496 pub const IMAGE_SUBSYSTEM_POSIX_CUI
: u16 = 7;
497 /// image is a native Win9x driver.
498 pub const IMAGE_SUBSYSTEM_NATIVE_WINDOWS
: u16 = 8;
499 /// Image runs in the Windows CE subsystem.
500 pub const IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
: u16 = 9;
501 pub const IMAGE_SUBSYSTEM_EFI_APPLICATION
: u16 = 10;
502 pub const IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
: u16 = 11;
503 pub const IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
: u16 = 12;
504 pub const IMAGE_SUBSYSTEM_EFI_ROM
: u16 = 13;
505 pub const IMAGE_SUBSYSTEM_XBOX
: u16 = 14;
506 pub const IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
: u16 = 16;
507 pub const IMAGE_SUBSYSTEM_XBOX_CODE_CATALOG
: u16 = 17;
509 // Values for `ImageOptionalHeader*::dll_characteristics`.
511 // IMAGE_LIBRARY_PROCESS_INIT 0x0001 // Reserved.
512 // IMAGE_LIBRARY_PROCESS_TERM 0x0002 // Reserved.
513 // IMAGE_LIBRARY_THREAD_INIT 0x0004 // Reserved.
514 // IMAGE_LIBRARY_THREAD_TERM 0x0008 // Reserved.
515 /// Image can handle a high entropy 64-bit virtual address space.
516 pub const IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA
: u16 = 0x0020;
518 pub const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
: u16 = 0x0040;
519 /// Code Integrity Image
520 pub const IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
: u16 = 0x0080;
521 /// Image is NX compatible
522 pub const IMAGE_DLLCHARACTERISTICS_NX_COMPAT
: u16 = 0x0100;
523 /// Image understands isolation and doesn't want it
524 pub const IMAGE_DLLCHARACTERISTICS_NO_ISOLATION
: u16 = 0x0200;
525 /// Image does not use SEH. No SE handler may reside in this image
526 pub const IMAGE_DLLCHARACTERISTICS_NO_SEH
: u16 = 0x0400;
527 /// Do not bind this image.
528 pub const IMAGE_DLLCHARACTERISTICS_NO_BIND
: u16 = 0x0800;
529 /// Image should execute in an AppContainer
530 pub const IMAGE_DLLCHARACTERISTICS_APPCONTAINER
: u16 = 0x1000;
531 /// Driver uses WDM model
532 pub const IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
: u16 = 0x2000;
533 /// Image supports Control Flow Guard.
534 pub const IMAGE_DLLCHARACTERISTICS_GUARD_CF
: u16 = 0x4000;
535 pub const IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
: u16 = 0x8000;
537 // Indices for `ImageOptionalHeader*::data_directory`.
540 pub const IMAGE_DIRECTORY_ENTRY_EXPORT
: usize = 0;
542 pub const IMAGE_DIRECTORY_ENTRY_IMPORT
: usize = 1;
543 /// Resource Directory
544 pub const IMAGE_DIRECTORY_ENTRY_RESOURCE
: usize = 2;
545 /// Exception Directory
546 pub const IMAGE_DIRECTORY_ENTRY_EXCEPTION
: usize = 3;
547 /// Security Directory
548 pub const IMAGE_DIRECTORY_ENTRY_SECURITY
: usize = 4;
549 /// Base Relocation Table
550 pub const IMAGE_DIRECTORY_ENTRY_BASERELOC
: usize = 5;
552 pub const IMAGE_DIRECTORY_ENTRY_DEBUG
: usize = 6;
553 // IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage)
554 /// Architecture Specific Data
555 pub const IMAGE_DIRECTORY_ENTRY_ARCHITECTURE
: usize = 7;
557 pub const IMAGE_DIRECTORY_ENTRY_GLOBALPTR
: usize = 8;
559 pub const IMAGE_DIRECTORY_ENTRY_TLS
: usize = 9;
560 /// Load Configuration Directory
561 pub const IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG
: usize = 10;
562 /// Bound Import Directory in headers
563 pub const IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
: usize = 11;
564 /// Import Address Table
565 pub const IMAGE_DIRECTORY_ENTRY_IAT
: usize = 12;
566 /// Delay Load Import Descriptors
567 pub const IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT
: usize = 13;
568 /// COM Runtime descriptor
569 pub const IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
: usize = 14;
571 #[derive(Debug, Clone, Copy)]
580 pub type ClsId
= Guid
;
582 /// Non-COFF Object file header
583 #[derive(Debug, Clone, Copy)]
585 pub struct AnonObjectHeader
{
586 /// Must be IMAGE_FILE_MACHINE_UNKNOWN
590 /// >= 1 (implies the ClsId field is present)
591 pub version
: U16
<LE
>,
592 pub machine
: U16
<LE
>,
593 pub time_date_stamp
: U32
<LE
>,
594 /// Used to invoke CoCreateInstance
596 /// Size of data that follows the header
597 pub size_of_data
: U32
<LE
>,
600 #[derive(Debug, Clone, Copy)]
602 pub struct AnonObjectHeaderV2
{
603 /// Must be IMAGE_FILE_MACHINE_UNKNOWN
607 /// >= 2 (implies the Flags field is present - otherwise V1)
608 pub version
: U16
<LE
>,
609 pub machine
: U16
<LE
>,
610 pub time_date_stamp
: U32
<LE
>,
611 /// Used to invoke CoCreateInstance
613 /// Size of data that follows the header
614 pub size_of_data
: U32
<LE
>,
615 /// 0x1 -> contains metadata
617 /// Size of CLR metadata
618 pub meta_data_size
: U32
<LE
>,
619 /// Offset of CLR metadata
620 pub meta_data_offset
: U32
<LE
>,
623 #[derive(Debug, Clone, Copy)]
625 pub struct AnonObjectHeaderBigobj
{
626 /* same as ANON_OBJECT_HEADER_V2 */
627 /// Must be IMAGE_FILE_MACHINE_UNKNOWN
631 /// >= 2 (implies the Flags field is present)
632 pub version
: U16
<LE
>,
633 /// Actual machine - IMAGE_FILE_MACHINE_xxx
634 pub machine
: U16
<LE
>,
635 pub time_date_stamp
: U32
<LE
>,
636 /// {D1BAA1C7-BAEE-4ba9-AF20-FAF66AA4DCB8}
638 /// Size of data that follows the header
639 pub size_of_data
: U32
<LE
>,
640 /// 0x1 -> contains metadata
642 /// Size of CLR metadata
643 pub meta_data_size
: U32
<LE
>,
644 /// Offset of CLR metadata
645 pub meta_data_offset
: U32
<LE
>,
647 /* bigobj specifics */
648 /// extended from WORD
649 pub number_of_sections
: U32
<LE
>,
650 pub pointer_to_symbol_table
: U32
<LE
>,
651 pub number_of_symbols
: U32
<LE
>,
654 pub const IMAGE_SIZEOF_SHORT_NAME
: usize = 8;
657 // Section header format.
660 #[derive(Debug, Clone, Copy)]
662 pub struct ImageSectionHeader
{
663 pub name
: [u8; IMAGE_SIZEOF_SHORT_NAME
],
664 pub virtual_size
: U32
<LE
>,
665 pub virtual_address
: U32
<LE
>,
666 pub size_of_raw_data
: U32
<LE
>,
667 pub pointer_to_raw_data
: U32
<LE
>,
668 pub pointer_to_relocations
: U32
<LE
>,
669 pub pointer_to_linenumbers
: U32
<LE
>,
670 pub number_of_relocations
: U16
<LE
>,
671 pub number_of_linenumbers
: U16
<LE
>,
672 pub characteristics
: U32
<LE
>,
675 pub const IMAGE_SIZEOF_SECTION_HEADER
: usize = 40;
677 // Values for `ImageSectionHeader::characteristics`.
679 // IMAGE_SCN_TYPE_REG 0x00000000 // Reserved.
680 // IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved.
681 // IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved.
682 // IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved.
684 pub const IMAGE_SCN_TYPE_NO_PAD
: u32 = 0x0000_0008;
685 // IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved.
687 /// Section contains code.
688 pub const IMAGE_SCN_CNT_CODE
: u32 = 0x0000_0020;
689 /// Section contains initialized data.
690 pub const IMAGE_SCN_CNT_INITIALIZED_DATA
: u32 = 0x0000_0040;
691 /// Section contains uninitialized data.
692 pub const IMAGE_SCN_CNT_UNINITIALIZED_DATA
: u32 = 0x0000_0080;
695 pub const IMAGE_SCN_LNK_OTHER
: u32 = 0x0000_0100;
696 /// Section contains comments or some other type of information.
697 pub const IMAGE_SCN_LNK_INFO
: u32 = 0x0000_0200;
698 // IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved.
699 /// Section contents will not become part of image.
700 pub const IMAGE_SCN_LNK_REMOVE
: u32 = 0x0000_0800;
701 /// Section contents comdat.
702 pub const IMAGE_SCN_LNK_COMDAT
: u32 = 0x0000_1000;
703 // 0x00002000 // Reserved.
704 // IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000
705 /// Reset speculative exceptions handling bits in the TLB entries for this section.
706 pub const IMAGE_SCN_NO_DEFER_SPEC_EXC
: u32 = 0x0000_4000;
707 /// Section content can be accessed relative to GP
708 pub const IMAGE_SCN_GPREL
: u32 = 0x0000_8000;
709 pub const IMAGE_SCN_MEM_FARDATA
: u32 = 0x0000_8000;
710 // IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000
711 pub const IMAGE_SCN_MEM_PURGEABLE
: u32 = 0x0002_0000;
712 pub const IMAGE_SCN_MEM_16BIT
: u32 = 0x0002_0000;
713 pub const IMAGE_SCN_MEM_LOCKED
: u32 = 0x0004_0000;
714 pub const IMAGE_SCN_MEM_PRELOAD
: u32 = 0x0008_0000;
716 pub const IMAGE_SCN_ALIGN_1BYTES
: u32 = 0x0010_0000;
717 pub const IMAGE_SCN_ALIGN_2BYTES
: u32 = 0x0020_0000;
718 pub const IMAGE_SCN_ALIGN_4BYTES
: u32 = 0x0030_0000;
719 pub const IMAGE_SCN_ALIGN_8BYTES
: u32 = 0x0040_0000;
720 /// Default alignment if no others are specified.
721 pub const IMAGE_SCN_ALIGN_16BYTES
: u32 = 0x0050_0000;
722 pub const IMAGE_SCN_ALIGN_32BYTES
: u32 = 0x0060_0000;
723 pub const IMAGE_SCN_ALIGN_64BYTES
: u32 = 0x0070_0000;
724 pub const IMAGE_SCN_ALIGN_128BYTES
: u32 = 0x0080_0000;
725 pub const IMAGE_SCN_ALIGN_256BYTES
: u32 = 0x0090_0000;
726 pub const IMAGE_SCN_ALIGN_512BYTES
: u32 = 0x00A0_0000;
727 pub const IMAGE_SCN_ALIGN_1024BYTES
: u32 = 0x00B0_0000;
728 pub const IMAGE_SCN_ALIGN_2048BYTES
: u32 = 0x00C0_0000;
729 pub const IMAGE_SCN_ALIGN_4096BYTES
: u32 = 0x00D0_0000;
730 pub const IMAGE_SCN_ALIGN_8192BYTES
: u32 = 0x00E0_0000;
731 // Unused 0x00F0_0000
732 pub const IMAGE_SCN_ALIGN_MASK
: u32 = 0x00F0_0000;
734 /// Section contains extended relocations.
735 pub const IMAGE_SCN_LNK_NRELOC_OVFL
: u32 = 0x0100_0000;
736 /// Section can be discarded.
737 pub const IMAGE_SCN_MEM_DISCARDABLE
: u32 = 0x0200_0000;
738 /// Section is not cachable.
739 pub const IMAGE_SCN_MEM_NOT_CACHED
: u32 = 0x0400_0000;
740 /// Section is not pageable.
741 pub const IMAGE_SCN_MEM_NOT_PAGED
: u32 = 0x0800_0000;
742 /// Section is shareable.
743 pub const IMAGE_SCN_MEM_SHARED
: u32 = 0x1000_0000;
744 /// Section is executable.
745 pub const IMAGE_SCN_MEM_EXECUTE
: u32 = 0x2000_0000;
746 /// Section is readable.
747 pub const IMAGE_SCN_MEM_READ
: u32 = 0x4000_0000;
748 /// Section is writeable.
749 pub const IMAGE_SCN_MEM_WRITE
: u32 = 0x8000_0000;
752 // TLS Characteristic Flags
754 /// Tls index is scaled
755 pub const IMAGE_SCN_SCALE_INDEX
: u32 = 0x0000_0001;
761 // This struct has alignment 1.
762 #[derive(Debug, Clone, Copy)]
764 pub struct ImageSymbol
{
765 /// If first 4 bytes are 0, then second 4 bytes are offset into string table.
767 pub value
: U32Bytes
<LE
>,
768 pub section_number
: U16Bytes
<LE
>,
769 pub typ
: U16Bytes
<LE
>,
770 pub storage_class
: u8,
771 pub number_of_aux_symbols
: u8,
774 pub const IMAGE_SIZEOF_SYMBOL
: usize = 18;
776 #[derive(Debug, Clone, Copy)]
778 pub struct ImageSymbolBytes(pub [u8; IMAGE_SIZEOF_SYMBOL
]);
780 // This struct has alignment 1.
781 #[derive(Debug, Clone, Copy)]
783 pub struct ImageSymbolEx
{
784 /// If first 4 bytes are 0, then second 4 bytes are offset into string table.
786 pub value
: U32Bytes
<LE
>,
787 pub section_number
: U32Bytes
<LE
>,
788 pub typ
: U16Bytes
<LE
>,
789 pub storage_class
: u8,
790 pub number_of_aux_symbols
: u8,
793 pub const IMAGE_SIZEOF_SYMBOL_EX
: usize = 20;
795 #[derive(Debug, Clone, Copy)]
797 pub struct ImageSymbolExBytes(pub [u8; IMAGE_SIZEOF_SYMBOL_EX
]);
799 // Values for `ImageSymbol::section_number`.
801 // Symbols have a section number of the section in which they are
802 // defined. Otherwise, section numbers have the following meanings:
804 /// Symbol is undefined or is common.
805 pub const IMAGE_SYM_UNDEFINED
: u16 = 0;
806 /// Symbol is an absolute value.
807 pub const IMAGE_SYM_ABSOLUTE
: u16 = 0xffff;
808 /// Symbol is a special debug item.
809 pub const IMAGE_SYM_DEBUG
: u16 = 0xfffe;
810 /// Values 0xFF00-0xFFFF are special
811 pub const IMAGE_SYM_SECTION_MAX
: u16 = 0xFEFF;
812 pub const IMAGE_SYM_SECTION_MAX_EX
: u32 = 0x7fff_ffff;
814 // Values for `ImageSymbol::typ` (basic component).
817 pub const IMAGE_SYM_TYPE_NULL
: u16 = 0x0000;
818 pub const IMAGE_SYM_TYPE_VOID
: u16 = 0x0001;
820 pub const IMAGE_SYM_TYPE_CHAR
: u16 = 0x0002;
821 /// type short integer.
822 pub const IMAGE_SYM_TYPE_SHORT
: u16 = 0x0003;
823 pub const IMAGE_SYM_TYPE_INT
: u16 = 0x0004;
824 pub const IMAGE_SYM_TYPE_LONG
: u16 = 0x0005;
825 pub const IMAGE_SYM_TYPE_FLOAT
: u16 = 0x0006;
826 pub const IMAGE_SYM_TYPE_DOUBLE
: u16 = 0x0007;
827 pub const IMAGE_SYM_TYPE_STRUCT
: u16 = 0x0008;
828 pub const IMAGE_SYM_TYPE_UNION
: u16 = 0x0009;
830 pub const IMAGE_SYM_TYPE_ENUM
: u16 = 0x000A;
831 /// member of enumeration.
832 pub const IMAGE_SYM_TYPE_MOE
: u16 = 0x000B;
833 pub const IMAGE_SYM_TYPE_BYTE
: u16 = 0x000C;
834 pub const IMAGE_SYM_TYPE_WORD
: u16 = 0x000D;
835 pub const IMAGE_SYM_TYPE_UINT
: u16 = 0x000E;
836 pub const IMAGE_SYM_TYPE_DWORD
: u16 = 0x000F;
837 pub const IMAGE_SYM_TYPE_PCODE
: u16 = 0x8000;
839 // Values for `ImageSymbol::typ` (derived component).
842 pub const IMAGE_SYM_DTYPE_NULL
: u16 = 0;
844 pub const IMAGE_SYM_DTYPE_POINTER
: u16 = 1;
846 pub const IMAGE_SYM_DTYPE_FUNCTION
: u16 = 2;
848 pub const IMAGE_SYM_DTYPE_ARRAY
: u16 = 3;
850 // Values for `ImageSymbol::storage_class`.
851 pub const IMAGE_SYM_CLASS_END_OF_FUNCTION
: u8 = 0xff;
852 pub const IMAGE_SYM_CLASS_NULL
: u8 = 0x00;
853 pub const IMAGE_SYM_CLASS_AUTOMATIC
: u8 = 0x01;
854 pub const IMAGE_SYM_CLASS_EXTERNAL
: u8 = 0x02;
855 pub const IMAGE_SYM_CLASS_STATIC
: u8 = 0x03;
856 pub const IMAGE_SYM_CLASS_REGISTER
: u8 = 0x04;
857 pub const IMAGE_SYM_CLASS_EXTERNAL_DEF
: u8 = 0x05;
858 pub const IMAGE_SYM_CLASS_LABEL
: u8 = 0x06;
859 pub const IMAGE_SYM_CLASS_UNDEFINED_LABEL
: u8 = 0x07;
860 pub const IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
: u8 = 0x08;
861 pub const IMAGE_SYM_CLASS_ARGUMENT
: u8 = 0x09;
862 pub const IMAGE_SYM_CLASS_STRUCT_TAG
: u8 = 0x0A;
863 pub const IMAGE_SYM_CLASS_MEMBER_OF_UNION
: u8 = 0x0B;
864 pub const IMAGE_SYM_CLASS_UNION_TAG
: u8 = 0x0C;
865 pub const IMAGE_SYM_CLASS_TYPE_DEFINITION
: u8 = 0x0D;
866 pub const IMAGE_SYM_CLASS_UNDEFINED_STATIC
: u8 = 0x0E;
867 pub const IMAGE_SYM_CLASS_ENUM_TAG
: u8 = 0x0F;
868 pub const IMAGE_SYM_CLASS_MEMBER_OF_ENUM
: u8 = 0x10;
869 pub const IMAGE_SYM_CLASS_REGISTER_PARAM
: u8 = 0x11;
870 pub const IMAGE_SYM_CLASS_BIT_FIELD
: u8 = 0x12;
872 pub const IMAGE_SYM_CLASS_FAR_EXTERNAL
: u8 = 0x44;
874 pub const IMAGE_SYM_CLASS_BLOCK
: u8 = 0x64;
875 pub const IMAGE_SYM_CLASS_FUNCTION
: u8 = 0x65;
876 pub const IMAGE_SYM_CLASS_END_OF_STRUCT
: u8 = 0x66;
877 pub const IMAGE_SYM_CLASS_FILE
: u8 = 0x67;
879 pub const IMAGE_SYM_CLASS_SECTION
: u8 = 0x68;
880 pub const IMAGE_SYM_CLASS_WEAK_EXTERNAL
: u8 = 0x69;
882 pub const IMAGE_SYM_CLASS_CLR_TOKEN
: u8 = 0x6B;
884 // type packing constants
886 pub const N_BTMASK
: u16 = 0x000F;
887 pub const N_TMASK
: u16 = 0x0030;
888 pub const N_TMASK1
: u16 = 0x00C0;
889 pub const N_TMASK2
: u16 = 0x00F0;
890 pub const N_BTSHFT
: usize = 4;
891 pub const N_TSHIFT
: usize = 2;
893 pub const IMAGE_SYM_DTYPE_SHIFT
: usize = N_BTSHFT
;
897 pub fn base_type(&self) -> u16 {
898 self.typ
.get(LE
) & N_BTMASK
902 pub fn derived_type(&self) -> u16 {
903 (self.typ
.get(LE
) & N_TMASK
) >> N_BTSHFT
909 pub fn base_type(&self) -> u16 {
910 self.typ
.get(LE
) & N_BTMASK
914 pub fn derived_type(&self) -> u16 {
915 (self.typ
.get(LE
) & N_TMASK
) >> N_BTSHFT
920 // Auxiliary entry format.
923 // Used for both ImageSymbol and ImageSymbolEx (with padding).
924 // This struct has alignment 1.
925 #[derive(Debug, Clone, Copy)]
927 pub struct ImageAuxSymbolTokenDef
{
928 /// IMAGE_AUX_SYMBOL_TYPE
932 pub symbol_table_index
: U32Bytes
<LE
>,
934 pub reserved2
: [u8; 12],
937 pub const IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF
: u16 = 1;
939 /// Auxilliary symbol format 1: function definitions.
940 // This struct has alignment 1.
941 #[derive(Debug, Clone, Copy)]
943 pub struct ImageAuxSymbolFunction
{
944 pub tag_index
: U32Bytes
<LE
>,
945 pub total_size
: U32Bytes
<LE
>,
946 pub pointer_to_linenumber
: U32Bytes
<LE
>,
947 pub pointer_to_next_function
: U32Bytes
<LE
>,
951 /// Auxilliary symbol format 2: .bf and .ef symbols.
952 // This struct has alignment 1.
953 #[derive(Debug, Clone, Copy)]
955 pub struct ImageAuxSymbolFunctionBeginEnd
{
956 pub unused1
: [u8; 4],
957 /// declaration line number
958 pub linenumber
: U16Bytes
<LE
>,
959 pub unused2
: [u8; 6],
960 pub pointer_to_next_function
: U32Bytes
<LE
>,
961 pub unused3
: [u8; 2],
964 /// Auxilliary symbol format 3: weak externals.
966 /// Used for both `ImageSymbol` and `ImageSymbolEx` (both with padding).
967 // This struct has alignment 1.
968 #[derive(Debug, Clone, Copy)]
970 pub struct ImageAuxSymbolWeak
{
971 /// the weak extern default symbol index
972 pub weak_default_sym_index
: U32Bytes
<LE
>,
973 pub weak_search_type
: U32Bytes
<LE
>,
976 /// Auxilliary symbol format 5: sections.
978 /// Used for both `ImageSymbol` and `ImageSymbolEx` (with padding).
979 // This struct has alignment 1.
980 #[derive(Debug, Clone, Copy)]
982 pub struct ImageAuxSymbolSection
{
984 pub length
: U32Bytes
<LE
>,
985 /// number of relocation entries
986 pub number_of_relocations
: U16Bytes
<LE
>,
987 /// number of line numbers
988 pub number_of_linenumbers
: U16Bytes
<LE
>,
989 /// checksum for communal
990 pub check_sum
: U32Bytes
<LE
>,
991 /// section number to associate with
992 pub number
: U16Bytes
<LE
>,
993 /// communal selection type
996 /// high bits of the section number
997 pub high_number
: U16Bytes
<LE
>,
1000 // Used for both ImageSymbol and ImageSymbolEx (both with padding).
1001 // This struct has alignment 1.
1002 #[derive(Debug, Clone, Copy)]
1004 pub struct ImageAuxSymbolCrc
{
1005 pub crc
: U32Bytes
<LE
>,
1009 // Communal selection types.
1012 pub const IMAGE_COMDAT_SELECT_NODUPLICATES
: u16 = 1;
1013 pub const IMAGE_COMDAT_SELECT_ANY
: u16 = 2;
1014 pub const IMAGE_COMDAT_SELECT_SAME_SIZE
: u16 = 3;
1015 pub const IMAGE_COMDAT_SELECT_EXACT_MATCH
: u16 = 4;
1016 pub const IMAGE_COMDAT_SELECT_ASSOCIATIVE
: u16 = 5;
1017 pub const IMAGE_COMDAT_SELECT_LARGEST
: u16 = 6;
1018 pub const IMAGE_COMDAT_SELECT_NEWEST
: u16 = 7;
1020 pub const IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY
: u16 = 1;
1021 pub const IMAGE_WEAK_EXTERN_SEARCH_LIBRARY
: u16 = 2;
1022 pub const IMAGE_WEAK_EXTERN_SEARCH_ALIAS
: u16 = 3;
1023 pub const IMAGE_WEAK_EXTERN_ANTI_DEPENDENCY
: u16 = 4;
1026 // Relocation format.
1029 // This struct has alignment 1.
1030 #[derive(Debug, Clone, Copy)]
1032 pub struct ImageRelocation
{
1033 /// Also `RelocCount` when IMAGE_SCN_LNK_NRELOC_OVFL is set
1034 pub virtual_address
: U32Bytes
<LE
>,
1035 pub symbol_table_index
: U32Bytes
<LE
>,
1036 pub typ
: U16Bytes
<LE
>,
1040 // I386 relocation types.
1042 /// Reference is absolute, no relocation is necessary
1043 pub const IMAGE_REL_I386_ABSOLUTE
: u16 = 0x0000;
1044 /// Direct 16-bit reference to the symbols virtual address
1045 pub const IMAGE_REL_I386_DIR16
: u16 = 0x0001;
1046 /// PC-relative 16-bit reference to the symbols virtual address
1047 pub const IMAGE_REL_I386_REL16
: u16 = 0x0002;
1048 /// Direct 32-bit reference to the symbols virtual address
1049 pub const IMAGE_REL_I386_DIR32
: u16 = 0x0006;
1050 /// Direct 32-bit reference to the symbols virtual address, base not included
1051 pub const IMAGE_REL_I386_DIR32NB
: u16 = 0x0007;
1052 /// Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
1053 pub const IMAGE_REL_I386_SEG12
: u16 = 0x0009;
1054 pub const IMAGE_REL_I386_SECTION
: u16 = 0x000A;
1055 pub const IMAGE_REL_I386_SECREL
: u16 = 0x000B;
1057 pub const IMAGE_REL_I386_TOKEN
: u16 = 0x000C;
1058 /// 7 bit offset from base of section containing target
1059 pub const IMAGE_REL_I386_SECREL7
: u16 = 0x000D;
1060 /// PC-relative 32-bit reference to the symbols virtual address
1061 pub const IMAGE_REL_I386_REL32
: u16 = 0x0014;
1064 // MIPS relocation types.
1066 /// Reference is absolute, no relocation is necessary
1067 pub const IMAGE_REL_MIPS_ABSOLUTE
: u16 = 0x0000;
1068 pub const IMAGE_REL_MIPS_REFHALF
: u16 = 0x0001;
1069 pub const IMAGE_REL_MIPS_REFWORD
: u16 = 0x0002;
1070 pub const IMAGE_REL_MIPS_JMPADDR
: u16 = 0x0003;
1071 pub const IMAGE_REL_MIPS_REFHI
: u16 = 0x0004;
1072 pub const IMAGE_REL_MIPS_REFLO
: u16 = 0x0005;
1073 pub const IMAGE_REL_MIPS_GPREL
: u16 = 0x0006;
1074 pub const IMAGE_REL_MIPS_LITERAL
: u16 = 0x0007;
1075 pub const IMAGE_REL_MIPS_SECTION
: u16 = 0x000A;
1076 pub const IMAGE_REL_MIPS_SECREL
: u16 = 0x000B;
1077 /// Low 16-bit section relative referemce (used for >32k TLS)
1078 pub const IMAGE_REL_MIPS_SECRELLO
: u16 = 0x000C;
1079 /// High 16-bit section relative reference (used for >32k TLS)
1080 pub const IMAGE_REL_MIPS_SECRELHI
: u16 = 0x000D;
1082 pub const IMAGE_REL_MIPS_TOKEN
: u16 = 0x000E;
1083 pub const IMAGE_REL_MIPS_JMPADDR16
: u16 = 0x0010;
1084 pub const IMAGE_REL_MIPS_REFWORDNB
: u16 = 0x0022;
1085 pub const IMAGE_REL_MIPS_PAIR
: u16 = 0x0025;
1088 // Alpha Relocation types.
1090 pub const IMAGE_REL_ALPHA_ABSOLUTE
: u16 = 0x0000;
1091 pub const IMAGE_REL_ALPHA_REFLONG
: u16 = 0x0001;
1092 pub const IMAGE_REL_ALPHA_REFQUAD
: u16 = 0x0002;
1093 pub const IMAGE_REL_ALPHA_GPREL32
: u16 = 0x0003;
1094 pub const IMAGE_REL_ALPHA_LITERAL
: u16 = 0x0004;
1095 pub const IMAGE_REL_ALPHA_LITUSE
: u16 = 0x0005;
1096 pub const IMAGE_REL_ALPHA_GPDISP
: u16 = 0x0006;
1097 pub const IMAGE_REL_ALPHA_BRADDR
: u16 = 0x0007;
1098 pub const IMAGE_REL_ALPHA_HINT
: u16 = 0x0008;
1099 pub const IMAGE_REL_ALPHA_INLINE_REFLONG
: u16 = 0x0009;
1100 pub const IMAGE_REL_ALPHA_REFHI
: u16 = 0x000A;
1101 pub const IMAGE_REL_ALPHA_REFLO
: u16 = 0x000B;
1102 pub const IMAGE_REL_ALPHA_PAIR
: u16 = 0x000C;
1103 pub const IMAGE_REL_ALPHA_MATCH
: u16 = 0x000D;
1104 pub const IMAGE_REL_ALPHA_SECTION
: u16 = 0x000E;
1105 pub const IMAGE_REL_ALPHA_SECREL
: u16 = 0x000F;
1106 pub const IMAGE_REL_ALPHA_REFLONGNB
: u16 = 0x0010;
1107 /// Low 16-bit section relative reference
1108 pub const IMAGE_REL_ALPHA_SECRELLO
: u16 = 0x0011;
1109 /// High 16-bit section relative reference
1110 pub const IMAGE_REL_ALPHA_SECRELHI
: u16 = 0x0012;
1111 /// High 16 bits of 48 bit reference
1112 pub const IMAGE_REL_ALPHA_REFQ3
: u16 = 0x0013;
1113 /// Middle 16 bits of 48 bit reference
1114 pub const IMAGE_REL_ALPHA_REFQ2
: u16 = 0x0014;
1115 /// Low 16 bits of 48 bit reference
1116 pub const IMAGE_REL_ALPHA_REFQ1
: u16 = 0x0015;
1117 /// Low 16-bit GP relative reference
1118 pub const IMAGE_REL_ALPHA_GPRELLO
: u16 = 0x0016;
1119 /// High 16-bit GP relative reference
1120 pub const IMAGE_REL_ALPHA_GPRELHI
: u16 = 0x0017;
1123 // IBM PowerPC relocation types.
1126 pub const IMAGE_REL_PPC_ABSOLUTE
: u16 = 0x0000;
1128 pub const IMAGE_REL_PPC_ADDR64
: u16 = 0x0001;
1130 pub const IMAGE_REL_PPC_ADDR32
: u16 = 0x0002;
1131 /// 26-bit address, shifted left 2 (branch absolute)
1132 pub const IMAGE_REL_PPC_ADDR24
: u16 = 0x0003;
1134 pub const IMAGE_REL_PPC_ADDR16
: u16 = 0x0004;
1135 /// 16-bit address, shifted left 2 (load doubleword)
1136 pub const IMAGE_REL_PPC_ADDR14
: u16 = 0x0005;
1137 /// 26-bit PC-relative offset, shifted left 2 (branch relative)
1138 pub const IMAGE_REL_PPC_REL24
: u16 = 0x0006;
1139 /// 16-bit PC-relative offset, shifted left 2 (br cond relative)
1140 pub const IMAGE_REL_PPC_REL14
: u16 = 0x0007;
1141 /// 16-bit offset from TOC base
1142 pub const IMAGE_REL_PPC_TOCREL16
: u16 = 0x0008;
1143 /// 16-bit offset from TOC base, shifted left 2 (load doubleword)
1144 pub const IMAGE_REL_PPC_TOCREL14
: u16 = 0x0009;
1146 /// 32-bit addr w/o image base
1147 pub const IMAGE_REL_PPC_ADDR32NB
: u16 = 0x000A;
1148 /// va of containing section (as in an image sectionhdr)
1149 pub const IMAGE_REL_PPC_SECREL
: u16 = 0x000B;
1150 /// sectionheader number
1151 pub const IMAGE_REL_PPC_SECTION
: u16 = 0x000C;
1152 /// substitute TOC restore instruction iff symbol is glue code
1153 pub const IMAGE_REL_PPC_IFGLUE
: u16 = 0x000D;
1154 /// symbol is glue code; virtual address is TOC restore instruction
1155 pub const IMAGE_REL_PPC_IMGLUE
: u16 = 0x000E;
1156 /// va of containing section (limited to 16 bits)
1157 pub const IMAGE_REL_PPC_SECREL16
: u16 = 0x000F;
1158 pub const IMAGE_REL_PPC_REFHI
: u16 = 0x0010;
1159 pub const IMAGE_REL_PPC_REFLO
: u16 = 0x0011;
1160 pub const IMAGE_REL_PPC_PAIR
: u16 = 0x0012;
1161 /// Low 16-bit section relative reference (used for >32k TLS)
1162 pub const IMAGE_REL_PPC_SECRELLO
: u16 = 0x0013;
1163 /// High 16-bit section relative reference (used for >32k TLS)
1164 pub const IMAGE_REL_PPC_SECRELHI
: u16 = 0x0014;
1165 pub const IMAGE_REL_PPC_GPREL
: u16 = 0x0015;
1167 pub const IMAGE_REL_PPC_TOKEN
: u16 = 0x0016;
1169 /// mask to isolate above values in IMAGE_RELOCATION.Type
1170 pub const IMAGE_REL_PPC_TYPEMASK
: u16 = 0x00FF;
1172 // Flag bits in `ImageRelocation::typ`.
1174 /// subtract reloc value rather than adding it
1175 pub const IMAGE_REL_PPC_NEG
: u16 = 0x0100;
1176 /// fix branch prediction bit to predict branch taken
1177 pub const IMAGE_REL_PPC_BRTAKEN
: u16 = 0x0200;
1178 /// fix branch prediction bit to predict branch not taken
1179 pub const IMAGE_REL_PPC_BRNTAKEN
: u16 = 0x0400;
1180 /// toc slot defined in file (or, data in toc)
1181 pub const IMAGE_REL_PPC_TOCDEFN
: u16 = 0x0800;
1184 // Hitachi SH3 relocation types.
1187 pub const IMAGE_REL_SH3_ABSOLUTE
: u16 = 0x0000;
1189 pub const IMAGE_REL_SH3_DIRECT16
: u16 = 0x0001;
1191 pub const IMAGE_REL_SH3_DIRECT32
: u16 = 0x0002;
1192 /// 8 bit direct, -128..255
1193 pub const IMAGE_REL_SH3_DIRECT8
: u16 = 0x0003;
1194 /// 8 bit direct .W (0 ext.)
1195 pub const IMAGE_REL_SH3_DIRECT8_WORD
: u16 = 0x0004;
1196 /// 8 bit direct .L (0 ext.)
1197 pub const IMAGE_REL_SH3_DIRECT8_LONG
: u16 = 0x0005;
1198 /// 4 bit direct (0 ext.)
1199 pub const IMAGE_REL_SH3_DIRECT4
: u16 = 0x0006;
1200 /// 4 bit direct .W (0 ext.)
1201 pub const IMAGE_REL_SH3_DIRECT4_WORD
: u16 = 0x0007;
1202 /// 4 bit direct .L (0 ext.)
1203 pub const IMAGE_REL_SH3_DIRECT4_LONG
: u16 = 0x0008;
1204 /// 8 bit PC relative .W
1205 pub const IMAGE_REL_SH3_PCREL8_WORD
: u16 = 0x0009;
1206 /// 8 bit PC relative .L
1207 pub const IMAGE_REL_SH3_PCREL8_LONG
: u16 = 0x000A;
1208 /// 12 LSB PC relative .W
1209 pub const IMAGE_REL_SH3_PCREL12_WORD
: u16 = 0x000B;
1210 /// Start of EXE section
1211 pub const IMAGE_REL_SH3_STARTOF_SECTION
: u16 = 0x000C;
1212 /// Size of EXE section
1213 pub const IMAGE_REL_SH3_SIZEOF_SECTION
: u16 = 0x000D;
1214 /// Section table index
1215 pub const IMAGE_REL_SH3_SECTION
: u16 = 0x000E;
1216 /// Offset within section
1217 pub const IMAGE_REL_SH3_SECREL
: u16 = 0x000F;
1218 /// 32 bit direct not based
1219 pub const IMAGE_REL_SH3_DIRECT32_NB
: u16 = 0x0010;
1220 /// GP-relative addressing
1221 pub const IMAGE_REL_SH3_GPREL4_LONG
: u16 = 0x0011;
1223 pub const IMAGE_REL_SH3_TOKEN
: u16 = 0x0012;
1224 /// Offset from current instruction in longwords
1225 /// if not NOMODE, insert the inverse of the low bit at bit 32 to select PTA/PTB
1226 pub const IMAGE_REL_SHM_PCRELPT
: u16 = 0x0013;
1227 /// Low bits of 32-bit address
1228 pub const IMAGE_REL_SHM_REFLO
: u16 = 0x0014;
1229 /// High bits of 32-bit address
1230 pub const IMAGE_REL_SHM_REFHALF
: u16 = 0x0015;
1231 /// Low bits of relative reference
1232 pub const IMAGE_REL_SHM_RELLO
: u16 = 0x0016;
1233 /// High bits of relative reference
1234 pub const IMAGE_REL_SHM_RELHALF
: u16 = 0x0017;
1235 /// offset operand for relocation
1236 pub const IMAGE_REL_SHM_PAIR
: u16 = 0x0018;
1238 /// relocation ignores section mode
1239 pub const IMAGE_REL_SH_NOMODE
: u16 = 0x8000;
1241 /// No relocation required
1242 pub const IMAGE_REL_ARM_ABSOLUTE
: u16 = 0x0000;
1244 pub const IMAGE_REL_ARM_ADDR32
: u16 = 0x0001;
1245 /// 32 bit address w/o image base
1246 pub const IMAGE_REL_ARM_ADDR32NB
: u16 = 0x0002;
1247 /// 24 bit offset << 2 & sign ext.
1248 pub const IMAGE_REL_ARM_BRANCH24
: u16 = 0x0003;
1249 /// Thumb: 2 11 bit offsets
1250 pub const IMAGE_REL_ARM_BRANCH11
: u16 = 0x0004;
1252 pub const IMAGE_REL_ARM_TOKEN
: u16 = 0x0005;
1253 /// GP-relative addressing (ARM)
1254 pub const IMAGE_REL_ARM_GPREL12
: u16 = 0x0006;
1255 /// GP-relative addressing (Thumb)
1256 pub const IMAGE_REL_ARM_GPREL7
: u16 = 0x0007;
1257 pub const IMAGE_REL_ARM_BLX24
: u16 = 0x0008;
1258 pub const IMAGE_REL_ARM_BLX11
: u16 = 0x0009;
1259 /// Section table index
1260 pub const IMAGE_REL_ARM_SECTION
: u16 = 0x000E;
1261 /// Offset within section
1262 pub const IMAGE_REL_ARM_SECREL
: u16 = 0x000F;
1264 pub const IMAGE_REL_ARM_MOV32A
: u16 = 0x0010;
1265 /// ARM: MOVW/MOVT (deprecated)
1266 pub const IMAGE_REL_ARM_MOV32
: u16 = 0x0010;
1267 /// Thumb: MOVW/MOVT
1268 pub const IMAGE_REL_ARM_MOV32T
: u16 = 0x0011;
1269 /// Thumb: MOVW/MOVT (deprecated)
1270 pub const IMAGE_REL_THUMB_MOV32
: u16 = 0x0011;
1271 /// Thumb: 32-bit conditional B
1272 pub const IMAGE_REL_ARM_BRANCH20T
: u16 = 0x0012;
1273 /// Thumb: 32-bit conditional B (deprecated)
1274 pub const IMAGE_REL_THUMB_BRANCH20
: u16 = 0x0012;
1275 /// Thumb: 32-bit B or BL
1276 pub const IMAGE_REL_ARM_BRANCH24T
: u16 = 0x0014;
1277 /// Thumb: 32-bit B or BL (deprecated)
1278 pub const IMAGE_REL_THUMB_BRANCH24
: u16 = 0x0014;
1279 /// Thumb: BLX immediate
1280 pub const IMAGE_REL_ARM_BLX23T
: u16 = 0x0015;
1281 /// Thumb: BLX immediate (deprecated)
1282 pub const IMAGE_REL_THUMB_BLX23
: u16 = 0x0015;
1284 pub const IMAGE_REL_AM_ABSOLUTE
: u16 = 0x0000;
1285 pub const IMAGE_REL_AM_ADDR32
: u16 = 0x0001;
1286 pub const IMAGE_REL_AM_ADDR32NB
: u16 = 0x0002;
1287 pub const IMAGE_REL_AM_CALL32
: u16 = 0x0003;
1288 pub const IMAGE_REL_AM_FUNCINFO
: u16 = 0x0004;
1289 pub const IMAGE_REL_AM_REL32_1
: u16 = 0x0005;
1290 pub const IMAGE_REL_AM_REL32_2
: u16 = 0x0006;
1291 pub const IMAGE_REL_AM_SECREL
: u16 = 0x0007;
1292 pub const IMAGE_REL_AM_SECTION
: u16 = 0x0008;
1293 pub const IMAGE_REL_AM_TOKEN
: u16 = 0x0009;
1296 // ARM64 relocations types.
1299 /// No relocation required
1300 pub const IMAGE_REL_ARM64_ABSOLUTE
: u16 = 0x0000;
1301 /// 32 bit address. Review! do we need it?
1302 pub const IMAGE_REL_ARM64_ADDR32
: u16 = 0x0001;
1303 /// 32 bit address w/o image base (RVA: for Data/PData/XData)
1304 pub const IMAGE_REL_ARM64_ADDR32NB
: u16 = 0x0002;
1305 /// 26 bit offset << 2 & sign ext. for B & BL
1306 pub const IMAGE_REL_ARM64_BRANCH26
: u16 = 0x0003;
1308 pub const IMAGE_REL_ARM64_PAGEBASE_REL21
: u16 = 0x0004;
1310 pub const IMAGE_REL_ARM64_REL21
: u16 = 0x0005;
1311 /// ADD/ADDS (immediate) with zero shift, for page offset
1312 pub const IMAGE_REL_ARM64_PAGEOFFSET_12A
: u16 = 0x0006;
1313 /// LDR (indexed, unsigned immediate), for page offset
1314 pub const IMAGE_REL_ARM64_PAGEOFFSET_12L
: u16 = 0x0007;
1315 /// Offset within section
1316 pub const IMAGE_REL_ARM64_SECREL
: u16 = 0x0008;
1317 /// ADD/ADDS (immediate) with zero shift, for bit 0:11 of section offset
1318 pub const IMAGE_REL_ARM64_SECREL_LOW12A
: u16 = 0x0009;
1319 /// ADD/ADDS (immediate) with zero shift, for bit 12:23 of section offset
1320 pub const IMAGE_REL_ARM64_SECREL_HIGH12A
: u16 = 0x000A;
1321 /// LDR (indexed, unsigned immediate), for bit 0:11 of section offset
1322 pub const IMAGE_REL_ARM64_SECREL_LOW12L
: u16 = 0x000B;
1323 pub const IMAGE_REL_ARM64_TOKEN
: u16 = 0x000C;
1324 /// Section table index
1325 pub const IMAGE_REL_ARM64_SECTION
: u16 = 0x000D;
1327 pub const IMAGE_REL_ARM64_ADDR64
: u16 = 0x000E;
1328 /// 19 bit offset << 2 & sign ext. for conditional B
1329 pub const IMAGE_REL_ARM64_BRANCH19
: u16 = 0x000F;
1334 /// Reference is absolute, no relocation is necessary
1335 pub const IMAGE_REL_AMD64_ABSOLUTE
: u16 = 0x0000;
1336 /// 64-bit address (VA).
1337 pub const IMAGE_REL_AMD64_ADDR64
: u16 = 0x0001;
1338 /// 32-bit address (VA).
1339 pub const IMAGE_REL_AMD64_ADDR32
: u16 = 0x0002;
1340 /// 32-bit address w/o image base (RVA).
1341 pub const IMAGE_REL_AMD64_ADDR32NB
: u16 = 0x0003;
1342 /// 32-bit relative address from byte following reloc
1343 pub const IMAGE_REL_AMD64_REL32
: u16 = 0x0004;
1344 /// 32-bit relative address from byte distance 1 from reloc
1345 pub const IMAGE_REL_AMD64_REL32_1
: u16 = 0x0005;
1346 /// 32-bit relative address from byte distance 2 from reloc
1347 pub const IMAGE_REL_AMD64_REL32_2
: u16 = 0x0006;
1348 /// 32-bit relative address from byte distance 3 from reloc
1349 pub const IMAGE_REL_AMD64_REL32_3
: u16 = 0x0007;
1350 /// 32-bit relative address from byte distance 4 from reloc
1351 pub const IMAGE_REL_AMD64_REL32_4
: u16 = 0x0008;
1352 /// 32-bit relative address from byte distance 5 from reloc
1353 pub const IMAGE_REL_AMD64_REL32_5
: u16 = 0x0009;
1355 pub const IMAGE_REL_AMD64_SECTION
: u16 = 0x000A;
1356 /// 32 bit offset from base of section containing target
1357 pub const IMAGE_REL_AMD64_SECREL
: u16 = 0x000B;
1358 /// 7 bit unsigned offset from base of section containing target
1359 pub const IMAGE_REL_AMD64_SECREL7
: u16 = 0x000C;
1360 /// 32 bit metadata token
1361 pub const IMAGE_REL_AMD64_TOKEN
: u16 = 0x000D;
1362 /// 32 bit signed span-dependent value emitted into object
1363 pub const IMAGE_REL_AMD64_SREL32
: u16 = 0x000E;
1364 pub const IMAGE_REL_AMD64_PAIR
: u16 = 0x000F;
1365 /// 32 bit signed span-dependent value applied at link time
1366 pub const IMAGE_REL_AMD64_SSPAN32
: u16 = 0x0010;
1367 pub const IMAGE_REL_AMD64_EHANDLER
: u16 = 0x0011;
1368 /// Indirect branch to an import
1369 pub const IMAGE_REL_AMD64_IMPORT_BR
: u16 = 0x0012;
1370 /// Indirect call to an import
1371 pub const IMAGE_REL_AMD64_IMPORT_CALL
: u16 = 0x0013;
1372 /// Indirect branch to a CFG check
1373 pub const IMAGE_REL_AMD64_CFG_BR
: u16 = 0x0014;
1374 /// Indirect branch to a CFG check, with REX.W prefix
1375 pub const IMAGE_REL_AMD64_CFG_BR_REX
: u16 = 0x0015;
1376 /// Indirect call to a CFG check
1377 pub const IMAGE_REL_AMD64_CFG_CALL
: u16 = 0x0016;
1378 /// Indirect branch to a target in RAX (no CFG)
1379 pub const IMAGE_REL_AMD64_INDIR_BR
: u16 = 0x0017;
1380 /// Indirect branch to a target in RAX, with REX.W prefix (no CFG)
1381 pub const IMAGE_REL_AMD64_INDIR_BR_REX
: u16 = 0x0018;
1382 /// Indirect call to a target in RAX (no CFG)
1383 pub const IMAGE_REL_AMD64_INDIR_CALL
: u16 = 0x0019;
1384 /// Indirect branch for a switch table using Reg 0 (RAX)
1385 pub const IMAGE_REL_AMD64_INDIR_BR_SWITCHTABLE_FIRST
: u16 = 0x0020;
1386 /// Indirect branch for a switch table using Reg 15 (R15)
1387 pub const IMAGE_REL_AMD64_INDIR_BR_SWITCHTABLE_LAST
: u16 = 0x002F;
1390 // IA64 relocation types.
1392 pub const IMAGE_REL_IA64_ABSOLUTE
: u16 = 0x0000;
1393 pub const IMAGE_REL_IA64_IMM14
: u16 = 0x0001;
1394 pub const IMAGE_REL_IA64_IMM22
: u16 = 0x0002;
1395 pub const IMAGE_REL_IA64_IMM64
: u16 = 0x0003;
1396 pub const IMAGE_REL_IA64_DIR32
: u16 = 0x0004;
1397 pub const IMAGE_REL_IA64_DIR64
: u16 = 0x0005;
1398 pub const IMAGE_REL_IA64_PCREL21B
: u16 = 0x0006;
1399 pub const IMAGE_REL_IA64_PCREL21M
: u16 = 0x0007;
1400 pub const IMAGE_REL_IA64_PCREL21F
: u16 = 0x0008;
1401 pub const IMAGE_REL_IA64_GPREL22
: u16 = 0x0009;
1402 pub const IMAGE_REL_IA64_LTOFF22
: u16 = 0x000A;
1403 pub const IMAGE_REL_IA64_SECTION
: u16 = 0x000B;
1404 pub const IMAGE_REL_IA64_SECREL22
: u16 = 0x000C;
1405 pub const IMAGE_REL_IA64_SECREL64I
: u16 = 0x000D;
1406 pub const IMAGE_REL_IA64_SECREL32
: u16 = 0x000E;
1408 pub const IMAGE_REL_IA64_DIR32NB
: u16 = 0x0010;
1409 pub const IMAGE_REL_IA64_SREL14
: u16 = 0x0011;
1410 pub const IMAGE_REL_IA64_SREL22
: u16 = 0x0012;
1411 pub const IMAGE_REL_IA64_SREL32
: u16 = 0x0013;
1412 pub const IMAGE_REL_IA64_UREL32
: u16 = 0x0014;
1413 /// This is always a BRL and never converted
1414 pub const IMAGE_REL_IA64_PCREL60X
: u16 = 0x0015;
1415 /// If possible, convert to MBB bundle with NOP.B in slot 1
1416 pub const IMAGE_REL_IA64_PCREL60B
: u16 = 0x0016;
1417 /// If possible, convert to MFB bundle with NOP.F in slot 1
1418 pub const IMAGE_REL_IA64_PCREL60F
: u16 = 0x0017;
1419 /// If possible, convert to MIB bundle with NOP.I in slot 1
1420 pub const IMAGE_REL_IA64_PCREL60I
: u16 = 0x0018;
1421 /// If possible, convert to MMB bundle with NOP.M in slot 1
1422 pub const IMAGE_REL_IA64_PCREL60M
: u16 = 0x0019;
1423 pub const IMAGE_REL_IA64_IMMGPREL64
: u16 = 0x001A;
1425 pub const IMAGE_REL_IA64_TOKEN
: u16 = 0x001B;
1426 pub const IMAGE_REL_IA64_GPREL32
: u16 = 0x001C;
1427 pub const IMAGE_REL_IA64_ADDEND
: u16 = 0x001F;
1430 // CEF relocation types.
1432 /// Reference is absolute, no relocation is necessary
1433 pub const IMAGE_REL_CEF_ABSOLUTE
: u16 = 0x0000;
1434 /// 32-bit address (VA).
1435 pub const IMAGE_REL_CEF_ADDR32
: u16 = 0x0001;
1436 /// 64-bit address (VA).
1437 pub const IMAGE_REL_CEF_ADDR64
: u16 = 0x0002;
1438 /// 32-bit address w/o image base (RVA).
1439 pub const IMAGE_REL_CEF_ADDR32NB
: u16 = 0x0003;
1441 pub const IMAGE_REL_CEF_SECTION
: u16 = 0x0004;
1442 /// 32 bit offset from base of section containing target
1443 pub const IMAGE_REL_CEF_SECREL
: u16 = 0x0005;
1444 /// 32 bit metadata token
1445 pub const IMAGE_REL_CEF_TOKEN
: u16 = 0x0006;
1448 // clr relocation types.
1450 /// Reference is absolute, no relocation is necessary
1451 pub const IMAGE_REL_CEE_ABSOLUTE
: u16 = 0x0000;
1452 /// 32-bit address (VA).
1453 pub const IMAGE_REL_CEE_ADDR32
: u16 = 0x0001;
1454 /// 64-bit address (VA).
1455 pub const IMAGE_REL_CEE_ADDR64
: u16 = 0x0002;
1456 /// 32-bit address w/o image base (RVA).
1457 pub const IMAGE_REL_CEE_ADDR32NB
: u16 = 0x0003;
1459 pub const IMAGE_REL_CEE_SECTION
: u16 = 0x0004;
1460 /// 32 bit offset from base of section containing target
1461 pub const IMAGE_REL_CEE_SECREL
: u16 = 0x0005;
1462 /// 32 bit metadata token
1463 pub const IMAGE_REL_CEE_TOKEN
: u16 = 0x0006;
1465 /// No relocation required
1466 pub const IMAGE_REL_M32R_ABSOLUTE
: u16 = 0x0000;
1468 pub const IMAGE_REL_M32R_ADDR32
: u16 = 0x0001;
1469 /// 32 bit address w/o image base
1470 pub const IMAGE_REL_M32R_ADDR32NB
: u16 = 0x0002;
1472 pub const IMAGE_REL_M32R_ADDR24
: u16 = 0x0003;
1473 /// GP relative addressing
1474 pub const IMAGE_REL_M32R_GPREL16
: u16 = 0x0004;
1475 /// 24 bit offset << 2 & sign ext.
1476 pub const IMAGE_REL_M32R_PCREL24
: u16 = 0x0005;
1477 /// 16 bit offset << 2 & sign ext.
1478 pub const IMAGE_REL_M32R_PCREL16
: u16 = 0x0006;
1479 /// 8 bit offset << 2 & sign ext.
1480 pub const IMAGE_REL_M32R_PCREL8
: u16 = 0x0007;
1482 pub const IMAGE_REL_M32R_REFHALF
: u16 = 0x0008;
1483 /// 16 MSBs; adj for LSB sign ext.
1484 pub const IMAGE_REL_M32R_REFHI
: u16 = 0x0009;
1486 pub const IMAGE_REL_M32R_REFLO
: u16 = 0x000A;
1488 pub const IMAGE_REL_M32R_PAIR
: u16 = 0x000B;
1489 /// Section table index
1490 pub const IMAGE_REL_M32R_SECTION
: u16 = 0x000C;
1491 /// 32 bit section relative reference
1492 pub const IMAGE_REL_M32R_SECREL32
: u16 = 0x000D;
1494 pub const IMAGE_REL_M32R_TOKEN
: u16 = 0x000E;
1496 /// No relocation required
1497 pub const IMAGE_REL_EBC_ABSOLUTE
: u16 = 0x0000;
1498 /// 32 bit address w/o image base
1499 pub const IMAGE_REL_EBC_ADDR32NB
: u16 = 0x0001;
1500 /// 32-bit relative address from byte following reloc
1501 pub const IMAGE_REL_EBC_REL32
: u16 = 0x0002;
1502 /// Section table index
1503 pub const IMAGE_REL_EBC_SECTION
: u16 = 0x0003;
1504 /// Offset within section
1505 pub const IMAGE_REL_EBC_SECREL
: u16 = 0x0004;
1509 #define EXT_IMM64(Value, Address, Size, InstPos, ValPos) /* Intel-IA64-Filler */ \
1510 Value |= (((ULONGLONG)((*(Address) >> InstPos) & (((ULONGLONG)1 << Size) - 1))) << ValPos) // Intel-IA64-Filler
1512 #define INS_IMM64(Value, Address, Size, InstPos, ValPos) /* Intel-IA64-Filler */\
1513 *(PDWORD)Address = (*(PDWORD)Address & ~(((1 << Size) - 1) << InstPos)) | /* Intel-IA64-Filler */\
1514 ((DWORD)((((ULONGLONG)Value >> ValPos) & (((ULONGLONG)1 << Size) - 1))) << InstPos) // Intel-IA64-Filler
1517 /// Intel-IA64-Filler
1518 pub const EMARCH_ENC_I17_IMM7B_INST_WORD_X
: u16 = 3;
1519 /// Intel-IA64-Filler
1520 pub const EMARCH_ENC_I17_IMM7B_SIZE_X
: u16 = 7;
1521 /// Intel-IA64-Filler
1522 pub const EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X
: u16 = 4;
1523 /// Intel-IA64-Filler
1524 pub const EMARCH_ENC_I17_IMM7B_VAL_POS_X
: u16 = 0;
1526 /// Intel-IA64-Filler
1527 pub const EMARCH_ENC_I17_IMM9D_INST_WORD_X
: u16 = 3;
1528 /// Intel-IA64-Filler
1529 pub const EMARCH_ENC_I17_IMM9D_SIZE_X
: u16 = 9;
1530 /// Intel-IA64-Filler
1531 pub const EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X
: u16 = 18;
1532 /// Intel-IA64-Filler
1533 pub const EMARCH_ENC_I17_IMM9D_VAL_POS_X
: u16 = 7;
1535 /// Intel-IA64-Filler
1536 pub const EMARCH_ENC_I17_IMM5C_INST_WORD_X
: u16 = 3;
1537 /// Intel-IA64-Filler
1538 pub const EMARCH_ENC_I17_IMM5C_SIZE_X
: u16 = 5;
1539 /// Intel-IA64-Filler
1540 pub const EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X
: u16 = 13;
1541 /// Intel-IA64-Filler
1542 pub const EMARCH_ENC_I17_IMM5C_VAL_POS_X
: u16 = 16;
1544 /// Intel-IA64-Filler
1545 pub const EMARCH_ENC_I17_IC_INST_WORD_X
: u16 = 3;
1546 /// Intel-IA64-Filler
1547 pub const EMARCH_ENC_I17_IC_SIZE_X
: u16 = 1;
1548 /// Intel-IA64-Filler
1549 pub const EMARCH_ENC_I17_IC_INST_WORD_POS_X
: u16 = 12;
1550 /// Intel-IA64-Filler
1551 pub const EMARCH_ENC_I17_IC_VAL_POS_X
: u16 = 21;
1553 /// Intel-IA64-Filler
1554 pub const EMARCH_ENC_I17_IMM41A_INST_WORD_X
: u16 = 1;
1555 /// Intel-IA64-Filler
1556 pub const EMARCH_ENC_I17_IMM41A_SIZE_X
: u16 = 10;
1557 /// Intel-IA64-Filler
1558 pub const EMARCH_ENC_I17_IMM41A_INST_WORD_POS_X
: u16 = 14;
1559 /// Intel-IA64-Filler
1560 pub const EMARCH_ENC_I17_IMM41A_VAL_POS_X
: u16 = 22;
1562 /// Intel-IA64-Filler
1563 pub const EMARCH_ENC_I17_IMM41B_INST_WORD_X
: u16 = 1;
1564 /// Intel-IA64-Filler
1565 pub const EMARCH_ENC_I17_IMM41B_SIZE_X
: u16 = 8;
1566 /// Intel-IA64-Filler
1567 pub const EMARCH_ENC_I17_IMM41B_INST_WORD_POS_X
: u16 = 24;
1568 /// Intel-IA64-Filler
1569 pub const EMARCH_ENC_I17_IMM41B_VAL_POS_X
: u16 = 32;
1571 /// Intel-IA64-Filler
1572 pub const EMARCH_ENC_I17_IMM41C_INST_WORD_X
: u16 = 2;
1573 /// Intel-IA64-Filler
1574 pub const EMARCH_ENC_I17_IMM41C_SIZE_X
: u16 = 23;
1575 /// Intel-IA64-Filler
1576 pub const EMARCH_ENC_I17_IMM41C_INST_WORD_POS_X
: u16 = 0;
1577 /// Intel-IA64-Filler
1578 pub const EMARCH_ENC_I17_IMM41C_VAL_POS_X
: u16 = 40;
1580 /// Intel-IA64-Filler
1581 pub const EMARCH_ENC_I17_SIGN_INST_WORD_X
: u16 = 3;
1582 /// Intel-IA64-Filler
1583 pub const EMARCH_ENC_I17_SIGN_SIZE_X
: u16 = 1;
1584 /// Intel-IA64-Filler
1585 pub const EMARCH_ENC_I17_SIGN_INST_WORD_POS_X
: u16 = 27;
1586 /// Intel-IA64-Filler
1587 pub const EMARCH_ENC_I17_SIGN_VAL_POS_X
: u16 = 63;
1589 /// Intel-IA64-Filler
1590 pub const X3_OPCODE_INST_WORD_X
: u16 = 3;
1591 /// Intel-IA64-Filler
1592 pub const X3_OPCODE_SIZE_X
: u16 = 4;
1593 /// Intel-IA64-Filler
1594 pub const X3_OPCODE_INST_WORD_POS_X
: u16 = 28;
1595 /// Intel-IA64-Filler
1596 pub const X3_OPCODE_SIGN_VAL_POS_X
: u16 = 0;
1598 /// Intel-IA64-Filler
1599 pub const X3_I_INST_WORD_X
: u16 = 3;
1600 /// Intel-IA64-Filler
1601 pub const X3_I_SIZE_X
: u16 = 1;
1602 /// Intel-IA64-Filler
1603 pub const X3_I_INST_WORD_POS_X
: u16 = 27;
1604 /// Intel-IA64-Filler
1605 pub const X3_I_SIGN_VAL_POS_X
: u16 = 59;
1607 /// Intel-IA64-Filler
1608 pub const X3_D_WH_INST_WORD_X
: u16 = 3;
1609 /// Intel-IA64-Filler
1610 pub const X3_D_WH_SIZE_X
: u16 = 3;
1611 /// Intel-IA64-Filler
1612 pub const X3_D_WH_INST_WORD_POS_X
: u16 = 24;
1613 /// Intel-IA64-Filler
1614 pub const X3_D_WH_SIGN_VAL_POS_X
: u16 = 0;
1616 /// Intel-IA64-Filler
1617 pub const X3_IMM20_INST_WORD_X
: u16 = 3;
1618 /// Intel-IA64-Filler
1619 pub const X3_IMM20_SIZE_X
: u16 = 20;
1620 /// Intel-IA64-Filler
1621 pub const X3_IMM20_INST_WORD_POS_X
: u16 = 4;
1622 /// Intel-IA64-Filler
1623 pub const X3_IMM20_SIGN_VAL_POS_X
: u16 = 0;
1625 /// Intel-IA64-Filler
1626 pub const X3_IMM39_1_INST_WORD_X
: u16 = 2;
1627 /// Intel-IA64-Filler
1628 pub const X3_IMM39_1_SIZE_X
: u16 = 23;
1629 /// Intel-IA64-Filler
1630 pub const X3_IMM39_1_INST_WORD_POS_X
: u16 = 0;
1631 /// Intel-IA64-Filler
1632 pub const X3_IMM39_1_SIGN_VAL_POS_X
: u16 = 36;
1634 /// Intel-IA64-Filler
1635 pub const X3_IMM39_2_INST_WORD_X
: u16 = 1;
1636 /// Intel-IA64-Filler
1637 pub const X3_IMM39_2_SIZE_X
: u16 = 16;
1638 /// Intel-IA64-Filler
1639 pub const X3_IMM39_2_INST_WORD_POS_X
: u16 = 16;
1640 /// Intel-IA64-Filler
1641 pub const X3_IMM39_2_SIGN_VAL_POS_X
: u16 = 20;
1643 /// Intel-IA64-Filler
1644 pub const X3_P_INST_WORD_X
: u16 = 3;
1645 /// Intel-IA64-Filler
1646 pub const X3_P_SIZE_X
: u16 = 4;
1647 /// Intel-IA64-Filler
1648 pub const X3_P_INST_WORD_POS_X
: u16 = 0;
1649 /// Intel-IA64-Filler
1650 pub const X3_P_SIGN_VAL_POS_X
: u16 = 0;
1652 /// Intel-IA64-Filler
1653 pub const X3_TMPLT_INST_WORD_X
: u16 = 0;
1654 /// Intel-IA64-Filler
1655 pub const X3_TMPLT_SIZE_X
: u16 = 4;
1656 /// Intel-IA64-Filler
1657 pub const X3_TMPLT_INST_WORD_POS_X
: u16 = 0;
1658 /// Intel-IA64-Filler
1659 pub const X3_TMPLT_SIGN_VAL_POS_X
: u16 = 0;
1661 /// Intel-IA64-Filler
1662 pub const X3_BTYPE_QP_INST_WORD_X
: u16 = 2;
1663 /// Intel-IA64-Filler
1664 pub const X3_BTYPE_QP_SIZE_X
: u16 = 9;
1665 /// Intel-IA64-Filler
1666 pub const X3_BTYPE_QP_INST_WORD_POS_X
: u16 = 23;
1667 /// Intel-IA64-Filler
1668 pub const X3_BTYPE_QP_INST_VAL_POS_X
: u16 = 0;
1670 /// Intel-IA64-Filler
1671 pub const X3_EMPTY_INST_WORD_X
: u16 = 1;
1672 /// Intel-IA64-Filler
1673 pub const X3_EMPTY_SIZE_X
: u16 = 2;
1674 /// Intel-IA64-Filler
1675 pub const X3_EMPTY_INST_WORD_POS_X
: u16 = 14;
1676 /// Intel-IA64-Filler
1677 pub const X3_EMPTY_INST_VAL_POS_X
: u16 = 0;
1680 // Line number format.
1683 // This struct has alignment 1.
1684 #[derive(Debug, Clone, Copy)]
1686 pub struct ImageLinenumber
{
1687 /// Symbol table index of function name if Linenumber is 0.
1688 /// Otherwise virtual address of line number.
1689 pub symbol_table_index_or_virtual_address
: U32Bytes
<LE
>,
1691 pub linenumber
: U16Bytes
<LE
>,
1695 // Based relocation format.
1698 // This struct has alignment 1.
1699 #[derive(Debug, Clone, Copy)]
1701 pub struct ImageBaseRelocation
{
1702 pub virtual_address
: U32Bytes
<LE
>,
1703 pub size_of_block
: U32Bytes
<LE
>,
1704 // pub type_offset[1]: U16<LE>,
1708 // Based relocation types.
1711 pub const IMAGE_REL_BASED_ABSOLUTE
: u16 = 0;
1712 pub const IMAGE_REL_BASED_HIGH
: u16 = 1;
1713 pub const IMAGE_REL_BASED_LOW
: u16 = 2;
1714 pub const IMAGE_REL_BASED_HIGHLOW
: u16 = 3;
1715 pub const IMAGE_REL_BASED_HIGHADJ
: u16 = 4;
1716 pub const IMAGE_REL_BASED_MACHINE_SPECIFIC_5
: u16 = 5;
1717 pub const IMAGE_REL_BASED_RESERVED
: u16 = 6;
1718 pub const IMAGE_REL_BASED_MACHINE_SPECIFIC_7
: u16 = 7;
1719 pub const IMAGE_REL_BASED_MACHINE_SPECIFIC_8
: u16 = 8;
1720 pub const IMAGE_REL_BASED_MACHINE_SPECIFIC_9
: u16 = 9;
1721 pub const IMAGE_REL_BASED_DIR64
: u16 = 10;
1724 // Platform-specific based relocation types.
1727 pub const IMAGE_REL_BASED_IA64_IMM64
: u16 = 9;
1729 pub const IMAGE_REL_BASED_MIPS_JMPADDR
: u16 = 5;
1730 pub const IMAGE_REL_BASED_MIPS_JMPADDR16
: u16 = 9;
1732 pub const IMAGE_REL_BASED_ARM_MOV32
: u16 = 5;
1733 pub const IMAGE_REL_BASED_THUMB_MOV32
: u16 = 7;
1739 pub const IMAGE_ARCHIVE_START_SIZE
: usize = 8;
1740 pub const IMAGE_ARCHIVE_START
: &[u8; 8] = b
"!<arch>\n";
1741 pub const IMAGE_ARCHIVE_END
: &[u8] = b
"`\n";
1742 pub const IMAGE_ARCHIVE_PAD
: &[u8] = b
"\n";
1743 pub const IMAGE_ARCHIVE_LINKER_MEMBER
: &[u8; 16] = b
"/ ";
1744 pub const IMAGE_ARCHIVE_LONGNAMES_MEMBER
: &[u8; 16] = b
"// ";
1745 pub const IMAGE_ARCHIVE_HYBRIDMAP_MEMBER
: &[u8; 16] = b
"/<HYBRIDMAP>/ ";
1747 #[derive(Debug, Clone, Copy)]
1749 pub struct ImageArchiveMemberHeader
{
1750 /// File member name - `/' terminated.
1752 /// File member date - decimal.
1754 /// File member user id - decimal.
1755 pub user_id
: [u8; 6],
1756 /// File member group id - decimal.
1757 pub group_id
: [u8; 6],
1758 /// File member mode - octal.
1760 /// File member size - decimal.
1762 /// String to end header.
1763 pub end_header
: [u8; 2],
1766 pub const IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR
: u16 = 60;
1776 #[derive(Debug, Clone, Copy)]
1778 pub struct ImageExportDirectory
{
1779 pub characteristics
: U32
<LE
>,
1780 pub time_date_stamp
: U32
<LE
>,
1781 pub major_version
: U16
<LE
>,
1782 pub minor_version
: U16
<LE
>,
1785 pub number_of_functions
: U32
<LE
>,
1786 pub number_of_names
: U32
<LE
>,
1787 /// RVA from base of image
1788 pub address_of_functions
: U32
<LE
>,
1789 /// RVA from base of image
1790 pub address_of_names
: U32
<LE
>,
1791 /// RVA from base of image
1792 pub address_of_name_ordinals
: U32
<LE
>,
1799 #[derive(Debug, Clone, Copy)]
1801 pub struct ImageImportByName
{
1803 //pub name: [i8; 1],
1809 #[derive(Debug, Clone, Copy)]
1811 pub struct ImageThunkData64 {
1814 pub forwarder_string: U64<LE>,
1816 pub function: U64<LE>,
1817 pub ordinal: U64<LE>,
1818 /// PIMAGE_IMPORT_BY_NAME
1819 pub address_of_data: U64<LE>,
1823 #[derive(Debug, Clone, Copy)]
1825 pub struct ImageThunkData32 {
1828 pub forwarder_string: U32<LE>,
1830 pub function: U32<LE>,
1831 pub ordinal: U32<LE>,
1832 /// PIMAGE_IMPORT_BY_NAME
1833 pub address_of_data: U32<LE>,
1837 pub const IMAGE_ORDINAL_FLAG64: u64 = 0x8000000000000000;
1838 pub const IMAGE_ORDINAL_FLAG32: u32 = 0x80000000;
1839 #define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffff)
1840 #define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)
1841 #define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64) != 0)
1842 #define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32) != 0)
1847 // Thread Local Storage
1850 #[derive(Debug, Clone, Copy)]
1852 pub struct ImageTlsDirectory64
{
1853 pub start_address_of_raw_data
: U64
<LE
>,
1854 pub end_address_of_raw_data
: U64
<LE
>,
1856 pub address_of_index
: U64
<LE
>,
1857 /// PIMAGE_TLS_CALLBACK *;
1858 pub address_of_call_backs
: U64
<LE
>,
1859 pub size_of_zero_fill
: U32
<LE
>,
1860 pub characteristics
: U32
<LE
>,
1863 #[derive(Debug, Clone, Copy)]
1865 pub struct ImageTlsDirectory32
{
1866 pub start_address_of_raw_data
: U32
<LE
>,
1867 pub end_address_of_raw_data
: U32
<LE
>,
1869 pub address_of_index
: U32
<LE
>,
1870 /// PIMAGE_TLS_CALLBACK *
1871 pub address_of_call_backs
: U32
<LE
>,
1872 pub size_of_zero_fill
: U32
<LE
>,
1873 pub characteristics
: U32
<LE
>,
1877 #[derive(Debug, Clone, Copy)]
1879 pub struct ImageImportDescriptor
{
1880 /// 0 for terminating null import descriptor
1881 /// RVA to original unbound IAT (PIMAGE_THUNK_DATA)
1882 pub characteristics_or_original_first_thunk
: U32
<LE
>,
1883 pub original_first_thunk
: U32
<LE
>,
1885 /// -1 if bound, and real date\time stamp
1886 /// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
1887 /// O.W. date/time stamp of DLL bound to (Old BIND)
1888 pub time_date_stamp
: U32
<LE
>,
1890 /// -1 if no forwarders
1891 pub forwarder_chain
: U32
<LE
>,
1893 /// RVA to IAT (if bound this IAT has actual addresses)
1894 pub first_thunk
: U32
<LE
>,
1898 // New format import descriptors pointed to by DataDirectory[ IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ]
1901 #[derive(Debug, Clone, Copy)]
1903 pub struct ImageBoundImportDescriptor
{
1904 pub time_date_stamp
: U32
<LE
>,
1905 pub offset_module_name
: U16
<LE
>,
1906 pub number_of_module_forwarder_refs
: U16
<LE
>,
1907 // Array of zero or more IMAGE_BOUND_FORWARDER_REF follows
1910 #[derive(Debug, Clone, Copy)]
1912 pub struct ImageBoundForwarderRef
{
1913 pub time_date_stamp
: U32
<LE
>,
1914 pub offset_module_name
: U16
<LE
>,
1915 pub reserved
: U16
<LE
>,
1918 #[derive(Debug, Clone, Copy)]
1920 pub struct ImageDelayloadDescriptor
{
1921 pub attributes
: U32
<LE
>,
1923 /// RVA to the name of the target library (NULL-terminate ASCII string)
1924 pub dll_name_rva
: U32
<LE
>,
1925 /// RVA to the HMODULE caching location (PHMODULE)
1926 pub module_handle_rva
: U32
<LE
>,
1927 /// RVA to the start of the IAT (PIMAGE_THUNK_DATA)
1928 pub import_address_table_rva
: U32
<LE
>,
1929 /// RVA to the start of the name table (PIMAGE_THUNK_DATA::AddressOfData)
1930 pub import_name_table_rva
: U32
<LE
>,
1931 /// RVA to an optional bound IAT
1932 pub bound_import_address_table_rva
: U32
<LE
>,
1933 /// RVA to an optional unload info table
1934 pub unload_information_table_rva
: U32
<LE
>,
1935 /// 0 if not bound, otherwise, date/time of the target DLL
1936 pub time_date_stamp
: U32
<LE
>,
1939 /// Delay load version 2 flag for `ImageDelayloadDescriptor::attributes`.
1940 pub const IMAGE_DELAYLOAD_RVA_BASED
: u32 = 0x8000_0000;
1947 // Resource directory consists of two counts, following by a variable length
1948 // array of directory entries. The first count is the number of entries at
1949 // beginning of the array that have actual names associated with each entry.
1950 // The entries are in ascending order, case insensitive strings. The second
1951 // count is the number of entries that immediately follow the named entries.
1952 // This second count identifies the number of entries that have 16-bit integer
1953 // Ids as their name. These entries are also sorted in ascending order.
1955 // This structure allows fast lookup by either name or number, but for any
1956 // given resource entry only one form of lookup is supported, not both.
1957 // This is consistant with the syntax of the .RC file and the .RES file.
1960 #[derive(Debug, Clone, Copy)]
1962 pub struct ImageResourceDirectory
{
1963 pub characteristics
: U32
<LE
>,
1964 pub time_date_stamp
: U32
<LE
>,
1965 pub major_version
: U16
<LE
>,
1966 pub minor_version
: U16
<LE
>,
1967 pub number_of_named_entries
: U16
<LE
>,
1968 pub number_of_id_entries
: U16
<LE
>,
1969 // DirectoryEntries[ImageResourceDirectoryEntry];
1972 pub const IMAGE_RESOURCE_NAME_IS_STRING
: u32 = 0x8000_0000;
1973 pub const IMAGE_RESOURCE_DATA_IS_DIRECTORY
: u32 = 0x8000_0000;
1975 // Each directory contains the 32-bit Name of the entry and an offset,
1976 // relative to the beginning of the resource directory of the data associated
1977 // with this directory entry. If the name of the entry is an actual text
1978 // string instead of an integer Id, then the high order bit of the name field
1979 // is set to one and the low order 31-bits are an offset, relative to the
1980 // beginning of the resource directory of the string, which is of type
1981 // IMAGE_RESOURCE_DIRECTORY_STRING. Otherwise the high bit is clear and the
1982 // low-order 16-bits are the integer Id that identify this resource directory
1983 // entry. If the directory entry is yet another resource directory (i.e. a
1984 // subdirectory), then the high order bit of the offset field will be
1985 // set to indicate this. Otherwise the high bit is clear and the offset
1986 // field points to a resource data entry.
1989 #[derive(Debug, Clone, Copy)]
1991 pub struct ImageResourceDirectoryEntry
{
1992 pub name_or_id
: U32
<LE
>,
1993 pub offset_to_data_or_directory
: U32
<LE
>,
1997 // For resource directory entries that have actual string names, the Name
1998 // field of the directory entry points to an object of the following type.
1999 // All of these string objects are stored together after the last resource
2000 // directory entry and before the first resource data object. This minimizes
2001 // the impact of these variable length objects on the alignment of the fixed
2002 // size directory entry objects.
2005 #[derive(Debug, Clone, Copy)]
2007 pub struct ImageResourceDirectoryString
{
2008 pub length
: U16
<LE
>,
2009 //pub name_string: [i8; 1],
2012 #[derive(Debug, Clone, Copy)]
2014 pub struct ImageResourceDirStringU
{
2015 pub length
: U16
<LE
>,
2016 //pub name_string: [U16<LE>; 1],
2020 // Each resource data entry describes a leaf node in the resource directory
2021 // tree. It contains an offset, relative to the beginning of the resource
2022 // directory of the data for the resource, a size field that gives the number
2023 // of bytes of data at that offset, a CodePage that should be used when
2024 // decoding code point values within the resource data. Typically for new
2025 // applications the code page would be the unicode code page.
2028 #[derive(Debug, Clone, Copy)]
2030 pub struct ImageResourceDataEntry
{
2031 pub offset_to_data
: U32
<LE
>,
2033 pub code_page
: U32
<LE
>,
2034 pub reserved
: U32
<LE
>,
2038 // Code Integrity in loadconfig (CI)
2041 #[derive(Debug, Clone, Copy)]
2043 pub struct ImageLoadConfigCodeIntegrity
{
2044 /// Flags to indicate if CI information is available, etc.
2046 /// 0xFFFF means not available
2047 pub catalog
: U16
<LE
>,
2048 pub catalog_offset
: U32
<LE
>,
2049 /// Additional bitmask to be defined later
2050 pub reserved
: U32
<LE
>,
2054 // Dynamic value relocation table in loadconfig
2057 #[derive(Debug, Clone, Copy)]
2059 pub struct ImageDynamicRelocationTable
{
2060 pub version
: U32
<LE
>,
2062 // DynamicRelocations: [ImageDynamicRelocation; 0],
2066 // Dynamic value relocation entries following IMAGE_DYNAMIC_RELOCATION_TABLE
2069 #[derive(Debug, Clone, Copy)]
2071 pub struct ImageDynamicRelocation32
{
2072 pub symbol
: U32
<LE
>,
2073 pub base_reloc_size
: U32
<LE
>,
2074 // BaseRelocations: [ImageBaseRelocation; 0],
2077 #[derive(Debug, Clone, Copy)]
2079 pub struct ImageDynamicRelocation64
{
2080 pub symbol
: U64
<LE
>,
2081 pub base_reloc_size
: U32
<LE
>,
2082 // BaseRelocations: [ImageBaseRelocation; 0],
2085 #[derive(Debug, Clone, Copy)]
2087 pub struct ImageDynamicRelocation32V2
{
2088 pub header_size
: U32
<LE
>,
2089 pub fixup_info_size
: U32
<LE
>,
2090 pub symbol
: U32
<LE
>,
2091 pub symbol_group
: U32
<LE
>,
2093 // ... variable length header fields
2094 // pub fixup_info: [u8; fixup_info_size]
2097 #[derive(Debug, Clone, Copy)]
2099 pub struct ImageDynamicRelocation64V2
{
2100 pub header_size
: U32
<LE
>,
2101 pub fixup_info_size
: U32
<LE
>,
2102 pub symbol
: U64
<LE
>,
2103 pub symbol_group
: U32
<LE
>,
2105 // ... variable length header fields
2106 // pub fixup_info[u8; fixup_info_size]
2110 // Defined symbolic dynamic relocation entries.
2113 pub const IMAGE_DYNAMIC_RELOCATION_GUARD_RF_PROLOGUE
: u32 = 0x0000_0001;
2114 pub const IMAGE_DYNAMIC_RELOCATION_GUARD_RF_EPILOGUE
: u32 = 0x0000_0002;
2115 pub const IMAGE_DYNAMIC_RELOCATION_GUARD_IMPORT_CONTROL_TRANSFER
: u32 = 0x0000_0003;
2116 pub const IMAGE_DYNAMIC_RELOCATION_GUARD_INDIR_CONTROL_TRANSFER
: u32 = 0x0000_0004;
2117 pub const IMAGE_DYNAMIC_RELOCATION_GUARD_SWITCHTABLE_BRANCH
: u32 = 0x0000_0005;
2119 // This struct has alignment 1.
2120 #[derive(Debug, Clone, Copy)]
2122 pub struct ImagePrologueDynamicRelocationHeader
{
2123 pub prologue_byte_count
: u8,
2124 // pub prologue_bytes: [u8; prologue_byte_count],
2127 // This struct has alignment 1.
2128 #[derive(Debug, Clone, Copy)]
2130 pub struct ImageEpilogueDynamicRelocationHeader
{
2131 pub epilogue_count
: U32Bytes
<LE
>,
2132 pub epilogue_byte_count
: u8,
2133 pub branch_descriptor_element_size
: u8,
2134 pub branch_descriptor_count
: U16Bytes
<LE
>,
2135 // pub branch_descriptors[...],
2136 // pub branch_descriptor_bit_map[...],
2142 #[derive(Debug, Clone, Copy)]
2144 pub struct ImageImportControlTransferDynamicRelocation {
2145 DWORD PageRelativeOffset : 12;
2146 DWORD IndirectCall : 1;
2147 DWORD IATIndex : 19;
2151 #[derive(Debug, Clone, Copy)]
2153 pub struct ImageIndirControlTransferDynamicRelocation {
2154 WORD PageRelativeOffset : 12;
2155 WORD IndirectCall : 1;
2156 WORD RexWPrefix : 1;
2162 #[derive(Debug, Clone, Copy)]
2164 pub struct ImageSwitchtableBranchDynamicRelocation {
2165 WORD PageRelativeOffset : 12;
2166 WORD RegisterNumber : 4;
2171 // Load Configuration Directory Entry
2174 #[derive(Debug, Clone, Copy)]
2176 pub struct ImageLoadConfigDirectory32
{
2178 pub time_date_stamp
: U32
<LE
>,
2179 pub major_version
: U16
<LE
>,
2180 pub minor_version
: U16
<LE
>,
2181 pub global_flags_clear
: U32
<LE
>,
2182 pub global_flags_set
: U32
<LE
>,
2183 pub critical_section_default_timeout
: U32
<LE
>,
2184 pub de_commit_free_block_threshold
: U32
<LE
>,
2185 pub de_commit_total_free_threshold
: U32
<LE
>,
2187 pub lock_prefix_table
: U32
<LE
>,
2188 pub maximum_allocation_size
: U32
<LE
>,
2189 pub virtual_memory_threshold
: U32
<LE
>,
2190 pub process_heap_flags
: U32
<LE
>,
2191 pub process_affinity_mask
: U32
<LE
>,
2192 pub csd_version
: U16
<LE
>,
2193 pub dependent_load_flags
: U16
<LE
>,
2195 pub edit_list
: U32
<LE
>,
2197 pub security_cookie
: U32
<LE
>,
2199 pub sehandler_table
: U32
<LE
>,
2200 pub sehandler_count
: U32
<LE
>,
2202 pub guard_cf_check_function_pointer
: U32
<LE
>,
2204 pub guard_cf_dispatch_function_pointer
: U32
<LE
>,
2206 pub guard_cf_function_table
: U32
<LE
>,
2207 pub guard_cf_function_count
: U32
<LE
>,
2208 pub guard_flags
: U32
<LE
>,
2209 pub code_integrity
: ImageLoadConfigCodeIntegrity
,
2211 pub guard_address_taken_iat_entry_table
: U32
<LE
>,
2212 pub guard_address_taken_iat_entry_count
: U32
<LE
>,
2214 pub guard_long_jump_target_table
: U32
<LE
>,
2215 pub guard_long_jump_target_count
: U32
<LE
>,
2217 pub dynamic_value_reloc_table
: U32
<LE
>,
2218 pub chpe_metadata_pointer
: U32
<LE
>,
2220 pub guard_rf_failure_routine
: U32
<LE
>,
2222 pub guard_rf_failure_routine_function_pointer
: U32
<LE
>,
2223 pub dynamic_value_reloc_table_offset
: U32
<LE
>,
2224 pub dynamic_value_reloc_table_section
: U16
<LE
>,
2225 pub reserved2
: U16
<LE
>,
2227 pub guard_rf_verify_stack_pointer_function_pointer
: U32
<LE
>,
2228 pub hot_patch_table_offset
: U32
<LE
>,
2229 pub reserved3
: U32
<LE
>,
2231 pub enclave_configuration_pointer
: U32
<LE
>,
2233 pub volatile_metadata_pointer
: U32
<LE
>,
2236 #[derive(Debug, Clone, Copy)]
2238 pub struct ImageLoadConfigDirectory64
{
2240 pub time_date_stamp
: U32
<LE
>,
2241 pub major_version
: U16
<LE
>,
2242 pub minor_version
: U16
<LE
>,
2243 pub global_flags_clear
: U32
<LE
>,
2244 pub global_flags_set
: U32
<LE
>,
2245 pub critical_section_default_timeout
: U32
<LE
>,
2246 pub de_commit_free_block_threshold
: U64
<LE
>,
2247 pub de_commit_total_free_threshold
: U64
<LE
>,
2249 pub lock_prefix_table
: U64
<LE
>,
2250 pub maximum_allocation_size
: U64
<LE
>,
2251 pub virtual_memory_threshold
: U64
<LE
>,
2252 pub process_affinity_mask
: U64
<LE
>,
2253 pub process_heap_flags
: U32
<LE
>,
2254 pub csd_version
: U16
<LE
>,
2255 pub dependent_load_flags
: U16
<LE
>,
2257 pub edit_list
: U64
<LE
>,
2259 pub security_cookie
: U64
<LE
>,
2261 pub sehandler_table
: U64
<LE
>,
2262 pub sehandler_count
: U64
<LE
>,
2264 pub guard_cf_check_function_pointer
: U64
<LE
>,
2266 pub guard_cf_dispatch_function_pointer
: U64
<LE
>,
2268 pub guard_cf_function_table
: U64
<LE
>,
2269 pub guard_cf_function_count
: U64
<LE
>,
2270 pub guard_flags
: U32
<LE
>,
2271 pub code_integrity
: ImageLoadConfigCodeIntegrity
,
2273 pub guard_address_taken_iat_entry_table
: U64
<LE
>,
2274 pub guard_address_taken_iat_entry_count
: U64
<LE
>,
2276 pub guard_long_jump_target_table
: U64
<LE
>,
2277 pub guard_long_jump_target_count
: U64
<LE
>,
2279 pub dynamic_value_reloc_table
: U64
<LE
>,
2281 pub chpe_metadata_pointer
: U64
<LE
>,
2283 pub guard_rf_failure_routine
: U64
<LE
>,
2285 pub guard_rf_failure_routine_function_pointer
: U64
<LE
>,
2286 pub dynamic_value_reloc_table_offset
: U32
<LE
>,
2287 pub dynamic_value_reloc_table_section
: U16
<LE
>,
2288 pub reserved2
: U16
<LE
>,
2290 pub guard_rf_verify_stack_pointer_function_pointer
: U64
<LE
>,
2291 pub hot_patch_table_offset
: U32
<LE
>,
2292 pub reserved3
: U32
<LE
>,
2294 pub enclave_configuration_pointer
: U64
<LE
>,
2296 pub volatile_metadata_pointer
: U64
<LE
>,
2299 #[derive(Debug, Clone, Copy)]
2301 pub struct ImageHotPatchInfo
{
2302 pub version
: U32
<LE
>,
2304 pub sequence_number
: U32
<LE
>,
2305 pub base_image_list
: U32
<LE
>,
2306 pub base_image_count
: U32
<LE
>,
2307 /// Version 2 and later
2308 pub buffer_offset
: U32
<LE
>,
2309 /// Version 3 and later
2310 pub extra_patch_size
: U32
<LE
>,
2313 #[derive(Debug, Clone, Copy)]
2315 pub struct ImageHotPatchBase
{
2316 pub sequence_number
: U32
<LE
>,
2318 pub original_time_date_stamp
: U32
<LE
>,
2319 pub original_check_sum
: U32
<LE
>,
2320 pub code_integrity_info
: U32
<LE
>,
2321 pub code_integrity_size
: U32
<LE
>,
2322 pub patch_table
: U32
<LE
>,
2323 /// Version 2 and later
2324 pub buffer_offset
: U32
<LE
>,
2327 #[derive(Debug, Clone, Copy)]
2329 pub struct ImageHotPatchHashes
{
2330 pub sha256
: [u8; 32],
2334 pub const IMAGE_HOT_PATCH_BASE_OBLIGATORY
: u32 = 0x0000_0001;
2335 pub const IMAGE_HOT_PATCH_BASE_CAN_ROLL_BACK
: u32 = 0x0000_0002;
2337 pub const IMAGE_HOT_PATCH_CHUNK_INVERSE
: u32 = 0x8000_0000;
2338 pub const IMAGE_HOT_PATCH_CHUNK_OBLIGATORY
: u32 = 0x4000_0000;
2339 pub const IMAGE_HOT_PATCH_CHUNK_RESERVED
: u32 = 0x3FF0_3000;
2340 pub const IMAGE_HOT_PATCH_CHUNK_TYPE
: u32 = 0x000F_C000;
2341 pub const IMAGE_HOT_PATCH_CHUNK_SOURCE_RVA
: u32 = 0x0000_8000;
2342 pub const IMAGE_HOT_PATCH_CHUNK_TARGET_RVA
: u32 = 0x0000_4000;
2343 pub const IMAGE_HOT_PATCH_CHUNK_SIZE
: u32 = 0x0000_0FFF;
2345 pub const IMAGE_HOT_PATCH_NONE
: u32 = 0x0000_0000;
2346 pub const IMAGE_HOT_PATCH_FUNCTION
: u32 = 0x0001_C000;
2347 pub const IMAGE_HOT_PATCH_ABSOLUTE
: u32 = 0x0002_C000;
2348 pub const IMAGE_HOT_PATCH_REL32
: u32 = 0x0003_C000;
2349 pub const IMAGE_HOT_PATCH_CALL_TARGET
: u32 = 0x0004_4000;
2350 pub const IMAGE_HOT_PATCH_INDIRECT
: u32 = 0x0005_C000;
2351 pub const IMAGE_HOT_PATCH_NO_CALL_TARGET
: u32 = 0x0006_4000;
2352 pub const IMAGE_HOT_PATCH_DYNAMIC_VALUE
: u32 = 0x0007_8000;
2354 /// Module performs control flow integrity checks using system-supplied support
2355 pub const IMAGE_GUARD_CF_INSTRUMENTED
: u32 = 0x0000_0100;
2356 /// Module performs control flow and write integrity checks
2357 pub const IMAGE_GUARD_CFW_INSTRUMENTED
: u32 = 0x0000_0200;
2358 /// Module contains valid control flow target metadata
2359 pub const IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT
: u32 = 0x0000_0400;
2360 /// Module does not make use of the /GS security cookie
2361 pub const IMAGE_GUARD_SECURITY_COOKIE_UNUSED
: u32 = 0x0000_0800;
2362 /// Module supports read only delay load IAT
2363 pub const IMAGE_GUARD_PROTECT_DELAYLOAD_IAT
: u32 = 0x0000_1000;
2364 /// Delayload import table in its own .didat section (with nothing else in it) that can be freely reprotected
2365 pub const IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION
: u32 = 0x0000_2000;
2366 /// Module contains suppressed export information.
2368 /// This also infers that the address taken taken IAT table is also present in the load config.
2369 pub const IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT
: u32 = 0x0000_4000;
2370 /// Module enables suppression of exports
2371 pub const IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION
: u32 = 0x0000_8000;
2372 /// Module contains longjmp target information
2373 pub const IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT
: u32 = 0x0001_0000;
2374 /// Module contains return flow instrumentation and metadata
2375 pub const IMAGE_GUARD_RF_INSTRUMENTED
: u32 = 0x0002_0000;
2376 /// Module requests that the OS enable return flow protection
2377 pub const IMAGE_GUARD_RF_ENABLE
: u32 = 0x0004_0000;
2378 /// Module requests that the OS enable return flow protection in strict mode
2379 pub const IMAGE_GUARD_RF_STRICT
: u32 = 0x0008_0000;
2380 /// Module was built with retpoline support
2381 pub const IMAGE_GUARD_RETPOLINE_PRESENT
: u32 = 0x0010_0000;
2383 /// Stride of Guard CF function table encoded in these bits (additional count of bytes per element)
2384 pub const IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK
: u32 = 0xF000_0000;
2385 /// Shift to right-justify Guard CF function table stride
2386 pub const IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT
: u32 = 28;
2389 // GFIDS table entry flags.
2392 /// The containing GFID entry is suppressed
2393 pub const IMAGE_GUARD_FLAG_FID_SUPPRESSED
: u16 = 0x01;
2394 /// The containing GFID entry is export suppressed
2395 pub const IMAGE_GUARD_FLAG_EXPORT_SUPPRESSED
: u16 = 0x02;
2398 // WIN CE Exception table format
2402 // Function table entry format. Function table is pointed to by the
2403 // IMAGE_DIRECTORY_ENTRY_EXCEPTION directory entry.
2408 #[derive(Debug, Clone, Copy)]
2410 pub struct ImageCeRuntimeFunctionEntry {
2411 pub func_start: U32<LE>,
2412 DWORD PrologLen : 8;
2414 DWORD ThirtyTwoBit : 1;
2415 DWORD ExceptionFlag : 1;
2419 #[derive(Debug, Clone, Copy)]
2421 pub struct ImageArmRuntimeFunctionEntry
{
2422 pub begin_address
: U32
<LE
>,
2423 pub unwind_data
: U32
<LE
>,
2426 #[derive(Debug, Clone, Copy)]
2428 pub struct ImageArm64RuntimeFunctionEntry
{
2429 pub begin_address
: U32
<LE
>,
2430 pub unwind_data
: U32
<LE
>,
2433 #[derive(Debug, Clone, Copy)]
2435 pub struct ImageAlpha64RuntimeFunctionEntry
{
2436 pub begin_address
: U64
<LE
>,
2437 pub end_address
: U64
<LE
>,
2438 pub exception_handler
: U64
<LE
>,
2439 pub handler_data
: U64
<LE
>,
2440 pub prolog_end_address
: U64
<LE
>,
2443 #[derive(Debug, Clone, Copy)]
2445 pub struct ImageAlphaRuntimeFunctionEntry
{
2446 pub begin_address
: U32
<LE
>,
2447 pub end_address
: U32
<LE
>,
2448 pub exception_handler
: U32
<LE
>,
2449 pub handler_data
: U32
<LE
>,
2450 pub prolog_end_address
: U32
<LE
>,
2453 #[derive(Debug, Clone, Copy)]
2455 pub struct ImageRuntimeFunctionEntry
{
2456 pub begin_address
: U32
<LE
>,
2457 pub end_address
: U32
<LE
>,
2458 pub unwind_info_address_or_data
: U32
<LE
>,
2462 // Sofware enclave information
2465 pub const IMAGE_ENCLAVE_LONG_ID_LENGTH
: usize = 32;
2466 pub const IMAGE_ENCLAVE_SHORT_ID_LENGTH
: usize = 16;
2468 #[derive(Debug, Clone, Copy)]
2470 pub struct ImageEnclaveConfig32
{
2472 pub minimum_required_config_size
: U32
<LE
>,
2473 pub policy_flags
: U32
<LE
>,
2474 pub number_of_imports
: U32
<LE
>,
2475 pub import_list
: U32
<LE
>,
2476 pub import_entry_size
: U32
<LE
>,
2477 pub family_id
: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH
],
2478 pub image_id
: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH
],
2479 pub image_version
: U32
<LE
>,
2480 pub security_version
: U32
<LE
>,
2481 pub enclave_size
: U32
<LE
>,
2482 pub number_of_threads
: U32
<LE
>,
2483 pub enclave_flags
: U32
<LE
>,
2486 #[derive(Debug, Clone, Copy)]
2488 pub struct ImageEnclaveConfig64
{
2490 pub minimum_required_config_size
: U32
<LE
>,
2491 pub policy_flags
: U32
<LE
>,
2492 pub number_of_imports
: U32
<LE
>,
2493 pub import_list
: U32
<LE
>,
2494 pub import_entry_size
: U32
<LE
>,
2495 pub family_id
: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH
],
2496 pub image_id
: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH
],
2497 pub image_version
: U32
<LE
>,
2498 pub security_version
: U32
<LE
>,
2499 pub enclave_size
: U64
<LE
>,
2500 pub number_of_threads
: U32
<LE
>,
2501 pub enclave_flags
: U32
<LE
>,
2504 //pub const IMAGE_ENCLAVE_MINIMUM_CONFIG_SIZE: usize = FIELD_OFFSET(IMAGE_ENCLAVE_CONFIG, EnclaveFlags);
2506 pub const IMAGE_ENCLAVE_POLICY_DEBUGGABLE
: u32 = 0x0000_0001;
2508 pub const IMAGE_ENCLAVE_FLAG_PRIMARY_IMAGE
: u32 = 0x0000_0001;
2510 #[derive(Debug, Clone, Copy)]
2512 pub struct ImageEnclaveImport
{
2513 pub match_type
: U32
<LE
>,
2514 pub minimum_security_version
: U32
<LE
>,
2515 pub unique_or_author_id
: [u8; IMAGE_ENCLAVE_LONG_ID_LENGTH
],
2516 pub family_id
: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH
],
2517 pub image_id
: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH
],
2518 pub import_name
: U32
<LE
>,
2519 pub reserved
: U32
<LE
>,
2522 pub const IMAGE_ENCLAVE_IMPORT_MATCH_NONE
: u32 = 0x0000_0000;
2523 pub const IMAGE_ENCLAVE_IMPORT_MATCH_UNIQUE_ID
: u32 = 0x0000_0001;
2524 pub const IMAGE_ENCLAVE_IMPORT_MATCH_AUTHOR_ID
: u32 = 0x0000_0002;
2525 pub const IMAGE_ENCLAVE_IMPORT_MATCH_FAMILY_ID
: u32 = 0x0000_0003;
2526 pub const IMAGE_ENCLAVE_IMPORT_MATCH_IMAGE_ID
: u32 = 0x0000_0004;
2532 #[derive(Debug, Clone, Copy)]
2534 pub struct ImageDebugDirectory
{
2535 pub characteristics
: U32
<LE
>,
2536 pub time_date_stamp
: U32
<LE
>,
2537 pub major_version
: U16
<LE
>,
2538 pub minor_version
: U16
<LE
>,
2540 pub size_of_data
: U32
<LE
>,
2541 pub address_of_raw_data
: U32
<LE
>,
2542 pub pointer_to_raw_data
: U32
<LE
>,
2545 pub const IMAGE_DEBUG_TYPE_UNKNOWN
: u32 = 0;
2546 pub const IMAGE_DEBUG_TYPE_COFF
: u32 = 1;
2547 pub const IMAGE_DEBUG_TYPE_CODEVIEW
: u32 = 2;
2548 pub const IMAGE_DEBUG_TYPE_FPO
: u32 = 3;
2549 pub const IMAGE_DEBUG_TYPE_MISC
: u32 = 4;
2550 pub const IMAGE_DEBUG_TYPE_EXCEPTION
: u32 = 5;
2551 pub const IMAGE_DEBUG_TYPE_FIXUP
: u32 = 6;
2552 pub const IMAGE_DEBUG_TYPE_OMAP_TO_SRC
: u32 = 7;
2553 pub const IMAGE_DEBUG_TYPE_OMAP_FROM_SRC
: u32 = 8;
2554 pub const IMAGE_DEBUG_TYPE_BORLAND
: u32 = 9;
2555 pub const IMAGE_DEBUG_TYPE_RESERVED10
: u32 = 10;
2556 pub const IMAGE_DEBUG_TYPE_CLSID
: u32 = 11;
2557 pub const IMAGE_DEBUG_TYPE_VC_FEATURE
: u32 = 12;
2558 pub const IMAGE_DEBUG_TYPE_POGO
: u32 = 13;
2559 pub const IMAGE_DEBUG_TYPE_ILTCG
: u32 = 14;
2560 pub const IMAGE_DEBUG_TYPE_MPX
: u32 = 15;
2561 pub const IMAGE_DEBUG_TYPE_REPRO
: u32 = 16;
2563 #[derive(Debug, Clone, Copy)]
2565 pub struct ImageCoffSymbolsHeader
{
2566 pub number_of_symbols
: U32
<LE
>,
2567 pub lva_to_first_symbol
: U32
<LE
>,
2568 pub number_of_linenumbers
: U32
<LE
>,
2569 pub lva_to_first_linenumber
: U32
<LE
>,
2570 pub rva_to_first_byte_of_code
: U32
<LE
>,
2571 pub rva_to_last_byte_of_code
: U32
<LE
>,
2572 pub rva_to_first_byte_of_data
: U32
<LE
>,
2573 pub rva_to_last_byte_of_data
: U32
<LE
>,
2576 pub const FRAME_FPO
: u16 = 0;
2577 pub const FRAME_TRAP
: u16 = 1;
2578 pub const FRAME_TSS
: u16 = 2;
2579 pub const FRAME_NONFPO
: u16 = 3;
2583 #[derive(Debug, Clone, Copy)]
2585 pub struct FpoData {
2586 /// offset 1st byte of function code
2587 pub ul_off_start: U32<LE>,
2588 /// # bytes in function
2589 pub cb_proc_size: U32<LE>,
2590 /// # bytes in locals/4
2591 pub cdw_locals: U32<LE>,
2592 /// # bytes in params/4
2593 pub cdw_params: U16<LE>,
2594 /// # bytes in prolog
2598 /// TRUE if SEH in func
2600 /// TRUE if EBP has been allocated
2602 /// reserved for future use
2607 pub const SIZEOF_RFPO_DATA: usize = 16;
2610 pub const IMAGE_DEBUG_MISC_EXENAME
: u16 = 1;
2612 #[derive(Debug, Clone, Copy)]
2614 pub struct ImageDebugMisc
{
2615 /// type of misc data, see defines
2616 pub data_type
: U32
<LE
>,
2617 /// total length of record, rounded to four byte multiple.
2618 pub length
: U32
<LE
>,
2619 /// TRUE if data is unicode string
2621 pub reserved
: [u8; 3],
2623 //pub data: [u8; 1],
2627 // Function table extracted from MIPS/ALPHA/IA64 images. Does not contain
2628 // information needed only for runtime support. Just those fields for
2629 // each entry needed by a debugger.
2632 #[derive(Debug, Clone, Copy)]
2634 pub struct ImageFunctionEntry
{
2635 pub starting_address
: U32
<LE
>,
2636 pub ending_address
: U32
<LE
>,
2637 pub end_of_prologue
: U32
<LE
>,
2640 #[derive(Debug, Clone, Copy)]
2642 pub struct ImageFunctionEntry64
{
2643 pub starting_address
: U64
<LE
>,
2644 pub ending_address
: U64
<LE
>,
2645 pub end_of_prologue_or_unwind_info_address
: U64
<LE
>,
2649 // Debugging information can be stripped from an image file and placed
2650 // in a separate .DBG file, whose file name part is the same as the
2651 // image file name part (e.g. symbols for CMD.EXE could be stripped
2652 // and placed in CMD.DBG). This is indicated by the IMAGE_FILE_DEBUG_STRIPPED
2653 // flag in the Characteristics field of the file header. The beginning of
2654 // the .DBG file contains the following structure which captures certain
2655 // information from the image file. This allows a debug to proceed even if
2656 // the original image file is not accessable. This header is followed by
2657 // zero of more IMAGE_SECTION_HEADER structures, followed by zero or more
2658 // IMAGE_DEBUG_DIRECTORY structures. The latter structures and those in
2659 // the image file contain file offsets relative to the beginning of the
2662 // If symbols have been stripped from an image, the IMAGE_DEBUG_MISC structure
2663 // is left in the image file, but not mapped. This allows a debugger to
2664 // compute the name of the .DBG file, from the name of the image in the
2665 // IMAGE_DEBUG_MISC structure.
2668 #[derive(Debug, Clone, Copy)]
2670 pub struct ImageSeparateDebugHeader
{
2671 pub signature
: U16
<LE
>,
2673 pub machine
: U16
<LE
>,
2674 pub characteristics
: U16
<LE
>,
2675 pub time_date_stamp
: U32
<LE
>,
2676 pub check_sum
: U32
<LE
>,
2677 pub image_base
: U32
<LE
>,
2678 pub size_of_image
: U32
<LE
>,
2679 pub number_of_sections
: U32
<LE
>,
2680 pub exported_names_size
: U32
<LE
>,
2681 pub debug_directory_size
: U32
<LE
>,
2682 pub section_alignment
: U32
<LE
>,
2683 pub reserved
: [U32
<LE
>; 2],
2686 #[derive(Debug, Clone, Copy)]
2688 pub struct NonPagedDebugInfo
{
2689 pub signature
: U16
<LE
>,
2692 pub machine
: U16
<LE
>,
2693 pub characteristics
: U16
<LE
>,
2694 pub time_date_stamp
: U32
<LE
>,
2695 pub check_sum
: U32
<LE
>,
2696 pub size_of_image
: U32
<LE
>,
2697 pub image_base
: U64
<LE
>,
2698 //debug_directory_size
2699 //ImageDebugDirectory
2702 pub const IMAGE_SEPARATE_DEBUG_SIGNATURE
: u16 = 0x4944;
2703 pub const NON_PAGED_DEBUG_SIGNATURE
: u16 = 0x494E;
2705 pub const IMAGE_SEPARATE_DEBUG_FLAGS_MASK
: u16 = 0x8000;
2706 /// when DBG was updated, the old checksum didn't match.
2707 pub const IMAGE_SEPARATE_DEBUG_MISMATCH
: u16 = 0x8000;
2710 // The .arch section is made up of headers, each describing an amask position/value
2711 // pointing to an array of IMAGE_ARCHITECTURE_ENTRY's. Each "array" (both the header
2712 // and entry arrays) are terminiated by a quadword of 0xffffffffL.
2714 // NOTE: There may be quadwords of 0 sprinkled around and must be skipped.
2719 #[derive(Debug, Clone, Copy)]
2721 pub struct ImageArchitectureHeader {
2722 /// 1 -> code section depends on mask bit
2723 /// 0 -> new instruction depends on mask bit
2724 unsigned int AmaskValue: 1;
2727 /// Amask bit in question for this fixup
2728 unsigned int AmaskShift: 8;
2731 /// RVA into .arch section to array of ARCHITECTURE_ENTRY's
2732 pub first_entry_rva: U32<LE>,
2736 #[derive(Debug, Clone, Copy)]
2738 pub struct ImageArchitectureEntry
{
2739 /// RVA of instruction to fixup
2740 pub fixup_inst_rva
: U32
<LE
>,
2741 /// fixup instruction (see alphaops.h)
2742 pub new_inst
: U32
<LE
>,
2745 // The following structure defines the new import object. Note the values of the first two fields,
2746 // which must be set as stated in order to differentiate old and new import members.
2747 // Following this structure, the linker emits two null-terminated strings used to recreate the
2748 // import at the time of use. The first string is the import's name, the second is the dll's name.
2750 pub const IMPORT_OBJECT_HDR_SIG2
: u16 = 0xffff;
2752 #[derive(Debug, Clone, Copy)]
2754 pub struct ImportObjectHeader
{
2755 /// Must be IMAGE_FILE_MACHINE_UNKNOWN
2757 /// Must be IMPORT_OBJECT_HDR_SIG2.
2759 pub version
: U16
<LE
>,
2760 pub machine
: U16
<LE
>,
2762 pub time_date_stamp
: U32
<LE
>,
2763 /// particularly useful for incremental links
2764 pub size_of_data
: U32
<LE
>,
2766 /// if grf & IMPORT_OBJECT_ORDINAL
2767 pub ordinal_or_hint
: U16
<LE
>,
2770 // WORD NameType : 3;
2771 // WORD Reserved : 11;
2772 pub name_type
: U16
<LE
>,
2775 pub const IMPORT_OBJECT_CODE
: u16 = 0;
2776 pub const IMPORT_OBJECT_DATA
: u16 = 1;
2777 pub const IMPORT_OBJECT_CONST
: u16 = 2;
2779 /// Import by ordinal
2780 pub const IMPORT_OBJECT_ORDINAL
: u16 = 0;
2781 /// Import name == public symbol name.
2782 pub const IMPORT_OBJECT_NAME
: u16 = 1;
2783 /// Import name == public symbol name skipping leading ?, @, or optionally _.
2784 pub const IMPORT_OBJECT_NAME_NO_PREFIX
: u16 = 2;
2785 /// Import name == public symbol name skipping leading ?, @, or optionally _ and truncating at first @.
2786 pub const IMPORT_OBJECT_NAME_UNDECORATE
: u16 = 3;
2787 /// Import name == a name is explicitly provided after the DLL name.
2788 pub const IMPORT_OBJECT_NAME_EXPORTAS
: u16 = 4;
2790 // COM+ Header entry point flags.
2791 pub const COMIMAGE_FLAGS_ILONLY
: u32 = 0x0000_0001;
2792 pub const COMIMAGE_FLAGS_32BITREQUIRED
: u32 = 0x0000_0002;
2793 pub const COMIMAGE_FLAGS_IL_LIBRARY
: u32 = 0x0000_0004;
2794 pub const COMIMAGE_FLAGS_STRONGNAMESIGNED
: u32 = 0x0000_0008;
2795 pub const COMIMAGE_FLAGS_NATIVE_ENTRYPOINT
: u32 = 0x0000_0010;
2796 pub const COMIMAGE_FLAGS_TRACKDEBUGDATA
: u32 = 0x0001_0000;
2797 pub const COMIMAGE_FLAGS_32BITPREFERRED
: u32 = 0x0002_0000;
2799 // Version flags for image.
2800 pub const COR_VERSION_MAJOR_V2
: u16 = 2;
2801 pub const COR_VERSION_MAJOR
: u16 = COR_VERSION_MAJOR_V2
;
2802 pub const COR_VERSION_MINOR
: u16 = 5;
2803 pub const COR_DELETED_NAME_LENGTH
: usize = 8;
2804 pub const COR_VTABLEGAP_NAME_LENGTH
: usize = 8;
2806 // Maximum size of a NativeType descriptor.
2807 pub const NATIVE_TYPE_MAX_CB
: u16 = 1;
2808 pub const COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE
: u16 = 0xFF;
2810 // Consts for the MIH FLAGS
2811 pub const IMAGE_COR_MIH_METHODRVA
: u16 = 0x01;
2812 pub const IMAGE_COR_MIH_EHRVA
: u16 = 0x02;
2813 pub const IMAGE_COR_MIH_BASICBLOCK
: u16 = 0x08;
2815 // V-table constants
2816 /// V-table slots are 32-bits in size.
2817 pub const COR_VTABLE_32BIT
: u16 = 0x01;
2818 /// V-table slots are 64-bits in size.
2819 pub const COR_VTABLE_64BIT
: u16 = 0x02;
2820 /// If set, transition from unmanaged.
2821 pub const COR_VTABLE_FROM_UNMANAGED
: u16 = 0x04;
2822 /// If set, transition from unmanaged with keeping the current appdomain.
2823 pub const COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN
: u16 = 0x08;
2824 /// Call most derived method described by
2825 pub const COR_VTABLE_CALL_MOST_DERIVED
: u16 = 0x10;
2828 /// Size of a jump thunk reserved range.
2829 pub const IMAGE_COR_EATJ_THUNK_SIZE
: usize = 32;
2832 pub const MAX_CLASS_NAME
: usize = 1024;
2833 pub const MAX_PACKAGE_NAME
: usize = 1024;
2835 // CLR 2.0 header structure.
2836 #[derive(Debug, Clone, Copy)]
2838 pub struct ImageCor20Header
{
2839 // Header versioning
2841 pub major_runtime_version
: U16
<LE
>,
2842 pub minor_runtime_version
: U16
<LE
>,
2844 // Symbol table and startup information
2845 pub meta_data
: ImageDataDirectory
,
2848 // If COMIMAGE_FLAGS_NATIVE_ENTRYPOINT is not set, EntryPointToken represents a managed entrypoint.
2849 // If COMIMAGE_FLAGS_NATIVE_ENTRYPOINT is set, EntryPointRVA represents an RVA to a native entrypoint.
2850 pub entry_point_token_or_rva
: U32
<LE
>,
2852 // Binding information
2853 pub resources
: ImageDataDirectory
,
2854 pub strong_name_signature
: ImageDataDirectory
,
2856 // Regular fixup and binding information
2857 pub code_manager_table
: ImageDataDirectory
,
2858 pub vtable_fixups
: ImageDataDirectory
,
2859 pub export_address_table_jumps
: ImageDataDirectory
,
2861 // Precompiled image info (internal use only - set to zero)
2862 pub managed_native_header
: ImageDataDirectory
,
2871 ImageOptionalHeader32
,
2872 ImageRomOptionalHeader
,
2873 ImageOptionalHeader64
,
2880 AnonObjectHeaderBigobj
,
2886 ImageAuxSymbolTokenDef
,
2887 ImageAuxSymbolFunction
,
2888 ImageAuxSymbolFunctionBeginEnd
,
2890 ImageAuxSymbolSection
,
2894 ImageBaseRelocation
,
2895 ImageArchiveMemberHeader
,
2896 ImageExportDirectory
,
2900 ImageTlsDirectory64
,
2901 ImageTlsDirectory32
,
2902 ImageImportDescriptor
,
2903 ImageBoundImportDescriptor
,
2904 ImageBoundForwarderRef
,
2905 ImageDelayloadDescriptor
,
2906 ImageResourceDirectory
,
2907 ImageResourceDirectoryEntry
,
2908 ImageResourceDirectoryString
,
2909 ImageResourceDirStringU
,
2910 ImageResourceDataEntry
,
2911 ImageLoadConfigCodeIntegrity
,
2912 ImageDynamicRelocationTable
,
2913 ImageDynamicRelocation32
,
2914 ImageDynamicRelocation64
,
2915 ImageDynamicRelocation32V2
,
2916 ImageDynamicRelocation64V2
,
2917 ImagePrologueDynamicRelocationHeader
,
2918 ImageEpilogueDynamicRelocationHeader
,
2919 //ImageImportControlTransferDynamicRelocation,
2920 //ImageIndirControlTransferDynamicRelocation,
2921 //ImageSwitchtableBranchDynamicRelocation,
2922 ImageLoadConfigDirectory32
,
2923 ImageLoadConfigDirectory64
,
2926 ImageHotPatchHashes
,
2927 //ImageCeRuntimeFunctionEntry,
2928 ImageArmRuntimeFunctionEntry
,
2929 ImageArm64RuntimeFunctionEntry
,
2930 ImageAlpha64RuntimeFunctionEntry
,
2931 ImageAlphaRuntimeFunctionEntry
,
2932 ImageRuntimeFunctionEntry
,
2933 ImageEnclaveConfig32
,
2934 ImageEnclaveConfig64
,
2936 ImageDebugDirectory
,
2937 ImageCoffSymbolsHeader
,
2941 ImageFunctionEntry64
,
2942 ImageSeparateDebugHeader
,
2944 //ImageArchitectureHeader,
2945 ImageArchitectureEntry
,