1 //! C definitions used by libnative that don't belong in liblibc
3 #![allow(nonstandard_style)]
4 #![cfg_attr(test, allow(dead_code))]
5 #![unstable(issue = "none", feature = "windows_c")]
7 use crate::os
::raw
::NonZero_c_ulong
;
8 use crate::os
::raw
::{c_char, c_int, c_long, c_longlong, c_uint, c_ulong, c_ushort}
;
11 use libc
::{c_void, size_t, wchar_t}
;
13 #[path = "c/errors.rs"] // c.rs is included from two places so we need to specify this
17 pub use self::EXCEPTION_DISPOSITION
::*;
18 pub use self::FILE_INFO_BY_HANDLE_CLASS
::*;
20 pub type DWORD_PTR
= ULONG_PTR
;
21 pub type DWORD
= c_ulong
;
22 pub type NonZeroDWORD
= NonZero_c_ulong
;
23 pub type HANDLE
= LPVOID
;
24 pub type HINSTANCE
= HANDLE
;
25 pub type HMODULE
= HINSTANCE
;
26 pub type HRESULT
= LONG
;
27 pub type BOOL
= c_int
;
29 pub type BOOLEAN
= BYTE
;
30 pub type GROUP
= c_uint
;
31 pub type LARGE_INTEGER
= c_longlong
;
32 pub type LONG
= c_long
;
33 pub type UINT
= c_uint
;
35 pub type USHORT
= c_ushort
;
36 pub type SIZE_T
= usize;
38 pub type CHAR
= c_char
;
39 pub type ULONG_PTR
= usize;
40 pub type ULONG
= c_ulong
;
41 pub type NTSTATUS
= LONG
;
42 pub type ACCESS_MASK
= DWORD
;
44 pub type LPBOOL
= *mut BOOL
;
45 pub type LPBYTE
= *mut BYTE
;
46 pub type LPCSTR
= *const CHAR
;
47 pub type LPCWSTR
= *const WCHAR
;
48 pub type LPDWORD
= *mut DWORD
;
49 pub type LPHANDLE
= *mut HANDLE
;
50 pub type LPOVERLAPPED
= *mut OVERLAPPED
;
51 pub type LPPROCESS_INFORMATION
= *mut PROCESS_INFORMATION
;
52 pub type LPSECURITY_ATTRIBUTES
= *mut SECURITY_ATTRIBUTES
;
53 pub type LPSTARTUPINFO
= *mut STARTUPINFO
;
54 pub type LPVOID
= *mut c_void
;
55 pub type LPWCH
= *mut WCHAR
;
56 pub type LPWIN32_FIND_DATAW
= *mut WIN32_FIND_DATAW
;
57 pub type LPWSADATA
= *mut WSADATA
;
58 pub type LPWSAPROTOCOL_INFO
= *mut WSAPROTOCOL_INFO
;
59 pub type LPWSTR
= *mut WCHAR
;
60 pub type LPFILETIME
= *mut FILETIME
;
61 pub type LPSYSTEM_INFO
= *mut SYSTEM_INFO
;
62 pub type LPWSABUF
= *mut WSABUF
;
63 pub type LPWSAOVERLAPPED
= *mut c_void
;
64 pub type LPWSAOVERLAPPED_COMPLETION_ROUTINE
= *mut c_void
;
66 pub type PCONDITION_VARIABLE
= *mut CONDITION_VARIABLE
;
67 pub type PLARGE_INTEGER
= *mut c_longlong
;
68 pub type PSRWLOCK
= *mut SRWLOCK
;
70 pub type SOCKET
= crate::os
::windows
::raw
::SOCKET
;
71 pub type socklen_t
= c_int
;
72 pub type ADDRESS_FAMILY
= USHORT
;
74 pub const TRUE
: BOOL
= 1;
75 pub const FALSE
: BOOL
= 0;
77 pub const CSTR_LESS_THAN
: c_int
= 1;
78 pub const CSTR_EQUAL
: c_int
= 2;
79 pub const CSTR_GREATER_THAN
: c_int
= 3;
81 pub const FILE_ATTRIBUTE_READONLY
: DWORD
= 0x1;
82 pub const FILE_ATTRIBUTE_DIRECTORY
: DWORD
= 0x10;
83 pub const FILE_ATTRIBUTE_REPARSE_POINT
: DWORD
= 0x400;
85 pub const FILE_SHARE_DELETE
: DWORD
= 0x4;
86 pub const FILE_SHARE_READ
: DWORD
= 0x1;
87 pub const FILE_SHARE_WRITE
: DWORD
= 0x2;
89 pub const CREATE_ALWAYS
: DWORD
= 2;
90 pub const CREATE_NEW
: DWORD
= 1;
91 pub const OPEN_ALWAYS
: DWORD
= 4;
92 pub const OPEN_EXISTING
: DWORD
= 3;
93 pub const TRUNCATE_EXISTING
: DWORD
= 5;
95 pub const FILE_WRITE_DATA
: DWORD
= 0x00000002;
96 pub const FILE_APPEND_DATA
: DWORD
= 0x00000004;
97 pub const FILE_WRITE_EA
: DWORD
= 0x00000010;
98 pub const FILE_WRITE_ATTRIBUTES
: DWORD
= 0x00000100;
99 pub const READ_CONTROL
: DWORD
= 0x00020000;
100 pub const SYNCHRONIZE
: DWORD
= 0x00100000;
101 pub const GENERIC_READ
: DWORD
= 0x80000000;
102 pub const GENERIC_WRITE
: DWORD
= 0x40000000;
103 pub const STANDARD_RIGHTS_WRITE
: DWORD
= READ_CONTROL
;
104 pub const FILE_GENERIC_WRITE
: DWORD
= STANDARD_RIGHTS_WRITE
106 | FILE_WRITE_ATTRIBUTES
111 pub const FILE_FLAG_OPEN_REPARSE_POINT
: DWORD
= 0x00200000;
112 pub const FILE_FLAG_BACKUP_SEMANTICS
: DWORD
= 0x02000000;
113 pub const SECURITY_SQOS_PRESENT
: DWORD
= 0x00100000;
115 pub const FIONBIO
: c_ulong
= 0x8004667e;
119 pub struct WIN32_FIND_DATAW
{
120 pub dwFileAttributes
: DWORD
,
121 pub ftCreationTime
: FILETIME
,
122 pub ftLastAccessTime
: FILETIME
,
123 pub ftLastWriteTime
: FILETIME
,
124 pub nFileSizeHigh
: DWORD
,
125 pub nFileSizeLow
: DWORD
,
126 pub dwReserved0
: DWORD
,
127 pub dwReserved1
: DWORD
,
128 pub cFileName
: [wchar_t
; 260], // #define MAX_PATH 260
129 pub cAlternateFileName
: [wchar_t
; 14],
131 impl Clone
for WIN32_FIND_DATAW
{
132 fn clone(&self) -> Self {
137 pub const WSA_FLAG_OVERLAPPED
: DWORD
= 0x01;
138 pub const WSA_FLAG_NO_HANDLE_INHERIT
: DWORD
= 0x80;
140 pub const WSADESCRIPTION_LEN
: usize = 256;
141 pub const WSASYS_STATUS_LEN
: usize = 128;
142 pub const WSAPROTOCOL_LEN
: DWORD
= 255;
143 pub const INVALID_SOCKET
: SOCKET
= !0;
145 pub const MAX_PROTOCOL_CHAIN
: DWORD
= 7;
147 pub const MAXIMUM_REPARSE_DATA_BUFFER_SIZE
: usize = 16 * 1024;
148 pub const FSCTL_GET_REPARSE_POINT
: DWORD
= 0x900a8;
149 pub const IO_REPARSE_TAG_SYMLINK
: DWORD
= 0xa000000c;
150 pub const IO_REPARSE_TAG_MOUNT_POINT
: DWORD
= 0xa0000003;
151 pub const SYMLINK_FLAG_RELATIVE
: DWORD
= 0x00000001;
152 pub const FSCTL_SET_REPARSE_POINT
: DWORD
= 0x900a4;
154 pub const SYMBOLIC_LINK_FLAG_DIRECTORY
: DWORD
= 0x1;
155 pub const SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
: DWORD
= 0x2;
157 // Note that these are not actually HANDLEs, just values to pass to GetStdHandle
158 pub const STD_INPUT_HANDLE
: DWORD
= -10i32 as DWORD
;
159 pub const STD_OUTPUT_HANDLE
: DWORD
= -11i32 as DWORD
;
160 pub const STD_ERROR_HANDLE
: DWORD
= -12i32 as DWORD
;
162 pub const PROGRESS_CONTINUE
: DWORD
= 0;
164 pub const E_NOTIMPL
: HRESULT
= 0x80004001u32 as HRESULT
;
166 pub const INVALID_HANDLE_VALUE
: HANDLE
= !0 as HANDLE
;
168 pub const FACILITY_NT_BIT
: DWORD
= 0x1000_0000;
170 pub const FORMAT_MESSAGE_FROM_SYSTEM
: DWORD
= 0x00001000;
171 pub const FORMAT_MESSAGE_FROM_HMODULE
: DWORD
= 0x00000800;
172 pub const FORMAT_MESSAGE_IGNORE_INSERTS
: DWORD
= 0x00000200;
174 pub const TLS_OUT_OF_INDEXES
: DWORD
= 0xFFFFFFFF;
176 pub const DLL_THREAD_DETACH
: DWORD
= 3;
177 pub const DLL_PROCESS_DETACH
: DWORD
= 0;
179 pub const INFINITE
: DWORD
= !0;
181 pub const DUPLICATE_SAME_ACCESS
: DWORD
= 0x00000002;
183 pub const CONDITION_VARIABLE_INIT
: CONDITION_VARIABLE
= CONDITION_VARIABLE { ptr: ptr::null_mut() }
;
184 pub const SRWLOCK_INIT
: SRWLOCK
= SRWLOCK { ptr: ptr::null_mut() }
;
186 pub const DETACHED_PROCESS
: DWORD
= 0x00000008;
187 pub const CREATE_NEW_PROCESS_GROUP
: DWORD
= 0x00000200;
188 pub const CREATE_UNICODE_ENVIRONMENT
: DWORD
= 0x00000400;
189 pub const STARTF_USESTDHANDLES
: DWORD
= 0x00000100;
191 pub const AF_INET
: c_int
= 2;
192 pub const AF_INET6
: c_int
= 23;
193 pub const SD_BOTH
: c_int
= 2;
194 pub const SD_RECEIVE
: c_int
= 0;
195 pub const SD_SEND
: c_int
= 1;
196 pub const SOCK_DGRAM
: c_int
= 2;
197 pub const SOCK_STREAM
: c_int
= 1;
198 pub const SOCKET_ERROR
: c_int
= -1;
199 pub const SOL_SOCKET
: c_int
= 0xffff;
200 pub const SO_LINGER
: c_int
= 0x0080;
201 pub const SO_RCVTIMEO
: c_int
= 0x1006;
202 pub const SO_SNDTIMEO
: c_int
= 0x1005;
203 pub const IPPROTO_IP
: c_int
= 0;
204 pub const IPPROTO_TCP
: c_int
= 6;
205 pub const IPPROTO_IPV6
: c_int
= 41;
206 pub const TCP_NODELAY
: c_int
= 0x0001;
207 pub const IP_TTL
: c_int
= 4;
208 pub const IPV6_V6ONLY
: c_int
= 27;
209 pub const SO_ERROR
: c_int
= 0x1007;
210 pub const SO_BROADCAST
: c_int
= 0x0020;
211 pub const IP_MULTICAST_LOOP
: c_int
= 11;
212 pub const IPV6_MULTICAST_LOOP
: c_int
= 11;
213 pub const IP_MULTICAST_TTL
: c_int
= 10;
214 pub const IP_ADD_MEMBERSHIP
: c_int
= 12;
215 pub const IP_DROP_MEMBERSHIP
: c_int
= 13;
216 pub const IPV6_ADD_MEMBERSHIP
: c_int
= 12;
217 pub const IPV6_DROP_MEMBERSHIP
: c_int
= 13;
218 pub const MSG_PEEK
: c_int
= 0x2;
221 #[derive(Copy, Clone)]
223 pub l_onoff
: c_ushort
,
224 pub l_linger
: c_ushort
,
229 pub imr_multiaddr
: in_addr
,
230 pub imr_interface
: in_addr
,
234 pub struct ipv6_mreq
{
235 pub ipv6mr_multiaddr
: in6_addr
,
236 pub ipv6mr_interface
: c_uint
,
239 pub const VOLUME_NAME_DOS
: DWORD
= 0x0;
240 pub const MOVEFILE_REPLACE_EXISTING
: DWORD
= 1;
242 pub const FILE_BEGIN
: DWORD
= 0;
243 pub const FILE_CURRENT
: DWORD
= 1;
244 pub const FILE_END
: DWORD
= 2;
246 pub const WAIT_OBJECT_0
: DWORD
= 0x00000000;
247 pub const WAIT_TIMEOUT
: DWORD
= 258;
248 pub const WAIT_FAILED
: DWORD
= 0xFFFFFFFF;
250 pub const PIPE_ACCESS_INBOUND
: DWORD
= 0x00000001;
251 pub const PIPE_ACCESS_OUTBOUND
: DWORD
= 0x00000002;
252 pub const FILE_FLAG_FIRST_PIPE_INSTANCE
: DWORD
= 0x00080000;
253 pub const FILE_FLAG_OVERLAPPED
: DWORD
= 0x40000000;
254 pub const PIPE_WAIT
: DWORD
= 0x00000000;
255 pub const PIPE_TYPE_BYTE
: DWORD
= 0x00000000;
256 pub const PIPE_REJECT_REMOTE_CLIENTS
: DWORD
= 0x00000008;
257 pub const PIPE_READMODE_BYTE
: DWORD
= 0x00000000;
259 pub const FD_SETSIZE
: usize = 64;
261 pub const STACK_SIZE_PARAM_IS_A_RESERVATION
: DWORD
= 0x00010000;
263 pub const STATUS_SUCCESS
: NTSTATUS
= 0x00000000;
266 #[cfg(not(target_pointer_width = "64"))]
269 pub wHighVersion
: WORD
,
270 pub szDescription
: [u8; WSADESCRIPTION_LEN
+ 1],
271 pub szSystemStatus
: [u8; WSASYS_STATUS_LEN
+ 1],
272 pub iMaxSockets
: u16,
274 pub lpVendorInfo
: *mut u8,
277 #[cfg(target_pointer_width = "64")]
280 pub wHighVersion
: WORD
,
281 pub iMaxSockets
: u16,
283 pub lpVendorInfo
: *mut u8,
284 pub szDescription
: [u8; WSADESCRIPTION_LEN
+ 1],
285 pub szSystemStatus
: [u8; WSASYS_STATUS_LEN
+ 1],
288 #[derive(Copy, Clone)]
296 pub struct WSAPROTOCOL_INFO
{
297 pub dwServiceFlags1
: DWORD
,
298 pub dwServiceFlags2
: DWORD
,
299 pub dwServiceFlags3
: DWORD
,
300 pub dwServiceFlags4
: DWORD
,
301 pub dwProviderFlags
: DWORD
,
302 pub ProviderId
: GUID
,
303 pub dwCatalogEntryId
: DWORD
,
304 pub ProtocolChain
: WSAPROTOCOLCHAIN
,
306 pub iAddressFamily
: c_int
,
307 pub iMaxSockAddr
: c_int
,
308 pub iMinSockAddr
: c_int
,
309 pub iSocketType
: c_int
,
310 pub iProtocol
: c_int
,
311 pub iProtocolMaxOffset
: c_int
,
312 pub iNetworkByteOrder
: c_int
,
313 pub iSecurityScheme
: c_int
,
314 pub dwMessageSize
: DWORD
,
315 pub dwProviderReserved
: DWORD
,
316 pub szProtocol
: [u16; (WSAPROTOCOL_LEN
as usize) + 1],
320 #[derive(Copy, Clone)]
321 pub struct WIN32_FILE_ATTRIBUTE_DATA
{
322 pub dwFileAttributes
: DWORD
,
323 pub ftCreationTime
: FILETIME
,
324 pub ftLastAccessTime
: FILETIME
,
325 pub ftLastWriteTime
: FILETIME
,
326 pub nFileSizeHigh
: DWORD
,
327 pub nFileSizeLow
: DWORD
,
331 #[allow(dead_code)] // we only use some variants
332 pub enum FILE_INFO_BY_HANDLE_CLASS
{
334 FileStandardInfo
= 1,
337 FileDispositionInfo
= 4,
338 FileAllocationInfo
= 5,
339 FileEndOfFileInfo
= 6,
341 FileCompressionInfo
= 8,
342 FileAttributeTagInfo
= 9,
343 FileIdBothDirectoryInfo
= 10, // 0xA
344 FileIdBothDirectoryRestartInfo
= 11, // 0xB
345 FileIoPriorityHintInfo
= 12, // 0xC
346 FileRemoteProtocolInfo
= 13, // 0xD
347 FileFullDirectoryInfo
= 14, // 0xE
348 FileFullDirectoryRestartInfo
= 15, // 0xF
349 FileStorageInfo
= 16, // 0x10
350 FileAlignmentInfo
= 17, // 0x11
351 FileIdInfo
= 18, // 0x12
352 FileIdExtdDirectoryInfo
= 19, // 0x13
353 FileIdExtdDirectoryRestartInfo
= 20, // 0x14
354 MaximumFileInfoByHandlesClass
,
358 pub struct FILE_BASIC_INFO
{
359 pub CreationTime
: LARGE_INTEGER
,
360 pub LastAccessTime
: LARGE_INTEGER
,
361 pub LastWriteTime
: LARGE_INTEGER
,
362 pub ChangeTime
: LARGE_INTEGER
,
363 pub FileAttributes
: DWORD
,
367 pub struct FILE_END_OF_FILE_INFO
{
368 pub EndOfFile
: LARGE_INTEGER
,
372 pub struct REPARSE_DATA_BUFFER
{
373 pub ReparseTag
: c_uint
,
374 pub ReparseDataLength
: c_ushort
,
375 pub Reserved
: c_ushort
,
380 pub struct SYMBOLIC_LINK_REPARSE_BUFFER
{
381 pub SubstituteNameOffset
: c_ushort
,
382 pub SubstituteNameLength
: c_ushort
,
383 pub PrintNameOffset
: c_ushort
,
384 pub PrintNameLength
: c_ushort
,
386 pub PathBuffer
: WCHAR
,
390 pub struct MOUNT_POINT_REPARSE_BUFFER
{
391 pub SubstituteNameOffset
: c_ushort
,
392 pub SubstituteNameLength
: c_ushort
,
393 pub PrintNameOffset
: c_ushort
,
394 pub PrintNameLength
: c_ushort
,
395 pub PathBuffer
: WCHAR
,
398 pub type LPPROGRESS_ROUTINE
= crate::option
::Option
<
399 unsafe extern "system" fn(
400 TotalFileSize
: LARGE_INTEGER
,
401 TotalBytesTransferred
: LARGE_INTEGER
,
402 StreamSize
: LARGE_INTEGER
,
403 StreamBytesTransferred
: LARGE_INTEGER
,
404 dwStreamNumber
: DWORD
,
405 dwCallbackReason
: DWORD
,
407 hDestinationFile
: HANDLE
,
413 pub struct CONDITION_VARIABLE
{
421 pub struct CRITICAL_SECTION
{
422 CriticalSectionDebug
: LPVOID
,
424 RecursionCount
: LONG
,
425 OwningThread
: HANDLE
,
426 LockSemaphore
: HANDLE
,
427 SpinCount
: ULONG_PTR
,
431 pub struct REPARSE_MOUNTPOINT_DATA_BUFFER
{
432 pub ReparseTag
: DWORD
,
433 pub ReparseDataLength
: DWORD
,
435 pub ReparseTargetLength
: WORD
,
436 pub ReparseTargetMaximumLength
: WORD
,
438 pub ReparseTarget
: WCHAR
,
446 pub Data4
: [BYTE
; 8],
450 pub struct WSAPROTOCOLCHAIN
{
452 pub ChainEntries
: [DWORD
; MAX_PROTOCOL_CHAIN
as usize],
456 pub struct SECURITY_ATTRIBUTES
{
458 pub lpSecurityDescriptor
: LPVOID
,
459 pub bInheritHandle
: BOOL
,
463 pub struct PROCESS_INFORMATION
{
464 pub hProcess
: HANDLE
,
466 pub dwProcessId
: DWORD
,
467 pub dwThreadId
: DWORD
,
471 pub struct STARTUPINFO
{
473 pub lpReserved
: LPWSTR
,
474 pub lpDesktop
: LPWSTR
,
480 pub dwXCountChars
: DWORD
,
481 pub dwYCountCharts
: DWORD
,
482 pub dwFillAttribute
: DWORD
,
484 pub wShowWindow
: WORD
,
485 pub cbReserved2
: WORD
,
486 pub lpReserved2
: LPBYTE
,
487 pub hStdInput
: HANDLE
,
488 pub hStdOutput
: HANDLE
,
489 pub hStdError
: HANDLE
,
493 pub struct SOCKADDR
{
494 pub sa_family
: ADDRESS_FAMILY
,
495 pub sa_data
: [CHAR
; 14],
499 #[derive(Copy, Clone)]
500 pub struct FILETIME
{
501 pub dwLowDateTime
: DWORD
,
502 pub dwHighDateTime
: DWORD
,
506 pub struct SYSTEM_INFO
{
507 pub wProcessorArchitecture
: WORD
,
509 pub dwPageSize
: DWORD
,
510 pub lpMinimumApplicationAddress
: LPVOID
,
511 pub lpMaximumApplicationAddress
: LPVOID
,
512 pub dwActiveProcessorMask
: DWORD_PTR
,
513 pub dwNumberOfProcessors
: DWORD
,
514 pub dwProcessorType
: DWORD
,
515 pub dwAllocationGranularity
: DWORD
,
516 pub wProcessorLevel
: WORD
,
517 pub wProcessorRevision
: WORD
,
521 pub struct OVERLAPPED
{
522 pub Internal
: *mut c_ulong
,
523 pub InternalHigh
: *mut c_ulong
,
525 pub OffsetHigh
: DWORD
,
530 #[allow(dead_code)] // we only use some variants
531 pub enum ADDRESS_MODE
{
539 pub struct SOCKADDR_STORAGE_LH
{
540 pub ss_family
: ADDRESS_FAMILY
,
541 pub __ss_pad1
: [CHAR
; 6],
543 pub __ss_pad2
: [CHAR
; 112],
547 pub struct ADDRINFOA
{
549 pub ai_family
: c_int
,
550 pub ai_socktype
: c_int
,
551 pub ai_protocol
: c_int
,
552 pub ai_addrlen
: size_t
,
553 pub ai_canonname
: *mut c_char
,
554 pub ai_addr
: *mut SOCKADDR
,
555 pub ai_next
: *mut ADDRINFOA
,
559 #[derive(Copy, Clone)]
560 pub struct sockaddr_in
{
561 pub sin_family
: ADDRESS_FAMILY
,
562 pub sin_port
: USHORT
,
563 pub sin_addr
: in_addr
,
564 pub sin_zero
: [CHAR
; 8],
568 #[derive(Copy, Clone)]
569 pub struct sockaddr_in6
{
570 pub sin6_family
: ADDRESS_FAMILY
,
571 pub sin6_port
: USHORT
,
572 pub sin6_flowinfo
: c_ulong
,
573 pub sin6_addr
: in6_addr
,
574 pub sin6_scope_id
: c_ulong
,
578 #[derive(Copy, Clone)]
584 #[derive(Copy, Clone)]
585 pub struct in6_addr
{
586 pub s6_addr
: [u8; 16],
590 #[derive(Copy, Clone)]
591 #[allow(dead_code)] // we only use some variants
592 pub enum EXCEPTION_DISPOSITION
{
593 ExceptionContinueExecution
,
594 ExceptionContinueSearch
,
595 ExceptionNestedException
,
596 ExceptionCollidedUnwind
,
602 pub fd_count
: c_uint
,
603 pub fd_array
: [SOCKET
; FD_SETSIZE
],
606 impl Clone
for fd_set
{
607 fn clone(&self) -> fd_set
{
613 #[derive(Copy, Clone)]
619 // Desktop specific functions & types
621 if #[cfg(not(target_vendor = "uwp"))] {
622 pub const EXCEPTION_CONTINUE_SEARCH
: LONG
= 0;
623 pub const EXCEPTION_STACK_OVERFLOW
: DWORD
= 0xc00000fd;
624 pub const EXCEPTION_MAXIMUM_PARAMETERS
: usize = 15;
627 pub struct EXCEPTION_RECORD
{
628 pub ExceptionCode
: DWORD
,
629 pub ExceptionFlags
: DWORD
,
630 pub ExceptionRecord
: *mut EXCEPTION_RECORD
,
631 pub ExceptionAddress
: LPVOID
,
632 pub NumberParameters
: DWORD
,
633 pub ExceptionInformation
: [LPVOID
; EXCEPTION_MAXIMUM_PARAMETERS
],
639 pub struct EXCEPTION_POINTERS
{
640 pub ExceptionRecord
: *mut EXCEPTION_RECORD
,
641 pub ContextRecord
: *mut CONTEXT
,
644 pub type PVECTORED_EXCEPTION_HANDLER
=
645 extern "system" fn(ExceptionInfo
: *mut EXCEPTION_POINTERS
) -> LONG
;
648 #[derive(Copy, Clone)]
649 pub struct CONSOLE_READCONSOLE_CONTROL
{
651 pub nInitialChars
: ULONG
,
652 pub dwCtrlWakeupMask
: ULONG
,
653 pub dwControlKeyState
: ULONG
,
656 pub type PCONSOLE_READCONSOLE_CONTROL
= *mut CONSOLE_READCONSOLE_CONTROL
;
659 pub struct BY_HANDLE_FILE_INFORMATION
{
660 pub dwFileAttributes
: DWORD
,
661 pub ftCreationTime
: FILETIME
,
662 pub ftLastAccessTime
: FILETIME
,
663 pub ftLastWriteTime
: FILETIME
,
664 pub dwVolumeSerialNumber
: DWORD
,
665 pub nFileSizeHigh
: DWORD
,
666 pub nFileSizeLow
: DWORD
,
667 pub nNumberOfLinks
: DWORD
,
668 pub nFileIndexHigh
: DWORD
,
669 pub nFileIndexLow
: DWORD
,
672 pub type LPBY_HANDLE_FILE_INFORMATION
= *mut BY_HANDLE_FILE_INFORMATION
;
673 pub type LPCVOID
= *const c_void
;
675 pub const HANDLE_FLAG_INHERIT
: DWORD
= 0x00000001;
677 pub const TOKEN_READ
: DWORD
= 0x20008;
679 #[link(name = "advapi32")]
681 // Forbidden when targeting UWP
682 #[link_name = "SystemFunction036"]
683 pub fn RtlGenRandom(RandomBuffer
: *mut u8, RandomBufferLength
: ULONG
) -> BOOLEAN
;
685 // Allowed but unused by UWP
686 pub fn OpenProcessToken(
687 ProcessHandle
: HANDLE
,
688 DesiredAccess
: DWORD
,
689 TokenHandle
: *mut HANDLE
,
693 #[link(name = "userenv")]
695 // Allowed but unused by UWP
696 pub fn GetUserProfileDirectoryW(
698 lpProfileDir
: LPWSTR
,
699 lpcchSize
: *mut DWORD
,
703 #[link(name = "kernel32")]
705 // Functions forbidden when targeting UWP
707 hConsoleInput
: HANDLE
,
709 nNumberOfCharsToRead
: DWORD
,
710 lpNumberOfCharsRead
: LPDWORD
,
711 pInputControl
: PCONSOLE_READCONSOLE_CONTROL
,
714 pub fn WriteConsoleW(
715 hConsoleOutput
: HANDLE
,
717 nNumberOfCharsToWrite
: DWORD
,
718 lpNumberOfCharsWritten
: LPDWORD
,
722 pub fn GetConsoleMode(hConsoleHandle
: HANDLE
, lpMode
: LPDWORD
) -> BOOL
;
723 // Allowed but unused by UWP
724 pub fn GetFileInformationByHandle(
726 lpFileInformation
: LPBY_HANDLE_FILE_INFORMATION
,
728 pub fn SetHandleInformation(hObject
: HANDLE
, dwMask
: DWORD
, dwFlags
: DWORD
) -> BOOL
;
729 pub fn AddVectoredExceptionHandler(
731 VectoredHandler
: PVECTORED_EXCEPTION_HANDLER
,
733 pub fn CreateHardLinkW(
734 lpSymlinkFileName
: LPCWSTR
,
735 lpTargetFileName
: LPCWSTR
,
736 lpSecurityAttributes
: LPSECURITY_ATTRIBUTES
,
738 pub fn SetThreadStackGuarantee(_size
: *mut c_ulong
) -> BOOL
;
743 // UWP specific functions & types
745 if #[cfg(target_vendor = "uwp")] {
746 pub const BCRYPT_USE_SYSTEM_PREFERRED_RNG
: DWORD
= 0x00000002;
749 pub struct FILE_STANDARD_INFO
{
750 pub AllocationSize
: LARGE_INTEGER
,
751 pub EndOfFile
: LARGE_INTEGER
,
752 pub NumberOfLinks
: DWORD
,
753 pub DeletePending
: BOOLEAN
,
754 pub Directory
: BOOLEAN
,
757 #[link(name = "bcrypt")]
759 pub fn BCryptGenRandom(
766 #[link(name = "kernel32")]
768 pub fn GetFileInformationByHandleEx(
770 fileInfoClass
: FILE_INFO_BY_HANDLE_CLASS
,
771 lpFileInformation
: LPVOID
,
778 // Shared between Desktop & UWP
780 #[link(name = "kernel32")]
782 pub fn GetCurrentProcessId() -> DWORD
;
783 pub fn InitializeCriticalSection(CriticalSection
: *mut CRITICAL_SECTION
);
784 pub fn EnterCriticalSection(CriticalSection
: *mut CRITICAL_SECTION
);
785 pub fn TryEnterCriticalSection(CriticalSection
: *mut CRITICAL_SECTION
) -> BOOL
;
786 pub fn LeaveCriticalSection(CriticalSection
: *mut CRITICAL_SECTION
);
787 pub fn DeleteCriticalSection(CriticalSection
: *mut CRITICAL_SECTION
);
789 pub fn RemoveDirectoryW(lpPathName
: LPCWSTR
) -> BOOL
;
790 pub fn SetFileAttributesW(lpFileName
: LPCWSTR
, dwFileAttributes
: DWORD
) -> BOOL
;
791 pub fn SetLastError(dwErrCode
: DWORD
);
792 pub fn GetCommandLineW() -> LPWSTR
;
793 pub fn GetTempPathW(nBufferLength
: DWORD
, lpBuffer
: LPCWSTR
) -> DWORD
;
794 pub fn GetCurrentProcess() -> HANDLE
;
795 pub fn GetCurrentThread() -> HANDLE
;
796 pub fn GetStdHandle(which
: DWORD
) -> HANDLE
;
797 pub fn ExitProcess(uExitCode
: c_uint
) -> !;
798 pub fn DeviceIoControl(
800 dwIoControlCode
: DWORD
,
802 nInBufferSize
: DWORD
,
804 nOutBufferSize
: DWORD
,
805 lpBytesReturned
: LPDWORD
,
806 lpOverlapped
: LPOVERLAPPED
,
809 lpThreadAttributes
: LPSECURITY_ATTRIBUTES
,
811 lpStartAddress
: extern "system" fn(*mut c_void
) -> DWORD
,
813 dwCreationFlags
: DWORD
,
816 pub fn WaitForSingleObject(hHandle
: HANDLE
, dwMilliseconds
: DWORD
) -> DWORD
;
817 pub fn SwitchToThread() -> BOOL
;
818 pub fn Sleep(dwMilliseconds
: DWORD
);
819 pub fn GetProcessId(handle
: HANDLE
) -> DWORD
;
821 lpExistingFileName
: LPCWSTR
,
822 lpNewFileName
: LPCWSTR
,
823 lpProgressRoutine
: LPPROGRESS_ROUTINE
,
828 pub fn FormatMessageW(
837 pub fn TlsAlloc() -> DWORD
;
838 pub fn TlsGetValue(dwTlsIndex
: DWORD
) -> LPVOID
;
839 pub fn TlsSetValue(dwTlsIndex
: DWORD
, lpTlsvalue
: LPVOID
) -> BOOL
;
840 pub fn GetLastError() -> DWORD
;
841 pub fn QueryPerformanceFrequency(lpFrequency
: *mut LARGE_INTEGER
) -> BOOL
;
842 pub fn QueryPerformanceCounter(lpPerformanceCount
: *mut LARGE_INTEGER
) -> BOOL
;
843 pub fn GetExitCodeProcess(hProcess
: HANDLE
, lpExitCode
: LPDWORD
) -> BOOL
;
844 pub fn TerminateProcess(hProcess
: HANDLE
, uExitCode
: UINT
) -> BOOL
;
845 pub fn CreateProcessW(
846 lpApplicationName
: LPCWSTR
,
847 lpCommandLine
: LPWSTR
,
848 lpProcessAttributes
: LPSECURITY_ATTRIBUTES
,
849 lpThreadAttributes
: LPSECURITY_ATTRIBUTES
,
850 bInheritHandles
: BOOL
,
851 dwCreationFlags
: DWORD
,
852 lpEnvironment
: LPVOID
,
853 lpCurrentDirectory
: LPCWSTR
,
854 lpStartupInfo
: LPSTARTUPINFO
,
855 lpProcessInformation
: LPPROCESS_INFORMATION
,
857 pub fn GetEnvironmentVariableW(n
: LPCWSTR
, v
: LPWSTR
, nsize
: DWORD
) -> DWORD
;
858 pub fn SetEnvironmentVariableW(n
: LPCWSTR
, v
: LPCWSTR
) -> BOOL
;
859 pub fn GetEnvironmentStringsW() -> LPWCH
;
860 pub fn FreeEnvironmentStringsW(env_ptr
: LPWCH
) -> BOOL
;
861 pub fn GetModuleFileNameW(hModule
: HMODULE
, lpFilename
: LPWSTR
, nSize
: DWORD
) -> DWORD
;
862 pub fn CreateDirectoryW(
864 lpSecurityAttributes
: LPSECURITY_ATTRIBUTES
,
866 pub fn DeleteFileW(lpPathName
: LPCWSTR
) -> BOOL
;
867 pub fn GetCurrentDirectoryW(nBufferLength
: DWORD
, lpBuffer
: LPWSTR
) -> DWORD
;
868 pub fn SetCurrentDirectoryW(lpPathName
: LPCWSTR
) -> BOOL
;
869 pub fn DuplicateHandle(
870 hSourceProcessHandle
: HANDLE
,
871 hSourceHandle
: HANDLE
,
872 hTargetProcessHandle
: HANDLE
,
873 lpTargetHandle
: LPHANDLE
,
874 dwDesiredAccess
: DWORD
,
875 bInheritHandle
: BOOL
,
881 nNumberOfBytesToRead
: DWORD
,
882 lpNumberOfBytesRead
: LPDWORD
,
883 lpOverlapped
: LPOVERLAPPED
,
888 nNumberOfBytesToWrite
: DWORD
,
889 lpNumberOfBytesWritten
: LPDWORD
,
890 lpOverlapped
: LPOVERLAPPED
,
892 pub fn CloseHandle(hObject
: HANDLE
) -> BOOL
;
893 pub fn MoveFileExW(lpExistingFileName
: LPCWSTR
, lpNewFileName
: LPCWSTR
, dwFlags
: DWORD
)
895 pub fn SetFilePointerEx(
897 liDistanceToMove
: LARGE_INTEGER
,
898 lpNewFilePointer
: PLARGE_INTEGER
,
901 pub fn FlushFileBuffers(hFile
: HANDLE
) -> BOOL
;
904 dwDesiredAccess
: DWORD
,
906 lpSecurityAttributes
: LPSECURITY_ATTRIBUTES
,
907 dwCreationDisposition
: DWORD
,
908 dwFlagsAndAttributes
: DWORD
,
909 hTemplateFile
: HANDLE
,
912 pub fn FindFirstFileW(fileName
: LPCWSTR
, findFileData
: LPWIN32_FIND_DATAW
) -> HANDLE
;
913 pub fn FindNextFileW(findFile
: HANDLE
, findFileData
: LPWIN32_FIND_DATAW
) -> BOOL
;
914 pub fn FindClose(findFile
: HANDLE
) -> BOOL
;
916 pub fn GetProcAddress(handle
: HMODULE
, name
: LPCSTR
) -> *mut c_void
;
917 pub fn GetModuleHandleA(lpModuleName
: LPCSTR
) -> HMODULE
;
918 pub fn GetModuleHandleW(lpModuleName
: LPCWSTR
) -> HMODULE
;
920 pub fn GetSystemTimeAsFileTime(lpSystemTimeAsFileTime
: LPFILETIME
);
921 pub fn GetSystemInfo(lpSystemInfo
: LPSYSTEM_INFO
);
924 lpEventAttributes
: LPSECURITY_ATTRIBUTES
,
929 pub fn WaitForMultipleObjects(
931 lpHandles
: *const HANDLE
,
933 dwMilliseconds
: DWORD
,
935 pub fn CreateNamedPipeW(
939 nMaxInstances
: DWORD
,
940 nOutBufferSize
: DWORD
,
941 nInBufferSize
: DWORD
,
942 nDefaultTimeOut
: DWORD
,
943 lpSecurityAttributes
: LPSECURITY_ATTRIBUTES
,
945 pub fn CancelIo(handle
: HANDLE
) -> BOOL
;
946 pub fn GetOverlappedResult(
948 lpOverlapped
: LPOVERLAPPED
,
949 lpNumberOfBytesTransferred
: LPDWORD
,
952 pub fn CreateSymbolicLinkW(
953 lpSymlinkFileName
: LPCWSTR
,
954 lpTargetFileName
: LPCWSTR
,
957 pub fn GetFinalPathNameByHandleW(
959 lpszFilePath
: LPCWSTR
,
963 pub fn SetFileInformationByHandle(
965 FileInformationClass
: FILE_INFO_BY_HANDLE_CLASS
,
966 lpFileInformation
: LPVOID
,
969 pub fn SleepConditionVariableSRW(
970 ConditionVariable
: PCONDITION_VARIABLE
,
972 dwMilliseconds
: DWORD
,
976 pub fn WakeConditionVariable(ConditionVariable
: PCONDITION_VARIABLE
);
977 pub fn WakeAllConditionVariable(ConditionVariable
: PCONDITION_VARIABLE
);
979 pub fn AcquireSRWLockExclusive(SRWLock
: PSRWLOCK
);
980 pub fn AcquireSRWLockShared(SRWLock
: PSRWLOCK
);
981 pub fn ReleaseSRWLockExclusive(SRWLock
: PSRWLOCK
);
982 pub fn ReleaseSRWLockShared(SRWLock
: PSRWLOCK
);
983 pub fn TryAcquireSRWLockExclusive(SRWLock
: PSRWLOCK
) -> BOOLEAN
;
984 pub fn TryAcquireSRWLockShared(SRWLock
: PSRWLOCK
) -> BOOLEAN
;
986 pub fn CompareStringOrdinal(
995 #[link(name = "ws2_32")]
997 pub fn WSAStartup(wVersionRequested
: WORD
, lpWSAData
: LPWSADATA
) -> c_int
;
998 pub fn WSACleanup() -> c_int
;
999 pub fn WSAGetLastError() -> c_int
;
1000 pub fn WSADuplicateSocketW(
1003 lpProtocolInfo
: LPWSAPROTOCOL_INFO
,
1007 lpBuffers
: LPWSABUF
,
1008 dwBufferCount
: DWORD
,
1009 lpNumberOfBytesSent
: LPDWORD
,
1011 lpOverlapped
: LPWSAOVERLAPPED
,
1012 lpCompletionRoutine
: LPWSAOVERLAPPED_COMPLETION_ROUTINE
,
1016 lpBuffers
: LPWSABUF
,
1017 dwBufferCount
: DWORD
,
1018 lpNumberOfBytesRecvd
: LPDWORD
,
1020 lpOverlapped
: LPWSAOVERLAPPED
,
1021 lpCompletionRoutine
: LPWSAOVERLAPPED_COMPLETION_ROUTINE
,
1027 lpProtocolInfo
: LPWSAPROTOCOL_INFO
,
1031 pub fn ioctlsocket(s
: SOCKET
, cmd
: c_long
, argp
: *mut c_ulong
) -> c_int
;
1032 pub fn closesocket(socket
: SOCKET
) -> c_int
;
1033 pub fn recv(socket
: SOCKET
, buf
: *mut c_void
, len
: c_int
, flags
: c_int
) -> c_int
;
1034 pub fn send(socket
: SOCKET
, buf
: *const c_void
, len
: c_int
, flags
: c_int
) -> c_int
;
1040 addr
: *mut SOCKADDR
,
1041 addrlen
: *mut c_int
,
1048 addr
: *const SOCKADDR
,
1051 pub fn shutdown(socket
: SOCKET
, how
: c_int
) -> c_int
;
1052 pub fn accept(socket
: SOCKET
, address
: *mut SOCKADDR
, address_len
: *mut c_int
) -> SOCKET
;
1057 optval
: *mut c_char
,
1064 optval
: *const c_void
,
1067 pub fn getsockname(socket
: SOCKET
, address
: *mut SOCKADDR
, address_len
: *mut c_int
) -> c_int
;
1068 pub fn getpeername(socket
: SOCKET
, address
: *mut SOCKADDR
, address_len
: *mut c_int
) -> c_int
;
1069 pub fn bind(socket
: SOCKET
, address
: *const SOCKADDR
, address_len
: socklen_t
) -> c_int
;
1070 pub fn listen(socket
: SOCKET
, backlog
: c_int
) -> c_int
;
1071 pub fn connect(socket
: SOCKET
, address
: *const SOCKADDR
, len
: c_int
) -> c_int
;
1073 node
: *const c_char
,
1074 service
: *const c_char
,
1075 hints
: *const ADDRINFOA
,
1076 res
: *mut *mut ADDRINFOA
,
1078 pub fn freeaddrinfo(res
: *mut ADDRINFOA
);
1081 readfds
: *mut fd_set
,
1082 writefds
: *mut fd_set
,
1083 exceptfds
: *mut fd_set
,
1084 timeout
: *const timeval
,
1088 // Functions that aren't available on every version of Windows that we support,
1089 // but we still use them and just provide some form of a fallback implementation.
1094 // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setthreaddescription
1095 pub fn SetThreadDescription(hThread
: HANDLE
,
1096 lpThreadDescription
: LPCWSTR
) -> HRESULT
{
1097 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
as DWORD
); E_NOTIMPL
1100 // >= Win8 / Server 2012
1101 // https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime
1102 pub fn GetSystemTimePreciseAsFileTime(lpSystemTimeAsFileTime
: LPFILETIME
)
1104 GetSystemTimeAsFileTime(lpSystemTimeAsFileTime
)
1109 "api-ms-win-core-synch-l1-2-0":
1111 // >= Windows 8 / Server 2012
1112 // https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitonaddress
1113 pub fn WaitOnAddress(
1115 CompareAddress
: LPVOID
,
1116 AddressSize
: SIZE_T
,
1117 dwMilliseconds
: DWORD
1119 panic
!("WaitOnAddress not available")
1121 pub fn WakeByAddressSingle(Address
: LPVOID
) -> () {
1122 // If this api is unavailable, there cannot be anything waiting, because
1123 // WaitOnAddress would've panicked. So it's fine to do nothing here.
1129 pub fn NtCreateKeyedEvent(
1130 KeyedEventHandle
: LPHANDLE
,
1131 DesiredAccess
: ACCESS_MASK
,
1132 ObjectAttributes
: LPVOID
,
1135 panic
!("keyed events not available")
1137 pub fn NtReleaseKeyedEvent(
1138 EventHandle
: HANDLE
,
1141 Timeout
: PLARGE_INTEGER
1143 panic
!("keyed events not available")
1145 pub fn NtWaitForKeyedEvent(
1146 EventHandle
: HANDLE
,
1149 Timeout
: PLARGE_INTEGER
1151 panic
!("keyed events not available")