winapi_comm/
kernal32.rs

1#![allow(non_camel_case_types)]
2#![allow(unused)]
3#![allow(non_snake_case)]
4
5use crate::DWORD;
6
7pub type LPVOID = *mut std::os::raw::c_void;
8
9pub type SIZE_T = usize;
10
11pub type BOOL = bool;
12pub type HANDLE = *const std::os::raw::c_void;
13pub type LPCSTR = *const u8;
14pub type HMODULE = *const std::os::raw::c_void;
15
16
17/// https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc
18pub mod AllocationType {
19    use crate::DWORD;
20
21    pub const MEM_COMMIT: DWORD = 0x00001000;
22    pub const MEM_RESERVE: DWORD = 0x00002000;
23    pub const MEM_RESET: DWORD = 0x00080000;
24    pub const MEM_RESET_UNDO: DWORD = 0x1000000;
25
26    // This parameter can also specify the following values as indicated.
27
28    pub const MEM_LARGE_PAGES: DWORD = 0x20000000;
29    pub const MEM_PHYSICAL: DWORD = 0x00400000;
30    pub const MEM_TOP_DOWN: DWORD = 0x00100000;
31    pub const MEM_WRITE_WATCH: DWORD = 0x00200000;
32}
33
34/// https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection-constants
35pub mod Protect {
36    use crate::DWORD;
37
38    pub const PAGE_EXECUTE: DWORD = 0x10;
39    pub const PAGE_EXECUTE_READ: DWORD = 0x20;
40    pub const PAGE_EXECUTE_READWRITE: DWORD = 0x40;
41    pub const PAGE_EXECUTE_WRITECOPY: DWORD = 0x80;
42    pub const PAGE_NOACCESS: DWORD = 0x01;
43    pub const PAGE_READONLY: DWORD = 0x02;
44    pub const PAGE_READWRITE: DWORD = 0x04;
45    pub const PAGE_WRITECOPY: DWORD = 0x08;
46    pub const PAGE_TARGETS_INVALID: DWORD = 0x40000000;
47    pub const PAGE_TARGETS_NO_UPDATE: DWORD = 0x40000000;
48
49    // The following are modifiers that can be used in addition to the options provided in the previous table, except as noted.
50
51    pub const PAGE_GUARD: DWORD = 0x100;
52    pub const PAGE_NOCACHE: DWORD = 0x200;
53    pub const PAGE_WRITECOMBINE: DWORD = 0x400;
54}
55
56
57/// https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualfreeex
58pub mod FreeType {
59    use crate::DWORD;
60
61    pub const MEM_DECOMMIT: DWORD = 0x00004000;
62    pub const MEM_RELEASE: DWORD = 0x00008000;
63
64    // When using MEM_RELEASE, this parameter can additionally specify one of the following values.
65
66    pub const MEM_COALESCE_PLACEHOLDERS: DWORD = 0x00000001;
67    pub const MEM_PRESERVE_PLACEHOLDER: DWORD = 0x00000002;
68}
69
70
71#[link(name = "Kernel32", kind = "dylib")]
72extern "system" {
73
74    /// https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror
75    /// ```
76    /// _Post_equals_last_error_ DWORD GetLastError();
77    /// ```
78    pub fn GetLastError() -> DWORD;
79
80    /// https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc
81    /// ```
82    /// LPVOID VirtualAlloc(
83    ///   [in, optional] LPVOID lpAddress,
84    ///   [in]           SIZE_T dwSize,
85    ///   [in]           DWORD  flAllocationType,
86    ///   [in]           DWORD  flProtect
87    /// );
88    /// ```
89    pub fn VirtualAlloc(
90        lpAddress: LPVOID,
91        dwSize: usize,
92        flAllocationType: DWORD,
93        flProtect: DWORD,
94    ) -> LPVOID;
95
96    ///
97    /// https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualfree
98    /// ```
99    /// BOOL VirtualFree(
100    ///  [in] LPVOID lpAddress,
101    ///   [in] SIZE_T dwSize,
102    ///   [in] DWORD  dwFreeType
103    /// );
104    /// ```
105    pub fn VirtualFree(lpAddress: LPVOID, dw_size: SIZE_T, dwFreeType: DWORD) -> BOOL;
106
107    /// https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualallocex
108    /// ```
109    /// LPVOID VirtualAllocEx(
110    ///   [in]           HANDLE hProcess,
111    ///   [in, optional] LPVOID lpAddress,
112    ///   [in]           SIZE_T dwSize,
113    ///   [in]           DWORD  flAllocationType,
114    ///   [in]           DWORD  flProtect
115    /// );
116    /// ```
117    pub fn VirtualAllocEx(
118        hProcess: HANDLE,
119        lpAddress: LPVOID,
120        dwSize: SIZE_T,
121        flAllocationType: DWORD,
122        flProtect: DWORD,
123    ) -> LPVOID;
124
125    /// https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualfreeex
126    /// ```
127    ///  BOOL VirtualFreeEx(
128    ///    [in] HANDLE hProcess,
129    ///    [in] LPVOID lpAddress,
130    ///    [in] SIZE_T dwSize,
131    ///    [in] DWORD  dwFreeType
132    ///  );
133    /// ```
134    pub fn VirtualFreeEx(
135        hProcess: HANDLE,
136        lpAddress: LPVOID,
137        dwSize: SIZE_T,
138        dwFreeType: DWORD,
139    ) -> LPVOID;
140
141    /// https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya
142    /// ```
143    /// HMODULE LoadLibraryA(
144    ///   [in] LPCSTR lpLibFileName
145    /// );
146    /// ```
147    pub fn LoadLibraryA(lpLibFileName: LPCSTR) -> HMODULE;
148
149    /// https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-freelibrary
150    /// ```
151    /// BOOL FreeLibrary(
152    ///   [in] HMODULE hLibModule
153    /// );
154    /// ```
155    pub fn FreeLibrary(hLibModule: HMODULE) -> BOOL;
156
157    /// https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlea
158    /// ```
159    /// HMODULE GetModuleHandleA(
160    ///   [in, optional] LPCSTR lpModuleName
161    /// );
162    /// ```
163    pub fn GetModuleHandleA(lpModuleName: LPCSTR) -> HMODULE;
164
165    /// https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getprocaddress
166    /// ```
167    /// FARPROC GetProcAddress(
168    ///   [in] HMODULE hModule,
169    ///   [in] LPCSTR  lpProcName
170    /// );
171    /// ```
172    pub fn GetProcAddress(hModule: HMODULE, lpProcName: LPCSTR) -> LPVOID;
173
174}
175
176
177
178#[cfg(test)]
179mod tests {
180    use super::*;
181
182    #[test]
183    fn test_library() {
184        unsafe {
185            
186            let hModule = LoadLibraryA("User32.dll\0".as_ptr());
187
188            assert!(!hModule.is_null());
189
190            let hModule = GetModuleHandleA("User32.dll\0".as_ptr());
191
192            assert!(!hModule.is_null());
193
194            let MessageBoxA = GetProcAddress(hModule, "MessageBoxA\0".as_ptr());
195
196            assert!(!MessageBoxA.is_null());
197
198            // int MessageBoxA(
199            //   [in, optional] HWND   hWnd,
200            //   [in, optional] LPCSTR lpText,
201            //   [in, optional] LPCSTR lpCaption,
202            //   [in]           UINT   uType
203            // );
204            let MessageBoxA: extern "C" fn(LPVOID, LPCSTR, LPCSTR, u32) =
205                std::mem::transmute(MessageBoxA);
206
207            MessageBoxA(std::ptr::null_mut(), "Test\0".as_ptr(), "aaa\0".as_ptr(), 1);
208
209            FreeLibrary(hModule);
210
211            assert_eq!(0, GetLastError());
212        }
213    }
214
215    #[test]
216    fn test_ffi() {
217        unsafe {
218            let ptr = VirtualAlloc(
219                std::ptr::null_mut(),
220                1024,
221                AllocationType::MEM_COMMIT,
222                Protect::PAGE_READWRITE,
223            );
224
225            assert!(!ptr.is_null());
226
227            let arr = ptr as *mut DWORD;
228
229            *arr = 10;
230
231            let arr = std::slice::from_raw_parts_mut(arr, 10);
232
233            println!("{:?}", arr);
234
235            assert!(VirtualFree(ptr, 0, FreeType::MEM_RELEASE));
236
237        }
238    }
239}