1pub const ANVIL_API_VERSION: u32 = 2;
6pub const ANVIL_EVENT_PLUGINS_LOADED: &[u8; 21] = b"anvil.plugins_loaded\0";
7pub const ANVIL_EVENT_SUSPENDED: &[u8; 16] = b"anvil.suspended\0";
8pub const ANVIL_EVENT_RESUMED: &[u8; 14] = b"anvil.resumed\0";
9pub type wchar_t = core::ffi::c_ushort;
10#[repr(C)]
11#[derive(Debug)]
12pub struct AnvilPlugin {
13 _unused: [u8; 0],
14}
15#[repr(C)]
16#[derive(Debug)]
17pub struct AnvilChange {
18 _unused: [u8; 0],
19}
20pub type AnvilSymbol = u32;
21pub type AnvilSetting = u32;
22pub const ANVIL_OK: AnvilResult = 0;
23pub const ANVIL_ERROR_INVALID_ARGUMENT: AnvilResult = 1;
24pub const ANVIL_ERROR_NOT_DECLARED: AnvilResult = 2;
25pub const ANVIL_ERROR_WRONG_KIND: AnvilResult = 3;
26pub const ANVIL_ERROR_CONFLICT: AnvilResult = 4;
27pub const ANVIL_ERROR_UNSAFE_SITE: AnvilResult = 5;
28pub const ANVIL_ERROR_BYTES_MISMATCH: AnvilResult = 6;
29pub const ANVIL_ERROR_OUT_OF_MEMORY: AnvilResult = 7;
30pub const ANVIL_ERROR_WRONG_PHASE: AnvilResult = 8;
31pub const ANVIL_ERROR_UNSUPPORTED: AnvilResult = 9;
32pub const ANVIL_ERROR_INTERNAL: AnvilResult = 10;
33pub const ANVIL_ERROR_NOT_FOUND: AnvilResult = 11;
34pub const ANVIL_ERROR_ALREADY_EXISTS: AnvilResult = 12;
35pub type AnvilResult = core::ffi::c_int;
36pub const ANVIL_LOG_DEBUG: AnvilLogLevel = 0;
37pub const ANVIL_LOG_INFO: AnvilLogLevel = 1;
38pub const ANVIL_LOG_WARNING: AnvilLogLevel = 2;
39pub const ANVIL_LOG_ERROR: AnvilLogLevel = 3;
40pub type AnvilLogLevel = core::ffi::c_int;
41#[repr(C)]
42#[derive(Debug, Copy, Clone)]
43pub struct AnvilGameInfo {
44 pub size: u32,
45 pub build_id: *const core::ffi::c_char,
46 pub image_base: usize,
47 pub image_size: u32,
48 pub sha256: *const core::ffi::c_char,
49}
50#[allow(clippy::unnecessary_operation, clippy::identity_op)]
51const _: () = {
52 ["Size of AnvilGameInfo"][::core::mem::size_of::<AnvilGameInfo>() - 40usize];
53 ["Alignment of AnvilGameInfo"][::core::mem::align_of::<AnvilGameInfo>() - 8usize];
54 [
55 "Offset of field: AnvilGameInfo::size",
56 ][::core::mem::offset_of!(AnvilGameInfo, size) - 0usize];
57 [
58 "Offset of field: AnvilGameInfo::build_id",
59 ][::core::mem::offset_of!(AnvilGameInfo, build_id) - 8usize];
60 [
61 "Offset of field: AnvilGameInfo::image_base",
62 ][::core::mem::offset_of!(AnvilGameInfo, image_base) - 16usize];
63 [
64 "Offset of field: AnvilGameInfo::image_size",
65 ][::core::mem::offset_of!(AnvilGameInfo, image_size) - 24usize];
66 [
67 "Offset of field: AnvilGameInfo::sha256",
68 ][::core::mem::offset_of!(AnvilGameInfo, sha256) - 32usize];
69};
70#[repr(C)]
71#[derive(Copy, Clone)]
72pub union AnvilXmm {
73 pub u8_: [u8; 16usize],
74 pub u16_: [u16; 8usize],
75 pub u32_: [u32; 4usize],
76 pub u64_: [u64; 2usize],
77 pub f32_: [f32; 4usize],
78 pub f64_: [f64; 2usize],
79}
80#[allow(clippy::unnecessary_operation, clippy::identity_op)]
81const _: () = {
82 ["Size of AnvilXmm"][::core::mem::size_of::<AnvilXmm>() - 16usize];
83 ["Alignment of AnvilXmm"][::core::mem::align_of::<AnvilXmm>() - 8usize];
84 ["Offset of field: AnvilXmm::u8_"][::core::mem::offset_of!(AnvilXmm, u8_) - 0usize];
85 [
86 "Offset of field: AnvilXmm::u16_",
87 ][::core::mem::offset_of!(AnvilXmm, u16_) - 0usize];
88 [
89 "Offset of field: AnvilXmm::u32_",
90 ][::core::mem::offset_of!(AnvilXmm, u32_) - 0usize];
91 [
92 "Offset of field: AnvilXmm::u64_",
93 ][::core::mem::offset_of!(AnvilXmm, u64_) - 0usize];
94 [
95 "Offset of field: AnvilXmm::f32_",
96 ][::core::mem::offset_of!(AnvilXmm, f32_) - 0usize];
97 [
98 "Offset of field: AnvilXmm::f64_",
99 ][::core::mem::offset_of!(AnvilXmm, f64_) - 0usize];
100};
101#[repr(C)]
102#[derive(Copy, Clone)]
103pub struct AnvilCpuContext {
104 pub xmm: [AnvilXmm; 16usize],
105 pub rflags: usize,
106 pub r15: usize,
107 pub r14: usize,
108 pub r13: usize,
109 pub r12: usize,
110 pub r11: usize,
111 pub r10: usize,
112 pub r9: usize,
113 pub r8: usize,
114 pub rdi: usize,
115 pub rsi: usize,
116 pub rdx: usize,
117 pub rcx: usize,
118 pub rbx: usize,
119 pub rax: usize,
120 pub rbp: usize,
121 pub rsp: usize,
122 pub reserved: usize,
123 pub rip: usize,
124}
125#[allow(clippy::unnecessary_operation, clippy::identity_op)]
126const _: () = {
127 ["Size of AnvilCpuContext"][::core::mem::size_of::<AnvilCpuContext>() - 408usize];
128 [
129 "Alignment of AnvilCpuContext",
130 ][::core::mem::align_of::<AnvilCpuContext>() - 8usize];
131 [
132 "Offset of field: AnvilCpuContext::xmm",
133 ][::core::mem::offset_of!(AnvilCpuContext, xmm) - 0usize];
134 [
135 "Offset of field: AnvilCpuContext::rflags",
136 ][::core::mem::offset_of!(AnvilCpuContext, rflags) - 256usize];
137 [
138 "Offset of field: AnvilCpuContext::r15",
139 ][::core::mem::offset_of!(AnvilCpuContext, r15) - 264usize];
140 [
141 "Offset of field: AnvilCpuContext::r14",
142 ][::core::mem::offset_of!(AnvilCpuContext, r14) - 272usize];
143 [
144 "Offset of field: AnvilCpuContext::r13",
145 ][::core::mem::offset_of!(AnvilCpuContext, r13) - 280usize];
146 [
147 "Offset of field: AnvilCpuContext::r12",
148 ][::core::mem::offset_of!(AnvilCpuContext, r12) - 288usize];
149 [
150 "Offset of field: AnvilCpuContext::r11",
151 ][::core::mem::offset_of!(AnvilCpuContext, r11) - 296usize];
152 [
153 "Offset of field: AnvilCpuContext::r10",
154 ][::core::mem::offset_of!(AnvilCpuContext, r10) - 304usize];
155 [
156 "Offset of field: AnvilCpuContext::r9",
157 ][::core::mem::offset_of!(AnvilCpuContext, r9) - 312usize];
158 [
159 "Offset of field: AnvilCpuContext::r8",
160 ][::core::mem::offset_of!(AnvilCpuContext, r8) - 320usize];
161 [
162 "Offset of field: AnvilCpuContext::rdi",
163 ][::core::mem::offset_of!(AnvilCpuContext, rdi) - 328usize];
164 [
165 "Offset of field: AnvilCpuContext::rsi",
166 ][::core::mem::offset_of!(AnvilCpuContext, rsi) - 336usize];
167 [
168 "Offset of field: AnvilCpuContext::rdx",
169 ][::core::mem::offset_of!(AnvilCpuContext, rdx) - 344usize];
170 [
171 "Offset of field: AnvilCpuContext::rcx",
172 ][::core::mem::offset_of!(AnvilCpuContext, rcx) - 352usize];
173 [
174 "Offset of field: AnvilCpuContext::rbx",
175 ][::core::mem::offset_of!(AnvilCpuContext, rbx) - 360usize];
176 [
177 "Offset of field: AnvilCpuContext::rax",
178 ][::core::mem::offset_of!(AnvilCpuContext, rax) - 368usize];
179 [
180 "Offset of field: AnvilCpuContext::rbp",
181 ][::core::mem::offset_of!(AnvilCpuContext, rbp) - 376usize];
182 [
183 "Offset of field: AnvilCpuContext::rsp",
184 ][::core::mem::offset_of!(AnvilCpuContext, rsp) - 384usize];
185 [
186 "Offset of field: AnvilCpuContext::reserved",
187 ][::core::mem::offset_of!(AnvilCpuContext, reserved) - 392usize];
188 [
189 "Offset of field: AnvilCpuContext::rip",
190 ][::core::mem::offset_of!(AnvilCpuContext, rip) - 400usize];
191};
192pub type AnvilCpuCallback = ::core::option::Option<
193 unsafe extern "C" fn(cpu: *mut AnvilCpuContext, user: *mut core::ffi::c_void),
194>;
195pub type AnvilEventCallback = ::core::option::Option<
196 unsafe extern "C" fn(
197 event: *const core::ffi::c_char,
198 payload: *const core::ffi::c_void,
199 context: *mut core::ffi::c_void,
200 ),
201>;
202pub type AnvilSettingCallback = ::core::option::Option<
203 unsafe extern "C" fn(setting: AnvilSetting, context: *mut core::ffi::c_void),
204>;
205#[repr(C)]
206#[derive(Debug, Copy, Clone)]
207pub struct AnvilHost {
208 pub size: u32,
209 pub api_version: u32,
210 pub anvil_version: *const core::ffi::c_char,
211 pub game: *const AnvilGameInfo,
212 pub log: ::core::option::Option<
213 unsafe extern "C" fn(
214 self_: *mut AnvilPlugin,
215 level: AnvilLogLevel,
216 message: *const core::ffi::c_char,
217 ),
218 >,
219 pub plugin_dir: ::core::option::Option<
220 unsafe extern "C" fn(self_: *mut AnvilPlugin) -> *const wchar_t,
221 >,
222 pub data_dir: ::core::option::Option<
223 unsafe extern "C" fn(self_: *mut AnvilPlugin) -> *const wchar_t,
224 >,
225 pub hook_function: ::core::option::Option<
226 unsafe extern "C" fn(
227 self_: *mut AnvilPlugin,
228 fn_: AnvilSymbol,
229 detour: *mut core::ffi::c_void,
230 next: *mut *mut core::ffi::c_void,
231 out: *mut *mut AnvilChange,
232 ) -> AnvilResult,
233 >,
234 pub mid_hook: ::core::option::Option<
235 unsafe extern "C" fn(
236 self_: *mut AnvilPlugin,
237 site: AnvilSymbol,
238 callback: AnvilCpuCallback,
239 user: *mut core::ffi::c_void,
240 out: *mut *mut AnvilChange,
241 ) -> AnvilResult,
242 >,
243 pub replace_block: ::core::option::Option<
244 unsafe extern "C" fn(
245 self_: *mut AnvilPlugin,
246 block: AnvilSymbol,
247 callback: AnvilCpuCallback,
248 user: *mut core::ffi::c_void,
249 out: *mut *mut AnvilChange,
250 ) -> AnvilResult,
251 >,
252 pub redirect_call: ::core::option::Option<
253 unsafe extern "C" fn(
254 self_: *mut AnvilPlugin,
255 call_site: AnvilSymbol,
256 target: *mut core::ffi::c_void,
257 next: *mut *mut core::ffi::c_void,
258 out: *mut *mut AnvilChange,
259 ) -> AnvilResult,
260 >,
261 pub patch_bytes: ::core::option::Option<
262 unsafe extern "C" fn(
263 self_: *mut AnvilPlugin,
264 site: AnvilSymbol,
265 bytes: *const core::ffi::c_void,
266 size: usize,
267 out: *mut *mut AnvilChange,
268 ) -> AnvilResult,
269 >,
270 pub swap_pointer: ::core::option::Option<
271 unsafe extern "C" fn(
272 self_: *mut AnvilPlugin,
273 slot: AnvilSymbol,
274 value: *mut core::ffi::c_void,
275 previous: *mut *mut core::ffi::c_void,
276 out: *mut *mut AnvilChange,
277 ) -> AnvilResult,
278 >,
279 pub replace_import: ::core::option::Option<
280 unsafe extern "C" fn(
281 self_: *mut AnvilPlugin,
282 module: *const core::ffi::c_char,
283 function: *const core::ffi::c_char,
284 replacement: *mut core::ffi::c_void,
285 next: *mut *mut core::ffi::c_void,
286 out: *mut *mut AnvilChange,
287 ) -> AnvilResult,
288 >,
289 pub hook_function_at: ::core::option::Option<
290 unsafe extern "C" fn(
291 self_: *mut AnvilPlugin,
292 address: *mut core::ffi::c_void,
293 expected_prologue: *const core::ffi::c_void,
294 prologue_size: usize,
295 detour: *mut core::ffi::c_void,
296 next: *mut *mut core::ffi::c_void,
297 out: *mut *mut AnvilChange,
298 ) -> AnvilResult,
299 >,
300 pub mid_hook_at: ::core::option::Option<
301 unsafe extern "C" fn(
302 self_: *mut AnvilPlugin,
303 address: *mut core::ffi::c_void,
304 expected: *const core::ffi::c_void,
305 expected_size: usize,
306 callback: AnvilCpuCallback,
307 user: *mut core::ffi::c_void,
308 out: *mut *mut AnvilChange,
309 ) -> AnvilResult,
310 >,
311 pub remove: ::core::option::Option<
312 unsafe extern "C" fn(
313 self_: *mut AnvilPlugin,
314 change: *mut AnvilChange,
315 ) -> AnvilResult,
316 >,
317 pub begin_group: ::core::option::Option<
318 unsafe extern "C" fn(self_: *mut AnvilPlugin) -> AnvilResult,
319 >,
320 pub commit_group: ::core::option::Option<
321 unsafe extern "C" fn(self_: *mut AnvilPlugin) -> AnvilResult,
322 >,
323 pub abort_group: ::core::option::Option<
324 unsafe extern "C" fn(self_: *mut AnvilPlugin),
325 >,
326 pub address_of: ::core::option::Option<
327 unsafe extern "C" fn(
328 self_: *mut AnvilPlugin,
329 symbol: AnvilSymbol,
330 ) -> *mut core::ffi::c_void,
331 >,
332 pub symbol_value: ::core::option::Option<
333 unsafe extern "C" fn(
334 self_: *mut AnvilPlugin,
335 symbol: AnvilSymbol,
336 name: *const core::ffi::c_char,
337 out: *mut u64,
338 ) -> AnvilResult,
339 >,
340 pub setting_bool: ::core::option::Option<
341 unsafe extern "C" fn(
342 self_: *mut AnvilPlugin,
343 setting: AnvilSetting,
344 ) -> core::ffi::c_int,
345 >,
346 pub setting_int: ::core::option::Option<
347 unsafe extern "C" fn(self_: *mut AnvilPlugin, setting: AnvilSetting) -> i64,
348 >,
349 pub setting_float: ::core::option::Option<
350 unsafe extern "C" fn(self_: *mut AnvilPlugin, setting: AnvilSetting) -> f64,
351 >,
352 pub setting_string: ::core::option::Option<
353 unsafe extern "C" fn(
354 self_: *mut AnvilPlugin,
355 setting: AnvilSetting,
356 ) -> *const core::ffi::c_char,
357 >,
358 pub subscribe_setting: ::core::option::Option<
359 unsafe extern "C" fn(
360 self_: *mut AnvilPlugin,
361 setting: AnvilSetting,
362 callback: AnvilSettingCallback,
363 context: *mut core::ffi::c_void,
364 ) -> AnvilResult,
365 >,
366 pub register_service: ::core::option::Option<
367 unsafe extern "C" fn(
368 self_: *mut AnvilPlugin,
369 name: *const core::ffi::c_char,
370 version: u32,
371 service: *const core::ffi::c_void,
372 ) -> AnvilResult,
373 >,
374 pub get_service: ::core::option::Option<
375 unsafe extern "C" fn(
376 self_: *mut AnvilPlugin,
377 name: *const core::ffi::c_char,
378 version: u32,
379 ) -> *const core::ffi::c_void,
380 >,
381 pub subscribe: ::core::option::Option<
382 unsafe extern "C" fn(
383 self_: *mut AnvilPlugin,
384 event: *const core::ffi::c_char,
385 callback: AnvilEventCallback,
386 context: *mut core::ffi::c_void,
387 ) -> AnvilResult,
388 >,
389 pub publish: ::core::option::Option<
390 unsafe extern "C" fn(
391 self_: *mut AnvilPlugin,
392 event: *const core::ffi::c_char,
393 payload: *const core::ffi::c_void,
394 ) -> AnvilResult,
395 >,
396}
397#[allow(clippy::unnecessary_operation, clippy::identity_op)]
398const _: () = {
399 ["Size of AnvilHost"][::core::mem::size_of::<AnvilHost>() - 240usize];
400 ["Alignment of AnvilHost"][::core::mem::align_of::<AnvilHost>() - 8usize];
401 [
402 "Offset of field: AnvilHost::size",
403 ][::core::mem::offset_of!(AnvilHost, size) - 0usize];
404 [
405 "Offset of field: AnvilHost::api_version",
406 ][::core::mem::offset_of!(AnvilHost, api_version) - 4usize];
407 [
408 "Offset of field: AnvilHost::anvil_version",
409 ][::core::mem::offset_of!(AnvilHost, anvil_version) - 8usize];
410 [
411 "Offset of field: AnvilHost::game",
412 ][::core::mem::offset_of!(AnvilHost, game) - 16usize];
413 [
414 "Offset of field: AnvilHost::log",
415 ][::core::mem::offset_of!(AnvilHost, log) - 24usize];
416 [
417 "Offset of field: AnvilHost::plugin_dir",
418 ][::core::mem::offset_of!(AnvilHost, plugin_dir) - 32usize];
419 [
420 "Offset of field: AnvilHost::data_dir",
421 ][::core::mem::offset_of!(AnvilHost, data_dir) - 40usize];
422 [
423 "Offset of field: AnvilHost::hook_function",
424 ][::core::mem::offset_of!(AnvilHost, hook_function) - 48usize];
425 [
426 "Offset of field: AnvilHost::mid_hook",
427 ][::core::mem::offset_of!(AnvilHost, mid_hook) - 56usize];
428 [
429 "Offset of field: AnvilHost::replace_block",
430 ][::core::mem::offset_of!(AnvilHost, replace_block) - 64usize];
431 [
432 "Offset of field: AnvilHost::redirect_call",
433 ][::core::mem::offset_of!(AnvilHost, redirect_call) - 72usize];
434 [
435 "Offset of field: AnvilHost::patch_bytes",
436 ][::core::mem::offset_of!(AnvilHost, patch_bytes) - 80usize];
437 [
438 "Offset of field: AnvilHost::swap_pointer",
439 ][::core::mem::offset_of!(AnvilHost, swap_pointer) - 88usize];
440 [
441 "Offset of field: AnvilHost::replace_import",
442 ][::core::mem::offset_of!(AnvilHost, replace_import) - 96usize];
443 [
444 "Offset of field: AnvilHost::hook_function_at",
445 ][::core::mem::offset_of!(AnvilHost, hook_function_at) - 104usize];
446 [
447 "Offset of field: AnvilHost::mid_hook_at",
448 ][::core::mem::offset_of!(AnvilHost, mid_hook_at) - 112usize];
449 [
450 "Offset of field: AnvilHost::remove",
451 ][::core::mem::offset_of!(AnvilHost, remove) - 120usize];
452 [
453 "Offset of field: AnvilHost::begin_group",
454 ][::core::mem::offset_of!(AnvilHost, begin_group) - 128usize];
455 [
456 "Offset of field: AnvilHost::commit_group",
457 ][::core::mem::offset_of!(AnvilHost, commit_group) - 136usize];
458 [
459 "Offset of field: AnvilHost::abort_group",
460 ][::core::mem::offset_of!(AnvilHost, abort_group) - 144usize];
461 [
462 "Offset of field: AnvilHost::address_of",
463 ][::core::mem::offset_of!(AnvilHost, address_of) - 152usize];
464 [
465 "Offset of field: AnvilHost::symbol_value",
466 ][::core::mem::offset_of!(AnvilHost, symbol_value) - 160usize];
467 [
468 "Offset of field: AnvilHost::setting_bool",
469 ][::core::mem::offset_of!(AnvilHost, setting_bool) - 168usize];
470 [
471 "Offset of field: AnvilHost::setting_int",
472 ][::core::mem::offset_of!(AnvilHost, setting_int) - 176usize];
473 [
474 "Offset of field: AnvilHost::setting_float",
475 ][::core::mem::offset_of!(AnvilHost, setting_float) - 184usize];
476 [
477 "Offset of field: AnvilHost::setting_string",
478 ][::core::mem::offset_of!(AnvilHost, setting_string) - 192usize];
479 [
480 "Offset of field: AnvilHost::subscribe_setting",
481 ][::core::mem::offset_of!(AnvilHost, subscribe_setting) - 200usize];
482 [
483 "Offset of field: AnvilHost::register_service",
484 ][::core::mem::offset_of!(AnvilHost, register_service) - 208usize];
485 [
486 "Offset of field: AnvilHost::get_service",
487 ][::core::mem::offset_of!(AnvilHost, get_service) - 216usize];
488 [
489 "Offset of field: AnvilHost::subscribe",
490 ][::core::mem::offset_of!(AnvilHost, subscribe) - 224usize];
491 [
492 "Offset of field: AnvilHost::publish",
493 ][::core::mem::offset_of!(AnvilHost, publish) - 232usize];
494};