]>
Commit | Line | Data |
---|---|---|
ff7c6d11 XL |
1 | // Licensed under the Apache License, Version 2.0 |
2 | // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
3 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option. | |
4 | // All files in the project carrying such notice may not be copied, modified, or distributed | |
5 | // except according to those terms | |
6 | //! This module defines the 32-Bit Windows Base APIs | |
7 | use shared::basetsd::ULONG_PTR; | |
8 | use shared::minwindef::{BOOL, BYTE, DWORD, FILETIME, HMODULE, LPVOID, MAX_PATH, UINT, ULONG, WORD}; | |
9 | use shared::ntstatus::{ | |
10 | STATUS_ACCESS_VIOLATION, STATUS_ARRAY_BOUNDS_EXCEEDED, STATUS_BREAKPOINT, | |
11 | STATUS_CONTROL_C_EXIT, STATUS_DATATYPE_MISALIGNMENT, STATUS_FLOAT_DENORMAL_OPERAND, | |
12 | STATUS_FLOAT_DIVIDE_BY_ZERO, STATUS_FLOAT_INEXACT_RESULT, STATUS_FLOAT_INVALID_OPERATION, | |
13 | STATUS_FLOAT_OVERFLOW, STATUS_FLOAT_STACK_CHECK, STATUS_FLOAT_UNDERFLOW, | |
14 | STATUS_GUARD_PAGE_VIOLATION, STATUS_ILLEGAL_INSTRUCTION, STATUS_INTEGER_DIVIDE_BY_ZERO, | |
15 | STATUS_INTEGER_OVERFLOW, STATUS_INVALID_DISPOSITION, STATUS_INVALID_HANDLE, | |
16 | STATUS_IN_PAGE_ERROR, STATUS_NONCONTINUABLE_EXCEPTION, STATUS_PENDING, | |
17 | STATUS_POSSIBLE_DEADLOCK, STATUS_PRIVILEGED_INSTRUCTION, STATUS_SINGLE_STEP, | |
18 | STATUS_STACK_OVERFLOW, | |
19 | }; | |
20 | use um::winnt::{ | |
21 | CHAR, EXCEPTION_RECORD, HANDLE, LPSTR, LPWSTR, PCONTEXT, PRTL_CRITICAL_SECTION, | |
22 | PRTL_CRITICAL_SECTION_DEBUG, PVOID, RTL_CRITICAL_SECTION, RTL_CRITICAL_SECTION_DEBUG, WCHAR, | |
23 | }; | |
24 | //MoveMemory | |
25 | //CopyMemory | |
26 | //FillMemory | |
27 | //ZeroMemory | |
28 | STRUCT!{struct SECURITY_ATTRIBUTES { | |
29 | nLength: DWORD, | |
30 | lpSecurityDescriptor: LPVOID, | |
31 | bInheritHandle: BOOL, | |
32 | }} | |
33 | pub type PSECURITY_ATTRIBUTES = *mut SECURITY_ATTRIBUTES; | |
34 | pub type LPSECURITY_ATTRIBUTES = *mut SECURITY_ATTRIBUTES; | |
35 | STRUCT!{struct OVERLAPPED_u_s { | |
36 | Offset: DWORD, | |
37 | OffsetHigh: DWORD, | |
38 | }} | |
39 | UNION!{union OVERLAPPED_u { | |
40 | [u32; 2] [u64; 1], | |
41 | s s_mut: OVERLAPPED_u_s, | |
42 | Pointer Pointer_mut: PVOID, | |
43 | }} | |
44 | STRUCT!{struct OVERLAPPED { | |
45 | Internal: ULONG_PTR, | |
46 | InternalHigh: ULONG_PTR, | |
47 | u: OVERLAPPED_u, | |
48 | hEvent: HANDLE, | |
49 | }} | |
50 | pub type LPOVERLAPPED = *mut OVERLAPPED; | |
51 | STRUCT!{struct OVERLAPPED_ENTRY { | |
52 | lpCompletionKey: ULONG_PTR, | |
53 | lpOverlapped: LPOVERLAPPED, | |
54 | Internal: ULONG_PTR, | |
55 | dwNumberOfBytesTransferred: DWORD, | |
56 | }} | |
57 | pub type LPOVERLAPPED_ENTRY = *mut OVERLAPPED_ENTRY; | |
58 | STRUCT!{struct SYSTEMTIME { | |
59 | wYear: WORD, | |
60 | wMonth: WORD, | |
61 | wDayOfWeek: WORD, | |
62 | wDay: WORD, | |
63 | wHour: WORD, | |
64 | wMinute: WORD, | |
65 | wSecond: WORD, | |
66 | wMilliseconds: WORD, | |
67 | }} | |
68 | pub type PSYSTEMTIME = *mut SYSTEMTIME; | |
69 | pub type LPSYSTEMTIME = *mut SYSTEMTIME; | |
70 | STRUCT!{struct WIN32_FIND_DATAA { | |
71 | dwFileAttributes: DWORD, | |
72 | ftCreationTime: FILETIME, | |
73 | ftLastAccessTime: FILETIME, | |
74 | ftLastWriteTime: FILETIME, | |
75 | nFileSizeHigh: DWORD, | |
76 | nFileSizeLow: DWORD, | |
77 | dwReserved0: DWORD, | |
78 | dwReserved1: DWORD, | |
79 | cFileName: [CHAR; MAX_PATH], | |
80 | cAlternateFileName: [CHAR; 14], | |
81 | }} | |
82 | pub type PWIN32_FIND_DATAA = *mut WIN32_FIND_DATAA; | |
83 | pub type LPWIN32_FIND_DATAA = *mut WIN32_FIND_DATAA; | |
84 | STRUCT!{struct WIN32_FIND_DATAW { | |
85 | dwFileAttributes: DWORD, | |
86 | ftCreationTime: FILETIME, | |
87 | ftLastAccessTime: FILETIME, | |
88 | ftLastWriteTime: FILETIME, | |
89 | nFileSizeHigh: DWORD, | |
90 | nFileSizeLow: DWORD, | |
91 | dwReserved0: DWORD, | |
92 | dwReserved1: DWORD, | |
93 | cFileName: [WCHAR; MAX_PATH], | |
94 | cAlternateFileName: [WCHAR; 14], | |
95 | }} | |
96 | pub type PWIN32_FIND_DATAW = *mut WIN32_FIND_DATAW; | |
97 | pub type LPWIN32_FIND_DATAW = *mut WIN32_FIND_DATAW; | |
98 | ENUM!{enum FINDEX_INFO_LEVELS { | |
99 | FindExInfoStandard, | |
100 | FindExInfoBasic, | |
101 | FindExInfoMaxInfoLevel, | |
102 | }} | |
103 | pub const FIND_FIRST_EX_CASE_SENSITIVE: DWORD = 0x00000001; | |
104 | pub const FIND_FIRST_EX_LARGE_FETCH: DWORD = 0x00000002; | |
105 | ENUM!{enum FINDEX_SEARCH_OPS { | |
106 | FindExSearchNameMatch, | |
107 | FindExSearchLimitToDirectories, | |
108 | FindExSearchLimitToDevices, | |
109 | FindExSearchMaxSearchOp, | |
110 | }} | |
111 | ENUM!{enum GET_FILEEX_INFO_LEVELS { | |
112 | GetFileExInfoStandard, | |
113 | GetFileExMaxInfoLevel, | |
114 | }} | |
115 | ENUM!{enum FILE_INFO_BY_HANDLE_CLASS { | |
116 | FileBasicInfo, | |
117 | FileStandardInfo, | |
118 | FileNameInfo, | |
119 | FileRenameInfo, | |
120 | FileDispositionInfo, | |
121 | FileAllocationInfo, | |
122 | FileEndOfFileInfo, | |
123 | FileStreamInfo, | |
124 | FileCompressionInfo, | |
125 | FileAttributeTagInfo, | |
126 | FileIdBothDirectoryInfo, | |
127 | FileIdBothDirectoryRestartInfo, | |
128 | FileIoPriorityHintInfo, | |
129 | FileRemoteProtocolInfo, | |
130 | FileFullDirectoryInfo, | |
131 | FileFullDirectoryRestartInfo, | |
132 | FileStorageInfo, | |
133 | FileAlignmentInfo, | |
134 | FileIdInfo, | |
135 | FileIdExtdDirectoryInfo, | |
136 | FileIdExtdDirectoryRestartInfo, | |
137 | FileDispositionInfoEx, | |
138 | FileRenameInfoEx, | |
139 | MaximumFileInfoByHandleClass, | |
140 | }} | |
141 | pub type PFILE_INFO_BY_HANDLE_CLASS = *mut FILE_INFO_BY_HANDLE_CLASS; | |
142 | pub type CRITICAL_SECTION = RTL_CRITICAL_SECTION; | |
143 | pub type PCRITICAL_SECTION = PRTL_CRITICAL_SECTION; | |
144 | pub type LPCRITICAL_SECTION = PRTL_CRITICAL_SECTION; | |
145 | pub type CRITICAL_SECTION_DEBUG = RTL_CRITICAL_SECTION_DEBUG; | |
146 | pub type PCRITICAL_SECTION_DEBUG = PRTL_CRITICAL_SECTION_DEBUG; | |
147 | pub type LPCRITICAL_SECTION_DEBUG = PRTL_CRITICAL_SECTION_DEBUG; | |
148 | FN!{stdcall LPOVERLAPPED_COMPLETION_ROUTINE( | |
149 | dwErrorCode: DWORD, | |
150 | dwNumberOfBytesTransfered: DWORD, | |
151 | lpOverlapped: LPOVERLAPPED, | |
152 | ) -> ()} | |
153 | pub const LOCKFILE_FAIL_IMMEDIATELY: DWORD = 0x00000001; | |
154 | pub const LOCKFILE_EXCLUSIVE_LOCK: DWORD = 0x00000002; | |
155 | STRUCT!{struct PROCESS_HEAP_ENTRY_Block { | |
156 | hMem: HANDLE, | |
157 | dwReserved: [DWORD; 3], | |
158 | }} | |
159 | STRUCT!{struct PROCESS_HEAP_ENTRY_Region { | |
160 | dwCommittedSize: DWORD, | |
161 | dwUnCommittedSize: DWORD, | |
162 | lpFirstBlock: LPVOID, | |
163 | lpLastBlock: LPVOID, | |
164 | }} | |
165 | UNION!{union PROCESS_HEAP_ENTRY_u { | |
166 | [u32; 4] [u64; 3], | |
167 | Block Block_mut: PROCESS_HEAP_ENTRY_Block, | |
168 | Region Region_mut: PROCESS_HEAP_ENTRY_Region, | |
169 | }} | |
170 | STRUCT!{struct PROCESS_HEAP_ENTRY { | |
171 | lpData: PVOID, | |
172 | cbData: DWORD, | |
173 | cbOverhead: BYTE, | |
174 | iRegionIndex: BYTE, | |
175 | wFlags: WORD, | |
176 | u: PROCESS_HEAP_ENTRY_u, | |
177 | }} | |
178 | pub type LPPROCESS_HEAP_ENTRY = *mut PROCESS_HEAP_ENTRY; | |
179 | pub type PPROCESS_HEAP_ENTRY = *mut PROCESS_HEAP_ENTRY; | |
180 | pub const PROCESS_HEAP_REGION: WORD = 0x0001; | |
181 | pub const PROCESS_HEAP_UNCOMMITTED_RANGE: WORD = 0x0002; | |
182 | pub const PROCESS_HEAP_ENTRY_BUSY: WORD = 0x0004; | |
183 | pub const PROCESS_HEAP_SEG_ALLOC: WORD = 0x0008; | |
184 | pub const PROCESS_HEAP_ENTRY_MOVEABLE: WORD = 0x0010; | |
185 | pub const PROCESS_HEAP_ENTRY_DDESHARE: WORD = 0x0020; | |
186 | STRUCT!{struct REASON_CONTEXT_Detailed { | |
187 | LocalizedReasonModule: HMODULE, | |
188 | LocalizedReasonId: ULONG, | |
189 | ReasonStringCount: ULONG, | |
190 | ReasonStrings: *mut LPWSTR, | |
191 | }} | |
192 | UNION!{union REASON_CONTEXT_Reason { | |
193 | [u32; 4] [u64; 3], | |
194 | Detailed Detailed_mut: REASON_CONTEXT_Detailed, | |
195 | SimpleReasonString SimpleReasonString_mut: LPWSTR, | |
196 | }} | |
197 | STRUCT!{struct REASON_CONTEXT { | |
198 | Version: ULONG, | |
199 | Flags: DWORD, | |
200 | Reason: REASON_CONTEXT_Reason, | |
201 | }} | |
202 | pub type PREASON_CONTEXT = *mut REASON_CONTEXT; | |
203 | pub const EXCEPTION_DEBUG_EVENT: DWORD = 1; | |
204 | pub const CREATE_THREAD_DEBUG_EVENT: DWORD = 2; | |
205 | pub const CREATE_PROCESS_DEBUG_EVENT: DWORD = 3; | |
206 | pub const EXIT_THREAD_DEBUG_EVENT: DWORD = 4; | |
207 | pub const EXIT_PROCESS_DEBUG_EVENT: DWORD = 5; | |
208 | pub const LOAD_DLL_DEBUG_EVENT: DWORD = 6; | |
209 | pub const UNLOAD_DLL_DEBUG_EVENT: DWORD = 7; | |
210 | pub const OUTPUT_DEBUG_STRING_EVENT: DWORD = 8; | |
211 | pub const RIP_EVENT: DWORD = 9; | |
212 | FN!{stdcall PTHREAD_START_ROUTINE( | |
213 | lpThreadParameter: LPVOID, | |
214 | ) -> DWORD} | |
215 | pub type LPTHREAD_START_ROUTINE = PTHREAD_START_ROUTINE; | |
60c5eb7d XL |
216 | FN!{stdcall PENCLAVE_ROUTINE( |
217 | lpThreadParameter: LPVOID, | |
218 | ) -> DWORD} | |
219 | pub type LPENCLAVE_ROUTINE = PENCLAVE_ROUTINE; | |
ff7c6d11 XL |
220 | STRUCT!{struct EXCEPTION_DEBUG_INFO { |
221 | ExceptionRecord: EXCEPTION_RECORD, | |
222 | dwFirstChance: DWORD, | |
223 | }} | |
224 | pub type LPEXCEPTION_DEBUG_INFO = *mut EXCEPTION_DEBUG_INFO; | |
225 | STRUCT!{struct CREATE_THREAD_DEBUG_INFO { | |
226 | hThread: HANDLE, | |
227 | lpThreadLocalBase: LPVOID, | |
228 | lpStartAddress: LPTHREAD_START_ROUTINE, | |
229 | }} | |
230 | pub type LPCREATE_THREAD_DEBUG_INFO = *mut CREATE_THREAD_DEBUG_INFO; | |
231 | STRUCT!{struct CREATE_PROCESS_DEBUG_INFO { | |
232 | hFile: HANDLE, | |
233 | hProcess: HANDLE, | |
234 | hThread: HANDLE, | |
235 | lpBaseOfImage: LPVOID, | |
236 | dwDebugInfoFileOffset: DWORD, | |
237 | nDebugInfoSize: DWORD, | |
238 | lpThreadLocalBase: LPVOID, | |
239 | lpStartAddress: LPTHREAD_START_ROUTINE, | |
240 | lpImageName: LPVOID, | |
241 | fUnicode: WORD, | |
242 | }} | |
243 | pub type LPCREATE_PROCESS_DEBUG_INFO = *mut CREATE_PROCESS_DEBUG_INFO; | |
244 | STRUCT!{struct EXIT_THREAD_DEBUG_INFO { | |
245 | dwExitCode: DWORD, | |
246 | }} | |
247 | pub type LPEXIT_THREAD_DEBUG_INFO = *mut EXIT_THREAD_DEBUG_INFO; | |
248 | STRUCT!{struct EXIT_PROCESS_DEBUG_INFO { | |
249 | dwExitCode: DWORD, | |
250 | }} | |
251 | pub type LPEXIT_PROCESS_DEBUG_INFO = *mut EXIT_PROCESS_DEBUG_INFO; | |
252 | STRUCT!{struct LOAD_DLL_DEBUG_INFO { | |
253 | hFile: HANDLE, | |
254 | lpBaseOfDll: LPVOID, | |
255 | dwDebugInfoFileOffset: DWORD, | |
256 | nDebugInfoSize: DWORD, | |
257 | lpImageName: LPVOID, | |
258 | fUnicode: WORD, | |
259 | }} | |
260 | pub type LPLOAD_DLL_DEBUG_INFO = *mut LOAD_DLL_DEBUG_INFO; | |
261 | STRUCT!{struct UNLOAD_DLL_DEBUG_INFO { | |
262 | lpBaseOfDll: LPVOID, | |
263 | }} | |
264 | pub type LPUNLOAD_DLL_DEBUG_INFO = *mut UNLOAD_DLL_DEBUG_INFO; | |
265 | STRUCT!{struct OUTPUT_DEBUG_STRING_INFO { | |
266 | lpDebugStringData: LPSTR, | |
267 | fUnicode: WORD, | |
268 | nDebugStringLength: WORD, | |
269 | }} | |
270 | pub type LPOUTPUT_DEBUG_STRING_INFO = *mut OUTPUT_DEBUG_STRING_INFO; | |
271 | STRUCT!{struct RIP_INFO { | |
272 | dwError: DWORD, | |
273 | dwType: DWORD, | |
274 | }} | |
275 | pub type LPRIP_INFO = *mut RIP_INFO; | |
276 | UNION!{union DEBUG_EVENT_u { | |
277 | [u32; 21] [u64; 20], | |
278 | Exception Exception_mut: EXCEPTION_DEBUG_INFO, | |
279 | CreateThread CreateThread_mut: CREATE_THREAD_DEBUG_INFO, | |
280 | CreateProcessInfo CreateProcessInfo_mut: CREATE_PROCESS_DEBUG_INFO, | |
281 | ExitThread ExitThread_mut: EXIT_THREAD_DEBUG_INFO, | |
282 | ExitProcess ExitProcess_mut: EXIT_PROCESS_DEBUG_INFO, | |
283 | LoadDll LoadDll_mut: LOAD_DLL_DEBUG_INFO, | |
284 | UnloadDll UnloadDll_mut: UNLOAD_DLL_DEBUG_INFO, | |
285 | DebugString DebugString_mut: OUTPUT_DEBUG_STRING_INFO, | |
286 | RipInfo RipInfo_mut: RIP_INFO, | |
287 | }} | |
288 | STRUCT!{struct DEBUG_EVENT { | |
289 | dwDebugEventCode: DWORD, | |
290 | dwProcessId: DWORD, | |
291 | dwThreadId: DWORD, | |
292 | u: DEBUG_EVENT_u, | |
293 | }} | |
294 | pub type LPDEBUG_EVENT = *mut DEBUG_EVENT; | |
295 | pub type LPCONTEXT = PCONTEXT; | |
296 | pub const STILL_ACTIVE: DWORD = STATUS_PENDING as u32; | |
297 | pub const EXCEPTION_ACCESS_VIOLATION: DWORD = STATUS_ACCESS_VIOLATION as u32; | |
298 | pub const EXCEPTION_DATATYPE_MISALIGNMENT: DWORD = STATUS_DATATYPE_MISALIGNMENT as u32; | |
299 | pub const EXCEPTION_BREAKPOINT: DWORD = STATUS_BREAKPOINT as u32; | |
300 | pub const EXCEPTION_SINGLE_STEP: DWORD = STATUS_SINGLE_STEP as u32; | |
301 | pub const EXCEPTION_ARRAY_BOUNDS_EXCEEDED: DWORD = STATUS_ARRAY_BOUNDS_EXCEEDED as u32; | |
302 | pub const EXCEPTION_FLT_DENORMAL_OPERAND: DWORD = STATUS_FLOAT_DENORMAL_OPERAND as u32; | |
303 | pub const EXCEPTION_FLT_DIVIDE_BY_ZERO: DWORD = STATUS_FLOAT_DIVIDE_BY_ZERO as u32; | |
304 | pub const EXCEPTION_FLT_INEXACT_RESULT: DWORD = STATUS_FLOAT_INEXACT_RESULT as u32; | |
305 | pub const EXCEPTION_FLT_INVALID_OPERATION: DWORD = STATUS_FLOAT_INVALID_OPERATION as u32; | |
306 | pub const EXCEPTION_FLT_OVERFLOW: DWORD = STATUS_FLOAT_OVERFLOW as u32; | |
307 | pub const EXCEPTION_FLT_STACK_CHECK: DWORD = STATUS_FLOAT_STACK_CHECK as u32; | |
308 | pub const EXCEPTION_FLT_UNDERFLOW: DWORD = STATUS_FLOAT_UNDERFLOW as u32; | |
309 | pub const EXCEPTION_INT_DIVIDE_BY_ZERO: DWORD = STATUS_INTEGER_DIVIDE_BY_ZERO as u32; | |
310 | pub const EXCEPTION_INT_OVERFLOW: DWORD = STATUS_INTEGER_OVERFLOW as u32; | |
311 | pub const EXCEPTION_PRIV_INSTRUCTION: DWORD = STATUS_PRIVILEGED_INSTRUCTION as u32; | |
312 | pub const EXCEPTION_IN_PAGE_ERROR: DWORD = STATUS_IN_PAGE_ERROR as u32; | |
313 | pub const EXCEPTION_ILLEGAL_INSTRUCTION: DWORD = STATUS_ILLEGAL_INSTRUCTION as u32; | |
314 | pub const EXCEPTION_NONCONTINUABLE_EXCEPTION: DWORD = STATUS_NONCONTINUABLE_EXCEPTION as u32; | |
315 | pub const EXCEPTION_STACK_OVERFLOW: DWORD = STATUS_STACK_OVERFLOW as u32; | |
316 | pub const EXCEPTION_INVALID_DISPOSITION: DWORD = STATUS_INVALID_DISPOSITION as u32; | |
317 | pub const EXCEPTION_GUARD_PAGE: DWORD = STATUS_GUARD_PAGE_VIOLATION as u32; | |
318 | pub const EXCEPTION_INVALID_HANDLE: DWORD = STATUS_INVALID_HANDLE as u32; | |
319 | pub const EXCEPTION_POSSIBLE_DEADLOCK: DWORD = STATUS_POSSIBLE_DEADLOCK as u32; | |
320 | pub const CONTROL_C_EXIT: DWORD = STATUS_CONTROL_C_EXIT as u32; | |
321 | pub const LMEM_FIXED: UINT = 0x0000; | |
322 | pub const LMEM_MOVEABLE: UINT = 0x0002; | |
323 | pub const LMEM_NOCOMPACT: UINT = 0x0010; | |
324 | pub const LMEM_NODISCARD: UINT = 0x0020; | |
325 | pub const LMEM_ZEROINIT: UINT = 0x0040; | |
326 | pub const LMEM_MODIFY: UINT = 0x0080; | |
327 | pub const LMEM_DISCARDABLE: UINT = 0x0F00; | |
328 | pub const LMEM_VALID_FLAGS: UINT = 0x0F72; | |
329 | pub const LMEM_INVALID_HANDLE: UINT = 0x8000; | |
330 | pub const LHND: UINT = LMEM_MOVEABLE | LMEM_ZEROINIT; | |
331 | pub const LPTR: UINT = LMEM_FIXED | LMEM_ZEROINIT; | |
332 | pub const NONZEROLHND: UINT = LMEM_MOVEABLE; | |
333 | pub const NONZEROLPTR: UINT = LMEM_FIXED; | |
334 | //LocalDiscard | |
335 | pub const LMEM_DISCARDED: UINT = 0x4000; | |
336 | pub const LMEM_LOCKCOUNT: UINT = 0x00FF; | |
8faf50e0 | 337 | pub const NUMA_NO_PREFERRED_NODE: DWORD = -1i32 as u32; |