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}