1use ctypes::c_void;
8use shared::basetsd::{PSIZE_T, PULONG_PTR, SIZE_T, ULONG64, ULONG_PTR};
9use shared::minwindef::{
10 BOOL, DWORD, LPCVOID, LPDWORD, LPVOID, PBOOL, PDWORD, PULONG, UINT, ULONG,
11};
12use um::minwinbase::{LPSECURITY_ATTRIBUTES, PSECURITY_ATTRIBUTES};
13use um::winnt::{
14 HANDLE, LPCWSTR, PCWSTR, PMEMORY_BASIC_INFORMATION, PVOID, SECTION_ALL_ACCESS,
15 SECTION_MAP_EXECUTE_EXPLICIT, SECTION_MAP_READ, SECTION_MAP_WRITE,
16};
17pub const FILE_MAP_WRITE: DWORD = SECTION_MAP_WRITE;
18pub const FILE_MAP_READ: DWORD = SECTION_MAP_READ;
19pub const FILE_MAP_ALL_ACCESS: DWORD = SECTION_ALL_ACCESS;
20pub const FILE_MAP_EXECUTE: DWORD = SECTION_MAP_EXECUTE_EXPLICIT;
21pub const FILE_MAP_COPY: DWORD = 0x00000001;
22pub const FILE_MAP_RESERVE: DWORD = 0x80000000;
23pub const FILE_MAP_TARGETS_INVALID: DWORD = 0x40000000;
24pub const FILE_MAP_LARGE_PAGES: DWORD = 0x20000000;
25extern "system" {
26 pub fn VirtualAlloc(
27 lpAddress: LPVOID,
28 dwSize: SIZE_T,
29 flAllocationType: DWORD,
30 flProtect: DWORD,
31 ) -> LPVOID;
32 pub fn VirtualProtect(
33 lpAddress: LPVOID,
34 dwSize: SIZE_T,
35 flNewProtect: DWORD,
36 lpflOldProtect: PDWORD,
37 ) -> BOOL;
38 pub fn VirtualFree(
39 lpAddress: LPVOID,
40 dwSize: SIZE_T,
41 dwFreeType: DWORD,
42 ) -> BOOL;
43 pub fn VirtualQuery(
44 lpAddress: LPCVOID,
45 lpBuffer: PMEMORY_BASIC_INFORMATION,
46 dwLength: SIZE_T,
47 ) -> SIZE_T;
48 pub fn VirtualAllocEx(
49 hProcess: HANDLE,
50 lpAddress: LPVOID,
51 dwSize: SIZE_T,
52 flAllocationType: DWORD,
53 flProtect: DWORD,
54 ) -> LPVOID;
55 pub fn VirtualFreeEx(
56 hProcess: HANDLE,
57 lpAddress: LPVOID,
58 dwSize: SIZE_T,
59 dwFreeType: DWORD,
60 ) -> BOOL;
61 pub fn VirtualProtectEx(
62 hProcess: HANDLE,
63 lpAddress: LPVOID,
64 dwSize: SIZE_T,
65 flNewProtect: DWORD,
66 lpflOldProtect: PDWORD,
67 ) -> BOOL;
68 pub fn VirtualQueryEx(
69 hProcess: HANDLE,
70 lpAddress: LPCVOID,
71 lpBuffer: PMEMORY_BASIC_INFORMATION,
72 dwLength: SIZE_T,
73 ) -> SIZE_T;
74 pub fn ReadProcessMemory(
75 hProcess: HANDLE,
76 lpBaseAddress: LPCVOID,
77 lpBuffer: LPVOID,
78 nSize: SIZE_T,
79 lpNumberOfBytesRead: *mut SIZE_T,
80 ) -> BOOL;
81 pub fn WriteProcessMemory(
82 hProcess: HANDLE,
83 lpBaseAddress: LPVOID,
84 lpBuffer: LPCVOID,
85 nSize: SIZE_T,
86 lpNumberOfBytesWritten: *mut SIZE_T,
87 ) -> BOOL;
88 pub fn CreateFileMappingW(
89 hFile: HANDLE,
90 lpFileMappingAttributes: LPSECURITY_ATTRIBUTES,
91 flProtect: DWORD,
92 dwMaximumSizeHigh: DWORD,
93 dwMaximumSizeLow: DWORD,
94 lpName: LPCWSTR,
95 ) -> HANDLE;
96 pub fn OpenFileMappingW(
97 dwDesiredAccess: DWORD,
98 bInheritHandle: BOOL,
99 lpName: LPCWSTR,
100 ) -> HANDLE;
101 pub fn MapViewOfFile(
102 hFileMappingObject: HANDLE,
103 dwDesiredAccess: DWORD,
104 dwFileOffsetHigh: DWORD,
105 dwFileOffsetLow: DWORD,
106 dwNumberOfBytesToMap: SIZE_T,
107 ) -> LPVOID;
108 pub fn MapViewOfFileEx(
109 hFileMappingObject: HANDLE,
110 dwDesiredAccess: DWORD,
111 dwFileOffsetHigh: DWORD,
112 dwFileOffsetLow: DWORD,
113 dwNumberOfBytesToMap: SIZE_T,
114 lpBaseAddress: LPVOID,
115 ) -> LPVOID;
116 pub fn FlushViewOfFile(
117 lpBaseAddress: LPCVOID,
118 dwNumberOfBytesToFlush: SIZE_T,
119 ) -> BOOL;
120 pub fn UnmapViewOfFile(
121 lpBaseAddress: LPCVOID,
122 ) -> BOOL;
123 pub fn GetLargePageMinimum() -> SIZE_T;
124 pub fn GetProcessWorkingSetSizeEx(
125 hProcess: HANDLE,
126 lpMinimumWorkingSetSize: PSIZE_T,
127 lpMaximumWorkingSetSize: PSIZE_T,
128 Flags: PDWORD,
129 ) -> BOOL;
130 pub fn SetProcessWorkingSetSizeEx(
131 hProcess: HANDLE,
132 dwMinimumWorkingSetSize: SIZE_T,
133 dwMaximumWorkingSetSize: SIZE_T,
134 Flags: DWORD,
135 ) -> BOOL;
136 pub fn VirtualLock(
137 lpAddress: LPVOID,
138 dwSize: SIZE_T,
139 ) -> BOOL;
140 pub fn VirtualUnlock(
141 lpAddress: LPVOID,
142 dwSize: SIZE_T,
143 ) -> BOOL;
144 pub fn GetWriteWatch(
145 dwFlags: DWORD,
146 lpBaseAddress: PVOID,
147 dwRegionSize: SIZE_T,
148 lpAddresses: *mut PVOID,
149 lpdwCount: *mut ULONG_PTR,
150 lpdwGranularity: LPDWORD,
151 ) -> UINT;
152 pub fn ResetWriteWatch(
153 lpBaseAddress: LPVOID,
154 dwRegionSize: SIZE_T,
155 ) -> UINT;
156}
157ENUM!{enum MEMORY_RESOURCE_NOTIFICATION_TYPE {
158 LowMemoryResourceNotification,
159 HighMemoryResourceNotification,
160}}
161extern "system" {
162 pub fn CreateMemoryResourceNotification(
163 NotificationType: MEMORY_RESOURCE_NOTIFICATION_TYPE,
164 ) -> HANDLE;
165 pub fn QueryMemoryResourceNotification(
166 ResourceNotificationHandle: HANDLE,
167 ResourceState: PBOOL,
168 ) -> BOOL;
169}
170pub const FILE_CACHE_MAX_HARD_ENABLE: DWORD = 0x00000001;
171pub const FILE_CACHE_MAX_HARD_DISABLE: DWORD = 0x00000002;
172pub const FILE_CACHE_MIN_HARD_ENABLE: DWORD = 0x00000004;
173pub const FILE_CACHE_MIN_HARD_DISABLE: DWORD = 0x00000008;
174extern "system" {
175 pub fn GetSystemFileCacheSize(
176 lpMinimumFileCacheSize: PSIZE_T,
177 lpMaximumFileCacheSize: PSIZE_T,
178 lpFlags: PDWORD,
179 ) -> BOOL;
180 pub fn SetSystemFileCacheSize(
181 MinimumFileCacheSize: SIZE_T,
182 MaximumFileCacheSize: SIZE_T,
183 Flags: DWORD,
184 ) -> BOOL;
185 pub fn CreateFileMappingNumaW(
186 hFile: HANDLE,
187 lpFileMappingAttributes: LPSECURITY_ATTRIBUTES,
188 flProtect: DWORD,
189 dwMaximumSizeHigh: DWORD,
190 dwMaximumSizeLow: DWORD,
191 lpName: LPCWSTR,
192 nndPreferred: DWORD,
193 ) -> HANDLE;
194}
195STRUCT!{struct WIN32_MEMORY_RANGE_ENTRY {
196 VirtualAddress: PVOID,
197 NumberOfBytes: SIZE_T,
198}}
199pub type PWIN32_MEMORY_RANGE_ENTRY = *mut WIN32_MEMORY_RANGE_ENTRY;
200extern "system" {
201 pub fn PrefetchVirtualMemory(
202 hProcess: HANDLE,
203 NumberOfEntries: ULONG_PTR,
204 VirtualAddresses: PWIN32_MEMORY_RANGE_ENTRY,
205 Flags: ULONG,
206 ) -> BOOL;
207 pub fn CreateFileMappingFromApp(
208 hFile: HANDLE,
209 SecurityAttributes: PSECURITY_ATTRIBUTES,
210 PageProtection: ULONG,
211 MaximumSize: ULONG64,
212 Name: PCWSTR,
213 ) -> HANDLE;
214 pub fn MapViewOfFileFromApp(
215 hFileMappingObject: HANDLE,
216 DesiredAccess: ULONG,
217 FileOffset: ULONG64,
218 NumberOfBytesToMap: SIZE_T,
219 ) -> PVOID;
220 pub fn UnmapViewOfFileEx(
221 BaseAddress: PVOID,
222 UnmapFlags: ULONG,
223 ) -> BOOL;
224 pub fn AllocateUserPhysicalPages(
225 hProcess: HANDLE,
226 NumberOfPages: PULONG_PTR,
227 PageArray: PULONG_PTR,
228 ) -> BOOL;
229 pub fn FreeUserPhysicalPages(
230 hProcess: HANDLE,
231 NumberOfPages: PULONG_PTR,
232 PageArray: PULONG_PTR,
233 ) -> BOOL;
234 pub fn MapUserPhysicalPages(
235 VirtualAddress: PVOID,
236 NumberOfPages: ULONG_PTR,
237 PageArray: PULONG_PTR,
238 ) -> BOOL;
239 pub fn AllocateUserPhysicalPagesNuma(
240 hProcess: HANDLE,
241 NumberOfPages: PULONG_PTR,
242 PageArray: PULONG_PTR,
243 nndPreferred: DWORD,
244 ) -> BOOL;
245 pub fn VirtualAllocExNuma(
246 hProcess: HANDLE,
247 lpAddress: LPVOID,
248 dwSize: SIZE_T,
249 flAllocationType: DWORD,
250 flProtect: DWORD,
251 nndPreferred: DWORD,
252 ) -> LPVOID;
253}
254pub const MEHC_PATROL_SCRUBBER_PRESENT: ULONG = 0x1;
255extern "system" {
256 pub fn GetMemoryErrorHandlingCapabilities(
257 Capabilities: PULONG,
258 ) -> BOOL;
259}
260FN!{stdcall PBAD_MEMORY_CALLBACK_ROUTINE() -> ()}
261extern "system" {
262 pub fn RegisterBadMemoryNotification(
263 Callback: PBAD_MEMORY_CALLBACK_ROUTINE,
264 ) -> PVOID;
265 pub fn UnregisterBadMemoryNotification(
266 RegistrationHandle: PVOID,
267 ) -> BOOL;
268}
269ENUM!{enum OFFER_PRIORITY {
270 VmOfferPriorityVeryLow = 1,
271 VmOfferPriorityLow,
272 VmOfferPriorityBelowNormal,
273 VmOfferPriorityNormal,
274}}
275extern "system" {
276 pub fn OfferVirtualMemory(
277 VirtualAddress: PVOID,
278 Size: SIZE_T,
279 Priority: OFFER_PRIORITY,
280 ) -> DWORD;
281 pub fn ReclaimVirtualMemory(
282 VirtualAddress: *const c_void,
283 Size: SIZE_T,
284 ) -> DWORD;
285 pub fn DiscardVirtualMemory(
286 VirtualAddress: PVOID,
287 Size: SIZE_T,
288 ) -> DWORD;
289pub fn VirtualAllocFromApp(
298 BaseAddress: PVOID,
299 Size: SIZE_T,
300 AllocationType: ULONG,
301 Protection: ULONG,
302 ) -> PVOID;
303 pub fn VirtualProtectFromApp(
304 Address: PVOID,
305 Size: SIZE_T,
306 NewProtection: ULONG,
307 OldProtection: PULONG,
308 ) -> BOOL;
309 pub fn OpenFileMappingFromApp(
310 DesiredAccess: ULONG,
311 InheritHandle: BOOL,
312 Name: PCWSTR,
313 ) -> HANDLE;
314}
315ENUM!{enum WIN32_MEMORY_INFORMATION_CLASS {
318 MemoryRegionInfo,
319}}
320STRUCT!{struct WIN32_MEMORY_REGION_INFORMATION {
321 AllocationBase: PVOID,
322 AllocationProtect: ULONG,
323 u: WIN32_MEMORY_REGION_INFORMATION_u,
324 RegionSize: SIZE_T,
325 CommitSize: SIZE_T,
326}}
327UNION!{union WIN32_MEMORY_REGION_INFORMATION_u {
328 [u32; 1],
329 Flags Flags_mut: ULONG,
330 s s_mut: WIN32_MEMORY_REGION_INFORMATION_u_s,
331}}
332STRUCT!{struct WIN32_MEMORY_REGION_INFORMATION_u_s {
333 Bitfield: ULONG,
334}}
335BITFIELD!{WIN32_MEMORY_REGION_INFORMATION_u_s Bitfield: ULONG [
336 Private set_Private[0..1],
337 MappedDataFile set_MappedDataFile[1..2],
338 MappedImage set_MappedImage[2..3],
339 MappedPageFile set_MappedPageFile[3..4],
340 MappedPhysical set_MappedPhysical[4..5],
341 DirectMapped set_DirectMapped[5..6],
342 Reserved set_Reserved[6..32],
343]}
344extern "system" {
385 pub fn UnmapViewOfFile2(
386 ProcessHandle: HANDLE,
387 BaseAddress: PVOID,
388 UnmapFlags: ULONG,
389 ) -> BOOL;
390}