1macro_rules! ptr {
2 ($e:expr) => {
3 $e.as_ptr().cast()
4 };
5}
6
7macro_rules! bail_if_null {
8 ($e:expr) => {
9 if $e.is_null() {
10 return Err(
11 #[allow(unused_unsafe)]
12 unsafe {
13 winapi::um::errhandlingapi::GetLastError()
14 },
15 );
16 }
17 };
18}
19
20macro_rules! bail_if_nonzero {
21 ($e:expr) => {
22 if $e != 0 {
23 return Err(
24 #[allow(unused_unsafe)]
25 unsafe {
26 winapi::um::errhandlingapi::GetLastError()
27 },
28 );
29 }
30 };
31}
32
33macro_rules! bail_if_zero {
34 ($e:expr) => {
35 if $e == 0 {
36 return Err(
37 #[allow(unused_unsafe)]
38 unsafe {
39 winapi::um::errhandlingapi::GetLastError()
40 },
41 );
42 }
43 };
44}
45
46#[repr(C)]
47#[derive(Debug)]
48pub struct Pointers {
49 llw: *mut (),
50 gpa: *mut (),
51 gle: *mut (),
52 err: u32,
53}
54
55use crate::windows_prelude::*;
56
57pub fn get_fn_pointers() -> Pointers {
58 unsafe {
59 let k32 = GetModuleHandleA(ptr!(b"Kernel32.dll\0"));
60 let llw = GetProcAddress(k32, ptr!(b"LoadLibraryW\0")).cast();
61 let gpa = GetProcAddress(k32, ptr!(b"GetProcAddress\0")).cast();
62 let gle = GetProcAddress(k32, ptr!(b"GetLastError\0")).cast();
63 let err = 0;
64
65 debug_assert!(k32 != NULL as _ && llw != NULL as _ && gpa != NULL as _ && gle != NULL as _);
67
68 Pointers { llw, gpa, gle, err }
69 }
70}
71
72pub fn alloc(process: HANDLE, size: usize) -> LPVOID {
73 unsafe {
74 VirtualAllocEx(
75 process,
76 NULL,
77 size,
78 MEM_COMMIT | MEM_RESERVE,
79 PAGE_EXECUTE_READWRITE,
80 )
81 }
82}