1#![allow(non_snake_case)]
2#![allow(non_camel_case_types)]
3
4use std::fmt;
5
6pub const IMAGE_DOS_SIGNATURE: u16 = 0x5A4D;
8
9#[derive(Debug, Copy, Clone)]
10#[repr(C)]
11pub struct IMAGE_DOS_HEADER {
17 pub e_magic: u16,
18 pub e_cblp: u16,
19 pub e_cp: u16,
20 pub e_crlc: u16,
21 pub e_cparhdr: u16,
22 pub e_minalloc: u16,
23 pub e_maxalloc: u16,
24 pub e_ss: u16,
25 pub e_sp: u16,
26 pub e_csum: u16,
27 pub e_ip: u16,
28 pub e_cs: u16,
29 pub e_lfarlc: u16,
30 pub e_ovno: u16,
31 pub e_res: [u16; 4],
32 pub e_oemid: u16,
33 pub e_oeminfo: u16,
34 pub e_res2: [u16; 10],
35 pub e_lfanew: u32,
36}
37
38pub const IMAGE_NT_HEADERS_SIGNATURE: u32 = 0x00004550;
41
42#[derive(Copy, Clone, Debug)]
43#[repr(C)]
44pub struct IMAGE_NT_HEADERS32 {
45 pub Signature: u32,
46 pub FileHeader: IMAGE_FILE_HEADER,
47 pub OptionalHeader: IMAGE_OPTIONAL_HEADER32,
48}
49
50#[derive(Copy, Clone, Debug)]
51#[repr(C)]
52pub struct IMAGE_NT_HEADERS64 {
53 pub Signature: u32,
54 pub FileHeader: IMAGE_FILE_HEADER,
55 pub OptionalHeader: IMAGE_OPTIONAL_HEADER64,
56}
57
58#[derive(Debug, Copy, Clone)]
59#[repr(C)]
60pub struct IMAGE_FILE_HEADER {
61 pub Machine: u16,
62 pub NumberOfSections: u16,
63 pub TimeDateStamp: u32,
64 pub PointerToSymbolTable: u32,
65 pub NumberOfSymbols: u32,
66 pub SizeOfOptionalHeader: u16,
67 pub Characteristics: u16,
68}
69
70pub const IMAGE_NT_OPTIONAL_HDR32_MAGIC: u16 = 0x10b;
71pub const IMAGE_NT_OPTIONAL_HDR64_MAGIC: u16 = 0x20b;
72
73#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
75#[repr(C)]
76pub struct IMAGE_VERSION<T> {
77 pub Major: T,
78 pub Minor: T,
79}
80
81impl<T: fmt::Display> fmt::Debug for IMAGE_VERSION<T> {
82 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
83 write!(f, "\"{}.{}\"", self.Major, self.Minor)
84 }
85}
86impl<T: fmt::Display> fmt::Display for IMAGE_VERSION<T> {
87 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
88 write!(f, "{}.{}", self.Major, self.Minor)
89 }
90}
91
92#[derive(Debug, Copy, Clone)]
93#[repr(C)]
94pub struct IMAGE_OPTIONAL_HEADER32 {
95 pub Magic: u16,
96 pub LinkerVersion: IMAGE_VERSION<u8>, pub SizeOfCode: u32,
98 pub SizeOfInitializedData: u32,
99 pub SizeOfUninitializedData: u32,
100 pub AddressOfEntryPoint: u32,
101 pub BaseOfCode: u32,
102 pub BaseOfData: u32,
103 pub ImageBase: u32,
104 pub SectionAlignment: u32,
105 pub FileAlignment: u32,
106 pub OperatingSystemVersion: IMAGE_VERSION<u16>,
107 pub ImageVersion: IMAGE_VERSION<u16>,
108 pub SubsystemVersion: IMAGE_VERSION<u16>,
109 pub Win32VersionValue: u32,
110 pub SizeOfImage: u32,
111 pub SizeOfHeaders: u32,
112 pub CheckSum: u32,
113 pub Subsystem: u16,
114 pub DllCharacteristics: u16,
115 pub SizeOfStackReserve: u32,
116 pub SizeOfStackCommit: u32,
117 pub SizeOfHeapReserve: u32,
118 pub SizeOfHeapCommit: u32,
119 pub LoaderFlags: u32,
120 pub NumberOfRvaAndSizes: u32,
121 pub DataDirectory: [IMAGE_DATA_DIRECTORY; 16],
122}
123#[derive(Copy, Clone, Debug)]
126#[repr(C)]
127pub struct IMAGE_DATA_DIRECTORY {
128 pub VirtualAddress: u32,
129 pub Size: u32,
130}
131
132pub const IMAGE_DIRECTORY_ENTRY_EXPORT: usize = 0;
133pub const IMAGE_DIRECTORY_ENTRY_IMPORT: usize = 1;
134pub const IMAGE_DIRECTORY_ENTRY_RESOURCE: usize = 2;
135pub const IMAGE_DIRECTORY_ENTRY_EXCEPTION: usize = 3;
136pub const IMAGE_DIRECTORY_ENTRY_SECURITY: usize = 4;
137pub const IMAGE_DIRECTORY_ENTRY_BASERELOC: usize = 5;
138pub const IMAGE_DIRECTORY_ENTRY_DEBUG: usize = 6;
139pub const IMAGE_DIRECTORY_ENTRY_ARCHITECTURE: usize = 7;
140pub const IMAGE_DIRECTORY_ENTRY_GLOBALPTR: usize = 8;
141pub const IMAGE_DIRECTORY_ENTRY_TLS: usize = 9;
142pub const IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG: usize = 10;
143pub const IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT: usize = 11;
144pub const IMAGE_DIRECTORY_ENTRY_IAT: usize = 12;
145pub const IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT: usize = 13;
146pub const IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR: usize = 14;
147
148pub const IMAGE_NUMBEROF_DIRECTORY_ENTRIES: usize = 16;
149
150#[derive(Copy, Clone, Debug)]
152#[repr(C)]
153pub struct IMAGE_OPTIONAL_HEADER64 {
154 pub Magic: u16,
155 pub LinkerVersion: IMAGE_VERSION<u8>,
156 pub SizeOfCode: u32,
157 pub SizeOfInitializedData: u32,
158 pub SizeOfUninitializedData: u32,
159 pub AddressOfEntryPoint: u32,
160 pub BaseOfCode: u32,
161 pub ImageBase: u64,
162 pub SectionAlignment: u32,
163 pub FileAlignment: u32,
164 pub OperatingSystemVersion: IMAGE_VERSION<u16>,
165 pub ImageVersion: IMAGE_VERSION<u16>,
166 pub SubsystemVersion: IMAGE_VERSION<u16>,
167 pub Win32VersionValue: u32,
168 pub SizeOfImage: u32,
169 pub SizeOfHeaders: u32,
170 pub CheckSum: u32,
171 pub Subsystem: u16,
172 pub DllCharacteristics: u16,
173 pub SizeOfStackReserve: u64,
174 pub SizeOfStackCommit: u64,
175 pub SizeOfHeapReserve: u64,
176 pub SizeOfHeapCommit: u64,
177 pub LoaderFlags: u32,
178 pub NumberOfRvaAndSizes: u32,
179 pub DataDirectory: [IMAGE_DATA_DIRECTORY; IMAGE_NUMBEROF_DIRECTORY_ENTRIES],
180}
181
182pub const IMAGE_SIZEOF_SHORT_NAME: usize = 8usize;
185
186#[derive(Copy, Clone, Debug)]
187#[repr(C)]
188pub struct IMAGE_SECTION_HEADER {
189 pub Name: [u8; IMAGE_SIZEOF_SHORT_NAME],
190 pub VirtualSize: u32,
191 pub VirtualAddress: u32,
192 pub SizeOfRawData: u32,
193 pub PointerToRawData: u32,
194 pub PointerToRelocations: u32,
195 pub PointerToLinenumbers: u32,
196 pub NumberOfRelocations: u16,
197 pub NumberOfLinenumbers: u16,
198 pub Characteristics: u32,
199}
200
201impl IMAGE_SECTION_HEADER {
202 pub fn name(&self) -> Result<&str, std::str::Utf8Error> {
203 std::str::from_utf8(&self.Name)
204 }
205}