blob: cbbe191359db33d23c58558d8affb58f6f9540c0 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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}