// Licensed under the Apache License, Version 2.0 // or the MIT license // , at your option. // All files in the project carrying such notice may not be copied, modified, or distributed // except according to those terms. use ctypes::{c_char, c_int}; use shared::minwindef::{BOOL, DWORD, INT, LPDWORD, LPINT, LPVOID, ULONG}; use shared::mswsockdef::{PRIORESULT, PRIO_BUF, RIO_BUFFERID, RIO_CQ, RIO_RQ}; use shared::ws2def::{IOC_VENDOR, IOC_WS2, LPWSAMSG, SOCKADDR}; use um::minwinbase::LPOVERLAPPED; use um::winnt::{CHAR, HANDLE, LARGE_INTEGER, PCHAR, PVOID, WCHAR}; use um::winsock2::{ LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE, LPWSAPOLLFD, SOCKET, WSAESETSERVICEOP, WSAPOLLFD, }; pub const SO_CONNDATA: c_int = 0x7000; pub const SO_CONNOPT: c_int = 0x7001; pub const SO_DISCDATA: c_int = 0x7002; pub const SO_DISCOPT: c_int = 0x7003; pub const SO_CONNDATALEN: c_int = 0x7004; pub const SO_CONNOPTLEN: c_int = 0x7005; pub const SO_DISCDATALEN: c_int = 0x7006; pub const SO_DISCOPTLEN: c_int = 0x7007; pub const SO_OPENTYPE: c_int = 0x7008; pub const SO_SYNCHRONOUS_ALERT: DWORD = 0x10; pub const SO_SYNCHRONOUS_NONALERT: DWORD = 0x20; pub const SO_MAXDG: c_int = 0x7009; pub const SO_MAXPATHDG: c_int = 0x700A; pub const SO_UPDATE_ACCEPT_CONTEXT: c_int = 0x700B; pub const SO_CONNECT_TIME: c_int = 0x700C; pub const SO_UPDATE_CONNECT_CONTEXT: c_int = 0x7010; pub const TCP_BSDURGENT: c_int = 0x7000; pub const SIO_UDP_CONNRESET: DWORD = _WSAIOW!(IOC_VENDOR, 12); pub const SIO_SOCKET_CLOSE_NOTIFY: DWORD = _WSAIOW!(IOC_VENDOR, 13); pub const SIO_UDP_NETRESET: DWORD = _WSAIOW!(IOC_VENDOR, 15); extern "system" { pub fn WSARecvEx( s: SOCKET, buf: *mut c_char, len: c_int, flags: *mut c_int, ) -> c_int; } STRUCT!{struct TRANSMIT_FILE_BUFFERS { Head: LPVOID, HeadLength: DWORD, Tail: LPVOID, TailLength: DWORD, }} pub type PTRANSMIT_FILE_BUFFERS = *mut TRANSMIT_FILE_BUFFERS; pub type LPTRANSMIT_FILE_BUFFERS = *mut TRANSMIT_FILE_BUFFERS; pub const TF_DISCONNECT: DWORD = 0x01; pub const TF_REUSE_SOCKET: DWORD = 0x02; pub const TF_WRITE_BEHIND: DWORD = 0x04; pub const TF_USE_DEFAULT_WORKER: DWORD = 0x00; pub const TF_USE_SYSTEM_THREAD: DWORD = 0x10; pub const TF_USE_KERNEL_APC: DWORD = 0x20; extern "system" { pub fn TransmitFile( hSocket: SOCKET, hFile: HANDLE, nNumberOfBytesToWrite: DWORD, nNumberOfBytesPerSend: DWORD, lpOverlapped: LPOVERLAPPED, lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS, dwReserved: DWORD, ) -> BOOL; pub fn AcceptEx( sListenSocket: SOCKET, sAcceptSocket: SOCKET, lpOutputBuffer: PVOID, dwReceiveDataLength: DWORD, dwLocalAddressLength: DWORD, dwRemoteAddressLength: DWORD, lpdwBytesReceived: LPDWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL; pub fn GetAcceptExSockaddrs( lpOutputBuffer: PVOID, dwReceiveDataLength: DWORD, dwLocalAddressLength: DWORD, dwRemoteAddressLength: DWORD, LocalSockaddr: *mut *mut SOCKADDR, LocalSockaddrLength: LPINT, RemoteSockaddr: *mut *mut SOCKADDR, RemoteSockaddrLength: LPINT, ); } FN!{stdcall LPFN_TRANSMITFILE( hSocket: SOCKET, hFile: HANDLE, nNumberOfBytesToWrite: DWORD, nNumberOfBytesPerSend: DWORD, lpOverlapped: LPOVERLAPPED, lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS, dwReserved: DWORD, ) -> BOOL} DEFINE_GUID!{WSAID_TRANSMITFILE, 0xb5367df0, 0xcbac, 0x11cf, 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92} FN!{stdcall LPFN_ACCEPTEX( sListenSocket: SOCKET, sAcceptSocket: SOCKET, lpOutputBuffer: PVOID, dwReceiveDataLength: DWORD, dwLocalAddressLength: DWORD, dwRemoteAddressLength: DWORD, lpdwBytesReceived: LPDWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL} DEFINE_GUID!{WSAID_ACCEPTEX, 0xb5367df1, 0xcbac, 0x11cf, 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92} FN!{stdcall LPFN_GETACCEPTEXSOCKADDRS( lpOutputBuffer: PVOID, dwReceiveDataLength: DWORD, dwLocalAddressLength: DWORD, dwRemoteAddressLength: DWORD, LocalSockaddr: *mut *mut SOCKADDR, LocalSockaddrLength: LPINT, RemoteSockaddr: *mut *mut SOCKADDR, RemoteSockaddrLength: LPINT, ) -> ()} DEFINE_GUID!{WSAID_GETACCEPTEXSOCKADDRS, 0xb5367df2, 0xcbac, 0x11cf, 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92} pub const TP_ELEMENT_MEMORY: ULONG = 1; pub const TP_ELEMENT_FILE: ULONG = 2; pub const TP_ELEMENT_EOP: ULONG = 4; STRUCT!{struct TRANSMIT_PACKETS_ELEMENT_u_s { nFileOffset: LARGE_INTEGER, hFile: HANDLE, }} UNION!{union TRANSMIT_PACKETS_ELEMENT_u { [u64; 2], s s_mut: TRANSMIT_PACKETS_ELEMENT_u_s, pBuffer pBuffer_mut: PVOID, }} STRUCT!{struct TRANSMIT_PACKETS_ELEMENT { dwElFlags: ULONG, cLength: ULONG, u: TRANSMIT_PACKETS_ELEMENT_u, }} pub type PTRANSMIT_PACKETS_ELEMENT = *mut TRANSMIT_PACKETS_ELEMENT; pub type LPTRANSMIT_PACKETS_ELEMENT = *mut TRANSMIT_PACKETS_ELEMENT; pub const TP_DISCONNECT: DWORD = TF_DISCONNECT; pub const TP_REUSE_SOCKET: DWORD = TF_REUSE_SOCKET; pub const TP_USE_DEFAULT_WORKER: DWORD = TF_USE_DEFAULT_WORKER; pub const TP_USE_SYSTEM_THREAD: DWORD = TF_USE_SYSTEM_THREAD; pub const TP_USE_KERNEL_APC: DWORD = TF_USE_KERNEL_APC; FN!{stdcall LPFN_TRANSMITPACKETS( hSocket: SOCKET, lpPacketArray: LPTRANSMIT_PACKETS_ELEMENT, nElementCount: DWORD, nSendSize: DWORD, lpOverlapped: LPOVERLAPPED, dwFlags: DWORD, ) -> BOOL} DEFINE_GUID!{WSAID_TRANSMITPACKETS, 0xd9689da0, 0x1f90, 0x11d3, 0x99, 0x71, 0x00, 0xc0, 0x4f, 0x68, 0xc8, 0x76} FN!{stdcall LPFN_CONNECTEX( s: SOCKET, name: *const SOCKADDR, namelen: c_int, lpSendBuffer: PVOID, dwSendDataLength: DWORD, lpdwBytesSent: LPDWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL} DEFINE_GUID!{WSAID_CONNECTEX, 0x25a207b9, 0xddf3, 0x4660, 0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e} FN!{stdcall LPFN_DISCONNECTEX( s: SOCKET, lpOverlapped: LPOVERLAPPED, dwFlags: DWORD, dwReserved: DWORD, ) -> BOOL} DEFINE_GUID!{WSAID_DISCONNECTEX, 0x7fda2e11, 0x8630, 0x436f, 0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57} pub const DE_REUSE_SOCKET: DWORD = TF_REUSE_SOCKET; DEFINE_GUID!{NLA_NAMESPACE_GUID, 0x6642243a, 0x3ba8, 0x4aa6, 0xba, 0xa5, 0x2e, 0xb, 0xd7, 0x1f, 0xdd, 0x83} DEFINE_GUID!{NLA_SERVICE_CLASS_GUID, 0x37e515, 0xb5c9, 0x4a43, 0xba, 0xda, 0x8b, 0x48, 0xa8, 0x7a, 0xd2, 0x39} pub const NLA_ALLUSERS_NETWORK: WSAESETSERVICEOP = 0x00000001; pub const NLA_FRIENDLY_NAME: WSAESETSERVICEOP = 0x00000002; ENUM!{enum NLA_BLOB_DATA_TYPE { NLA_RAW_DATA = 0, NLA_INTERFACE = 1, NLA_802_1X_LOCATION = 2, NLA_CONNECTIVITY = 3, NLA_ICS = 4, }} pub type PNLA_BLOB_DATA_TYPE = *mut NLA_BLOB_DATA_TYPE; ENUM!{enum NLA_CONNECTIVITY_TYPE { NLA_NETWORK_AD_HOC = 0, NLA_NETWORK_MANAGED = 1, NLA_NETWORK_UNMANAGED = 2, NLA_NETWORK_UNKNOWN = 3, }} pub type PNLA_CONNECTIVITY_TYPE = *mut NLA_CONNECTIVITY_TYPE; ENUM!{enum NLA_INTERNET { NLA_INTERNET_UNKNOWN = 0, NLA_INTERNET_NO = 1, NLA_INTERNET_YES = 2, }} pub type PNLA_INTERNET = *mut NLA_INTERNET; STRUCT!{struct NLA_BLOB_s { type_: NLA_BLOB_DATA_TYPE, dwSize: DWORD, nextOffset: DWORD, }} STRUCT!{struct NLA_BLOB_u_s1 { dwType: DWORD, dwSpeed: DWORD, adapterName: [CHAR; 1], }} STRUCT!{struct NLA_BLOB_u_s2 { information: [CHAR; 1], }} STRUCT!{struct NLA_BLOB_u_s3 { type_: NLA_CONNECTIVITY_TYPE, internet: NLA_INTERNET, }} STRUCT!{struct NLA_BLOB_u_s4_s { speed: DWORD, type_: DWORD, state: DWORD, machineName: [WCHAR; 256], sharedAdapterName: [WCHAR; 256], }} STRUCT!{struct NLA_BLOB_u_s4 { remote: NLA_BLOB_u_s4_s, }} UNION!{union NLA_BLOB_u { [u32; 259], rawData rawData_mut: [CHAR; 1], interfaceData interfaceData_mut: NLA_BLOB_u_s1, locationData locationData_mut: NLA_BLOB_u_s2, connectivity connectivity_mut: NLA_BLOB_u_s3, ICS ICS_mut: NLA_BLOB_u_s4, }} STRUCT!{struct NLA_BLOB { header: NLA_BLOB_s, data: NLA_BLOB_u, }} pub type PNLA_BLOB = *mut NLA_BLOB; pub type LPNLA_BLOB = *mut NLA_BLOB; FN!{stdcall LPFN_WSARECVMSG( s: SOCKET, lpMsg: LPWSAMSG, lpdwNumberOfBytesRecvd: LPDWORD, lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> INT} DEFINE_GUID!{WSAID_WSARECVMSG, 0xf689d7c8, 0x6f1f, 0x436b, 0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22} pub const SIO_BSP_HANDLE: DWORD = _WSAIOR!(IOC_WS2, 27); pub const SIO_BSP_HANDLE_SELECT: DWORD = _WSAIOR!(IOC_WS2, 28); pub const SIO_BSP_HANDLE_POLL: DWORD = _WSAIOR!(IOC_WS2, 29); pub const SIO_BASE_HANDLE: DWORD = _WSAIOR!(IOC_WS2, 34); pub const SIO_EXT_SELECT: DWORD = _WSAIORW!(IOC_WS2, 30); pub const SIO_EXT_POLL: DWORD = _WSAIORW!(IOC_WS2, 31); pub const SIO_EXT_SENDMSG: DWORD = _WSAIORW!(IOC_WS2, 32); STRUCT!{struct WSAPOLLDATA { result: c_int, fds: ULONG, timeout: INT, fdArray: *mut WSAPOLLFD, }} pub type LPWSAPOLLDATA = *mut WSAPOLLDATA; STRUCT!{struct WSASENDMSG { lpMsg: LPWSAMSG, dwFlags: DWORD, lpNumberOfBytesSent: LPDWORD, lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, }} pub type LPWSASENDMSG = *mut WSASENDMSG; FN!{stdcall LPFN_WSASENDMSG( s: SOCKET, lpMsg: LPWSAMSG, dwFlags: DWORD, lpNumberOfBytesSent: LPDWORD, lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> INT} DEFINE_GUID!{WSAID_WSASENDMSG, 0xa441e712, 0x754f, 0x43ca, 0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d} FN!{stdcall LPFN_WSAPOLL( fdarray: LPWSAPOLLFD, nfds: ULONG, timeout: INT, ) -> INT} DEFINE_GUID!{WSAID_WSAPOLL, 0x18C76F85, 0xDC66, 0x4964, 0x97, 0x2E, 0x23, 0xC2, 0x72, 0x38, 0x31, 0x2B} FN!{stdcall LPFN_RIORECEIVE( SocketQueue: RIO_RQ, pData: PRIO_BUF, DataBufferCount: ULONG, Flags: DWORD, RequestContext: PVOID, ) -> BOOL} FN!{stdcall LPFN_RIORECEIVEEX( SocketQueue: RIO_RQ, pData: PRIO_BUF, DataBufferCount: ULONG, pLocalAddress: PRIO_BUF, pRemoteAddress: PRIO_BUF, pControlContext: PRIO_BUF, pFlags: PRIO_BUF, Flags: DWORD, RequestContext: PVOID, ) -> c_int} FN!{stdcall LPFN_RIOSEND( SocketQueue: RIO_RQ, pData: PRIO_BUF, DataBufferCount: ULONG, Flags: DWORD, RequestContext: PVOID, ) -> BOOL} FN!{stdcall LPFN_RIOSENDEX( SocketQueue: RIO_RQ, pData: PRIO_BUF, DataBufferCount: ULONG, pLocalAddress: PRIO_BUF, pRemoteAddress: PRIO_BUF, pControlContext: PRIO_BUF, pFlags: PRIO_BUF, Flags: DWORD, RequestContext: PVOID, ) -> BOOL} FN!{stdcall LPFN_RIOCLOSECOMPLETIONQUEUE( CQ: RIO_CQ, ) -> ()} ENUM!{enum RIO_NOTIFICATION_COMPLETION_TYPE { RIO_EVENT_COMPLETION = 1, RIO_IOCP_COMPLETION = 2, }} pub type PRIO_NOTIFICATION_COMPLETION_TYPE = *mut RIO_NOTIFICATION_COMPLETION_TYPE; STRUCT!{struct RIO_NOTIFICATION_COMPLETION_u_s1 { EventHandle: HANDLE, NotifyReset: BOOL, }} STRUCT!{struct RIO_NOTIFICATION_COMPLETION_u_s2 { IocpHandle: HANDLE, CompletionKey: PVOID, Overlapped: PVOID, }} UNION!{union RIO_NOTIFICATION_COMPLETION_u { [u32; 3] [u64; 3], Event Event_mut: RIO_NOTIFICATION_COMPLETION_u_s1, Iocp Iocp_mut: RIO_NOTIFICATION_COMPLETION_u_s2, }} STRUCT!{struct RIO_NOTIFICATION_COMPLETION { Type: RIO_NOTIFICATION_COMPLETION_TYPE, u: RIO_NOTIFICATION_COMPLETION_u, }} pub type PRIO_NOTIFICATION_COMPLETION = *mut RIO_NOTIFICATION_COMPLETION; FN!{stdcall LPFN_RIOCREATECOMPLETIONQUEUE( QueueSize: DWORD, NotificationCompletion: PRIO_NOTIFICATION_COMPLETION, ) -> RIO_CQ} FN!{stdcall LPFN_RIOCREATEREQUESTQUEUE( Socket: SOCKET, MaxOutstandingReceive: ULONG, MaxReceiveDataBuffers: ULONG, MaxOutstandingSend: ULONG, MaxSendDataBuffers: ULONG, ReceiveCQ: RIO_CQ, SendCQ: RIO_CQ, SocketContext: PVOID, ) -> RIO_RQ} FN!{stdcall LPFN_RIODEQUEUECOMPLETION( CQ: RIO_CQ, Array: PRIORESULT, ArraySize: ULONG, ) -> ULONG} FN!{stdcall LPFN_RIODEREGISTERBUFFER( BufferId: RIO_BUFFERID, ) -> ()} FN!{stdcall LPFN_RIONOTIFY( CQ: RIO_CQ, ) -> INT} FN!{stdcall LPFN_RIOREGISTERBUFFER( DataBuffer: PCHAR, DataLength: DWORD, ) -> RIO_BUFFERID} FN!{stdcall LPFN_RIORESIZECOMPLETIONQUEUE( CQ: RIO_CQ, QueueSize: DWORD, ) -> BOOL} FN!{stdcall LPFN_RIORESIZEREQUESTQUEUE( RQ: RIO_RQ, MaxOutstandingReceive: DWORD, MaxOutstandingSend: DWORD, ) -> BOOL} STRUCT!{struct RIO_EXTENSION_FUNCTION_TABLE { cbSize: DWORD, RIOReceive: LPFN_RIORECEIVE, RIOReceiveEx: LPFN_RIORECEIVEEX, RIOSend: LPFN_RIOSEND, RIOSendEx: LPFN_RIOSENDEX, RIOCloseCompletionQueue: LPFN_RIOCLOSECOMPLETIONQUEUE, RIOCreateCompletionQueue: LPFN_RIOCREATECOMPLETIONQUEUE, RIOCreateRequestQueue: LPFN_RIOCREATEREQUESTQUEUE, RIODequeueCompletion: LPFN_RIODEQUEUECOMPLETION, RIODeregisterBuffer: LPFN_RIODEREGISTERBUFFER, RIONotify: LPFN_RIONOTIFY, RIORegisterBuffer: LPFN_RIOREGISTERBUFFER, RIOResizeCompletionQueue: LPFN_RIORESIZECOMPLETIONQUEUE, RIOResizeRequestQueue: LPFN_RIORESIZEREQUESTQUEUE, }} pub type PRIO_EXTENSION_FUNCTION_TABLE = *mut RIO_EXTENSION_FUNCTION_TABLE; DEFINE_GUID!{WSAID_MULTIPLE_RIO, 0x8509e081, 0x96dd, 0x4005, 0xb1, 0x65, 0x9e, 0x2e, 0xe8, 0xc7, 0x9e, 0x3f}