Skip to main content

djin/imp/
util.rs

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        // In theory, these should never ever be NULL, as kernel32.dll is always loaded.
66        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}