1 // Copyright © 2016-2017 winapi-rs developers
2 // Licensed under the Apache License, Version 2.0
3 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
4 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
5 // All files in the project carrying such notice may not be copied, modified, or distributed
6 // except according to those terms
7 //! This module defines the 32-Bit Windows Base APIs
8 use shared
::basetsd
::ULONG_PTR
;
9 use shared
::minwindef
::{BOOL, BYTE, DWORD, FILETIME, HMODULE, LPVOID, MAX_PATH, UINT, ULONG, WORD}
;
10 use shared
::ntstatus
::{
11 STATUS_ACCESS_VIOLATION
, STATUS_ARRAY_BOUNDS_EXCEEDED
, STATUS_BREAKPOINT
,
12 STATUS_CONTROL_C_EXIT
, STATUS_DATATYPE_MISALIGNMENT
, STATUS_FLOAT_DENORMAL_OPERAND
,
13 STATUS_FLOAT_DIVIDE_BY_ZERO
, STATUS_FLOAT_INEXACT_RESULT
, STATUS_FLOAT_INVALID_OPERATION
,
14 STATUS_FLOAT_OVERFLOW
, STATUS_FLOAT_STACK_CHECK
, STATUS_FLOAT_UNDERFLOW
,
15 STATUS_GUARD_PAGE_VIOLATION
, STATUS_ILLEGAL_INSTRUCTION
, STATUS_INTEGER_DIVIDE_BY_ZERO
,
16 STATUS_INTEGER_OVERFLOW
, STATUS_INVALID_DISPOSITION
, STATUS_INVALID_HANDLE
,
17 STATUS_IN_PAGE_ERROR
, STATUS_NONCONTINUABLE_EXCEPTION
, STATUS_PENDING
,
18 STATUS_POSSIBLE_DEADLOCK
, STATUS_PRIVILEGED_INSTRUCTION
, STATUS_SINGLE_STEP
,
19 STATUS_STACK_OVERFLOW
,
22 CHAR
, EXCEPTION_RECORD
, HANDLE
, LPSTR
, LPWSTR
, PCONTEXT
, PRTL_CRITICAL_SECTION
,
23 PRTL_CRITICAL_SECTION_DEBUG
, PVOID
, RTL_CRITICAL_SECTION
, RTL_CRITICAL_SECTION_DEBUG
, WCHAR
,
29 STRUCT
!{struct SECURITY_ATTRIBUTES
{
31 lpSecurityDescriptor
: LPVOID
,
34 pub type PSECURITY_ATTRIBUTES
= *mut SECURITY_ATTRIBUTES
;
35 pub type LPSECURITY_ATTRIBUTES
= *mut SECURITY_ATTRIBUTES
;
36 STRUCT
!{struct OVERLAPPED_u_s
{
40 UNION
!{union OVERLAPPED_u
{
42 s s_mut
: OVERLAPPED_u_s
,
43 Pointer Pointer_mut
: PVOID
,
45 STRUCT
!{struct OVERLAPPED
{
47 InternalHigh
: ULONG_PTR
,
51 pub type LPOVERLAPPED
= *mut OVERLAPPED
;
52 STRUCT
!{struct OVERLAPPED_ENTRY
{
53 lpCompletionKey
: ULONG_PTR
,
54 lpOverlapped
: LPOVERLAPPED
,
56 dwNumberOfBytesTransferred
: DWORD
,
58 pub type LPOVERLAPPED_ENTRY
= *mut OVERLAPPED_ENTRY
;
59 STRUCT
!{struct SYSTEMTIME
{
69 pub type PSYSTEMTIME
= *mut SYSTEMTIME
;
70 pub type LPSYSTEMTIME
= *mut SYSTEMTIME
;
71 STRUCT
!{struct WIN32_FIND_DATAA
{
72 dwFileAttributes
: DWORD
,
73 ftCreationTime
: FILETIME
,
74 ftLastAccessTime
: FILETIME
,
75 ftLastWriteTime
: FILETIME
,
80 cFileName
: [CHAR
; MAX_PATH
],
81 cAlternateFileName
: [CHAR
; 14],
83 pub type PWIN32_FIND_DATAA
= *mut WIN32_FIND_DATAA
;
84 pub type LPWIN32_FIND_DATAA
= *mut WIN32_FIND_DATAA
;
85 STRUCT
!{struct WIN32_FIND_DATAW
{
86 dwFileAttributes
: DWORD
,
87 ftCreationTime
: FILETIME
,
88 ftLastAccessTime
: FILETIME
,
89 ftLastWriteTime
: FILETIME
,
94 cFileName
: [WCHAR
; MAX_PATH
],
95 cAlternateFileName
: [WCHAR
; 14],
97 pub type PWIN32_FIND_DATAW
= *mut WIN32_FIND_DATAW
;
98 pub type LPWIN32_FIND_DATAW
= *mut WIN32_FIND_DATAW
;
99 ENUM
!{enum FINDEX_INFO_LEVELS
{
102 FindExInfoMaxInfoLevel
,
104 pub const FIND_FIRST_EX_CASE_SENSITIVE
: DWORD
= 0x00000001;
105 pub const FIND_FIRST_EX_LARGE_FETCH
: DWORD
= 0x00000002;
106 ENUM
!{enum FINDEX_SEARCH_OPS
{
107 FindExSearchNameMatch
,
108 FindExSearchLimitToDirectories
,
109 FindExSearchLimitToDevices
,
110 FindExSearchMaxSearchOp
,
112 ENUM
!{enum GET_FILEEX_INFO_LEVELS
{
113 GetFileExInfoStandard
,
114 GetFileExMaxInfoLevel
,
116 ENUM
!{enum FILE_INFO_BY_HANDLE_CLASS
{
126 FileAttributeTagInfo
,
127 FileIdBothDirectoryInfo
,
128 FileIdBothDirectoryRestartInfo
,
129 FileIoPriorityHintInfo
,
130 FileRemoteProtocolInfo
,
131 FileFullDirectoryInfo
,
132 FileFullDirectoryRestartInfo
,
136 FileIdExtdDirectoryInfo
,
137 FileIdExtdDirectoryRestartInfo
,
138 FileDispositionInfoEx
,
140 MaximumFileInfoByHandleClass
,
142 pub type PFILE_INFO_BY_HANDLE_CLASS
= *mut FILE_INFO_BY_HANDLE_CLASS
;
143 pub type CRITICAL_SECTION
= RTL_CRITICAL_SECTION
;
144 pub type PCRITICAL_SECTION
= PRTL_CRITICAL_SECTION
;
145 pub type LPCRITICAL_SECTION
= PRTL_CRITICAL_SECTION
;
146 pub type CRITICAL_SECTION_DEBUG
= RTL_CRITICAL_SECTION_DEBUG
;
147 pub type PCRITICAL_SECTION_DEBUG
= PRTL_CRITICAL_SECTION_DEBUG
;
148 pub type LPCRITICAL_SECTION_DEBUG
= PRTL_CRITICAL_SECTION_DEBUG
;
149 FN
!{stdcall
LPOVERLAPPED_COMPLETION_ROUTINE(
151 dwNumberOfBytesTransfered
: DWORD
,
152 lpOverlapped
: LPOVERLAPPED
,
154 pub const LOCKFILE_FAIL_IMMEDIATELY
: DWORD
= 0x00000001;
155 pub const LOCKFILE_EXCLUSIVE_LOCK
: DWORD
= 0x00000002;
156 STRUCT
!{struct PROCESS_HEAP_ENTRY_Block
{
158 dwReserved
: [DWORD
; 3],
160 STRUCT
!{struct PROCESS_HEAP_ENTRY_Region
{
161 dwCommittedSize
: DWORD
,
162 dwUnCommittedSize
: DWORD
,
163 lpFirstBlock
: LPVOID
,
166 UNION
!{union PROCESS_HEAP_ENTRY_u
{
168 Block Block_mut
: PROCESS_HEAP_ENTRY_Block
,
169 Region Region_mut
: PROCESS_HEAP_ENTRY_Region
,
171 STRUCT
!{struct PROCESS_HEAP_ENTRY
{
177 u
: PROCESS_HEAP_ENTRY_u
,
179 pub type LPPROCESS_HEAP_ENTRY
= *mut PROCESS_HEAP_ENTRY
;
180 pub type PPROCESS_HEAP_ENTRY
= *mut PROCESS_HEAP_ENTRY
;
181 pub const PROCESS_HEAP_REGION
: WORD
= 0x0001;
182 pub const PROCESS_HEAP_UNCOMMITTED_RANGE
: WORD
= 0x0002;
183 pub const PROCESS_HEAP_ENTRY_BUSY
: WORD
= 0x0004;
184 pub const PROCESS_HEAP_SEG_ALLOC
: WORD
= 0x0008;
185 pub const PROCESS_HEAP_ENTRY_MOVEABLE
: WORD
= 0x0010;
186 pub const PROCESS_HEAP_ENTRY_DDESHARE
: WORD
= 0x0020;
187 STRUCT
!{struct REASON_CONTEXT_Detailed
{
188 LocalizedReasonModule
: HMODULE
,
189 LocalizedReasonId
: ULONG
,
190 ReasonStringCount
: ULONG
,
191 ReasonStrings
: *mut LPWSTR
,
193 UNION
!{union REASON_CONTEXT_Reason
{
195 Detailed Detailed_mut
: REASON_CONTEXT_Detailed
,
196 SimpleReasonString SimpleReasonString_mut
: LPWSTR
,
198 STRUCT
!{struct REASON_CONTEXT
{
201 Reason
: REASON_CONTEXT_Reason
,
203 pub type PREASON_CONTEXT
= *mut REASON_CONTEXT
;
204 pub const EXCEPTION_DEBUG_EVENT
: DWORD
= 1;
205 pub const CREATE_THREAD_DEBUG_EVENT
: DWORD
= 2;
206 pub const CREATE_PROCESS_DEBUG_EVENT
: DWORD
= 3;
207 pub const EXIT_THREAD_DEBUG_EVENT
: DWORD
= 4;
208 pub const EXIT_PROCESS_DEBUG_EVENT
: DWORD
= 5;
209 pub const LOAD_DLL_DEBUG_EVENT
: DWORD
= 6;
210 pub const UNLOAD_DLL_DEBUG_EVENT
: DWORD
= 7;
211 pub const OUTPUT_DEBUG_STRING_EVENT
: DWORD
= 8;
212 pub const RIP_EVENT
: DWORD
= 9;
213 FN
!{stdcall
PTHREAD_START_ROUTINE(
214 lpThreadParameter
: LPVOID
,
216 pub type LPTHREAD_START_ROUTINE
= PTHREAD_START_ROUTINE
;
217 STRUCT
!{struct EXCEPTION_DEBUG_INFO
{
218 ExceptionRecord
: EXCEPTION_RECORD
,
219 dwFirstChance
: DWORD
,
221 pub type LPEXCEPTION_DEBUG_INFO
= *mut EXCEPTION_DEBUG_INFO
;
222 STRUCT
!{struct CREATE_THREAD_DEBUG_INFO
{
224 lpThreadLocalBase
: LPVOID
,
225 lpStartAddress
: LPTHREAD_START_ROUTINE
,
227 pub type LPCREATE_THREAD_DEBUG_INFO
= *mut CREATE_THREAD_DEBUG_INFO
;
228 STRUCT
!{struct CREATE_PROCESS_DEBUG_INFO
{
232 lpBaseOfImage
: LPVOID
,
233 dwDebugInfoFileOffset
: DWORD
,
234 nDebugInfoSize
: DWORD
,
235 lpThreadLocalBase
: LPVOID
,
236 lpStartAddress
: LPTHREAD_START_ROUTINE
,
240 pub type LPCREATE_PROCESS_DEBUG_INFO
= *mut CREATE_PROCESS_DEBUG_INFO
;
241 STRUCT
!{struct EXIT_THREAD_DEBUG_INFO
{
244 pub type LPEXIT_THREAD_DEBUG_INFO
= *mut EXIT_THREAD_DEBUG_INFO
;
245 STRUCT
!{struct EXIT_PROCESS_DEBUG_INFO
{
248 pub type LPEXIT_PROCESS_DEBUG_INFO
= *mut EXIT_PROCESS_DEBUG_INFO
;
249 STRUCT
!{struct LOAD_DLL_DEBUG_INFO
{
252 dwDebugInfoFileOffset
: DWORD
,
253 nDebugInfoSize
: DWORD
,
257 pub type LPLOAD_DLL_DEBUG_INFO
= *mut LOAD_DLL_DEBUG_INFO
;
258 STRUCT
!{struct UNLOAD_DLL_DEBUG_INFO
{
261 pub type LPUNLOAD_DLL_DEBUG_INFO
= *mut UNLOAD_DLL_DEBUG_INFO
;
262 STRUCT
!{struct OUTPUT_DEBUG_STRING_INFO
{
263 lpDebugStringData
: LPSTR
,
265 nDebugStringLength
: WORD
,
267 pub type LPOUTPUT_DEBUG_STRING_INFO
= *mut OUTPUT_DEBUG_STRING_INFO
;
268 STRUCT
!{struct RIP_INFO
{
272 pub type LPRIP_INFO
= *mut RIP_INFO
;
273 UNION
!{union DEBUG_EVENT_u
{
275 Exception Exception_mut
: EXCEPTION_DEBUG_INFO
,
276 CreateThread CreateThread_mut
: CREATE_THREAD_DEBUG_INFO
,
277 CreateProcessInfo CreateProcessInfo_mut
: CREATE_PROCESS_DEBUG_INFO
,
278 ExitThread ExitThread_mut
: EXIT_THREAD_DEBUG_INFO
,
279 ExitProcess ExitProcess_mut
: EXIT_PROCESS_DEBUG_INFO
,
280 LoadDll LoadDll_mut
: LOAD_DLL_DEBUG_INFO
,
281 UnloadDll UnloadDll_mut
: UNLOAD_DLL_DEBUG_INFO
,
282 DebugString DebugString_mut
: OUTPUT_DEBUG_STRING_INFO
,
283 RipInfo RipInfo_mut
: RIP_INFO
,
285 STRUCT
!{struct DEBUG_EVENT
{
286 dwDebugEventCode
: DWORD
,
291 pub type LPDEBUG_EVENT
= *mut DEBUG_EVENT
;
292 pub type LPCONTEXT
= PCONTEXT
;
293 pub const STILL_ACTIVE
: DWORD
= STATUS_PENDING
as u32;
294 pub const EXCEPTION_ACCESS_VIOLATION
: DWORD
= STATUS_ACCESS_VIOLATION
as u32;
295 pub const EXCEPTION_DATATYPE_MISALIGNMENT
: DWORD
= STATUS_DATATYPE_MISALIGNMENT
as u32;
296 pub const EXCEPTION_BREAKPOINT
: DWORD
= STATUS_BREAKPOINT
as u32;
297 pub const EXCEPTION_SINGLE_STEP
: DWORD
= STATUS_SINGLE_STEP
as u32;
298 pub const EXCEPTION_ARRAY_BOUNDS_EXCEEDED
: DWORD
= STATUS_ARRAY_BOUNDS_EXCEEDED
as u32;
299 pub const EXCEPTION_FLT_DENORMAL_OPERAND
: DWORD
= STATUS_FLOAT_DENORMAL_OPERAND
as u32;
300 pub const EXCEPTION_FLT_DIVIDE_BY_ZERO
: DWORD
= STATUS_FLOAT_DIVIDE_BY_ZERO
as u32;
301 pub const EXCEPTION_FLT_INEXACT_RESULT
: DWORD
= STATUS_FLOAT_INEXACT_RESULT
as u32;
302 pub const EXCEPTION_FLT_INVALID_OPERATION
: DWORD
= STATUS_FLOAT_INVALID_OPERATION
as u32;
303 pub const EXCEPTION_FLT_OVERFLOW
: DWORD
= STATUS_FLOAT_OVERFLOW
as u32;
304 pub const EXCEPTION_FLT_STACK_CHECK
: DWORD
= STATUS_FLOAT_STACK_CHECK
as u32;
305 pub const EXCEPTION_FLT_UNDERFLOW
: DWORD
= STATUS_FLOAT_UNDERFLOW
as u32;
306 pub const EXCEPTION_INT_DIVIDE_BY_ZERO
: DWORD
= STATUS_INTEGER_DIVIDE_BY_ZERO
as u32;
307 pub const EXCEPTION_INT_OVERFLOW
: DWORD
= STATUS_INTEGER_OVERFLOW
as u32;
308 pub const EXCEPTION_PRIV_INSTRUCTION
: DWORD
= STATUS_PRIVILEGED_INSTRUCTION
as u32;
309 pub const EXCEPTION_IN_PAGE_ERROR
: DWORD
= STATUS_IN_PAGE_ERROR
as u32;
310 pub const EXCEPTION_ILLEGAL_INSTRUCTION
: DWORD
= STATUS_ILLEGAL_INSTRUCTION
as u32;
311 pub const EXCEPTION_NONCONTINUABLE_EXCEPTION
: DWORD
= STATUS_NONCONTINUABLE_EXCEPTION
as u32;
312 pub const EXCEPTION_STACK_OVERFLOW
: DWORD
= STATUS_STACK_OVERFLOW
as u32;
313 pub const EXCEPTION_INVALID_DISPOSITION
: DWORD
= STATUS_INVALID_DISPOSITION
as u32;
314 pub const EXCEPTION_GUARD_PAGE
: DWORD
= STATUS_GUARD_PAGE_VIOLATION
as u32;
315 pub const EXCEPTION_INVALID_HANDLE
: DWORD
= STATUS_INVALID_HANDLE
as u32;
316 pub const EXCEPTION_POSSIBLE_DEADLOCK
: DWORD
= STATUS_POSSIBLE_DEADLOCK
as u32;
317 pub const CONTROL_C_EXIT
: DWORD
= STATUS_CONTROL_C_EXIT
as u32;
318 pub const LMEM_FIXED
: UINT
= 0x0000;
319 pub const LMEM_MOVEABLE
: UINT
= 0x0002;
320 pub const LMEM_NOCOMPACT
: UINT
= 0x0010;
321 pub const LMEM_NODISCARD
: UINT
= 0x0020;
322 pub const LMEM_ZEROINIT
: UINT
= 0x0040;
323 pub const LMEM_MODIFY
: UINT
= 0x0080;
324 pub const LMEM_DISCARDABLE
: UINT
= 0x0F00;
325 pub const LMEM_VALID_FLAGS
: UINT
= 0x0F72;
326 pub const LMEM_INVALID_HANDLE
: UINT
= 0x8000;
327 pub const LHND
: UINT
= LMEM_MOVEABLE
| LMEM_ZEROINIT
;
328 pub const LPTR
: UINT
= LMEM_FIXED
| LMEM_ZEROINIT
;
329 pub const NONZEROLHND
: UINT
= LMEM_MOVEABLE
;
330 pub const NONZEROLPTR
: UINT
= LMEM_FIXED
;
332 pub const LMEM_DISCARDED
: UINT
= 0x4000;
333 pub const LMEM_LOCKCOUNT
: UINT
= 0x00FF;
334 pub const NUMA_NO_PREFERRED_NODE
: DWORD
= -1i32 as DWORD
;