winapi_ui_automation/um/
mswsock.rs

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.
6use ctypes::{c_char, c_int};
7use shared::minwindef::{BOOL, DWORD, INT, LPDWORD, LPINT, LPVOID, ULONG};
8use shared::mswsockdef::{PRIORESULT, PRIO_BUF, RIO_BUFFERID, RIO_CQ, RIO_RQ};
9use shared::ws2def::{IOC_VENDOR, IOC_WS2, LPWSAMSG, SOCKADDR};
10use um::minwinbase::LPOVERLAPPED;
11use um::winnt::{CHAR, HANDLE, LARGE_INTEGER, PCHAR, PVOID, WCHAR};
12use um::winsock2::{
13    LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE, LPWSAPOLLFD, SOCKET, WSAESETSERVICEOP,
14    WSAPOLLFD,
15};
16pub const SO_CONNDATA: c_int = 0x7000;
17pub const SO_CONNOPT: c_int = 0x7001;
18pub const SO_DISCDATA: c_int = 0x7002;
19pub const SO_DISCOPT: c_int = 0x7003;
20pub const SO_CONNDATALEN: c_int = 0x7004;
21pub const SO_CONNOPTLEN: c_int = 0x7005;
22pub const SO_DISCDATALEN: c_int = 0x7006;
23pub const SO_DISCOPTLEN: c_int = 0x7007;
24pub const SO_OPENTYPE: c_int = 0x7008;
25pub const SO_SYNCHRONOUS_ALERT: DWORD = 0x10;
26pub const SO_SYNCHRONOUS_NONALERT: DWORD = 0x20;
27pub const SO_MAXDG: c_int = 0x7009;
28pub const SO_MAXPATHDG: c_int = 0x700A;
29pub const SO_UPDATE_ACCEPT_CONTEXT: c_int = 0x700B;
30pub const SO_CONNECT_TIME: c_int = 0x700C;
31pub const SO_UPDATE_CONNECT_CONTEXT: c_int = 0x7010;
32pub const TCP_BSDURGENT: c_int = 0x7000;
33pub const SIO_UDP_CONNRESET: DWORD = _WSAIOW!(IOC_VENDOR, 12);
34pub const SIO_SOCKET_CLOSE_NOTIFY: DWORD = _WSAIOW!(IOC_VENDOR, 13);
35pub const SIO_UDP_NETRESET: DWORD = _WSAIOW!(IOC_VENDOR, 15);
36extern "system" {
37    pub fn WSARecvEx(
38        s: SOCKET,
39        buf: *mut c_char,
40        len: c_int,
41        flags: *mut c_int,
42    ) -> c_int;
43}
44STRUCT!{struct TRANSMIT_FILE_BUFFERS {
45    Head: LPVOID,
46    HeadLength: DWORD,
47    Tail: LPVOID,
48    TailLength: DWORD,
49}}
50pub type PTRANSMIT_FILE_BUFFERS = *mut TRANSMIT_FILE_BUFFERS;
51pub type LPTRANSMIT_FILE_BUFFERS = *mut TRANSMIT_FILE_BUFFERS;
52pub const TF_DISCONNECT: DWORD = 0x01;
53pub const TF_REUSE_SOCKET: DWORD = 0x02;
54pub const TF_WRITE_BEHIND: DWORD = 0x04;
55pub const TF_USE_DEFAULT_WORKER: DWORD = 0x00;
56pub const TF_USE_SYSTEM_THREAD: DWORD = 0x10;
57pub const TF_USE_KERNEL_APC: DWORD = 0x20;
58extern "system" {
59    pub fn TransmitFile(
60        hSocket: SOCKET,
61        hFile: HANDLE,
62        nNumberOfBytesToWrite: DWORD,
63        nNumberOfBytesPerSend: DWORD,
64        lpOverlapped: LPOVERLAPPED,
65        lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS,
66        dwReserved: DWORD,
67    ) -> BOOL;
68    pub fn AcceptEx(
69        sListenSocket: SOCKET,
70        sAcceptSocket: SOCKET,
71        lpOutputBuffer: PVOID,
72        dwReceiveDataLength: DWORD,
73        dwLocalAddressLength: DWORD,
74        dwRemoteAddressLength: DWORD,
75        lpdwBytesReceived: LPDWORD,
76        lpOverlapped: LPOVERLAPPED,
77    ) -> BOOL;
78    pub fn GetAcceptExSockaddrs(
79        lpOutputBuffer: PVOID,
80        dwReceiveDataLength: DWORD,
81        dwLocalAddressLength: DWORD,
82        dwRemoteAddressLength: DWORD,
83        LocalSockaddr: *mut *mut SOCKADDR,
84        LocalSockaddrLength: LPINT,
85        RemoteSockaddr: *mut *mut SOCKADDR,
86        RemoteSockaddrLength: LPINT,
87    );
88}
89FN!{stdcall LPFN_TRANSMITFILE(
90    hSocket: SOCKET,
91    hFile: HANDLE,
92    nNumberOfBytesToWrite: DWORD,
93    nNumberOfBytesPerSend: DWORD,
94    lpOverlapped: LPOVERLAPPED,
95    lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS,
96    dwReserved: DWORD,
97) -> BOOL}
98DEFINE_GUID!{WSAID_TRANSMITFILE,
99    0xb5367df0, 0xcbac, 0x11cf, 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}
100FN!{stdcall LPFN_ACCEPTEX(
101    sListenSocket: SOCKET,
102    sAcceptSocket: SOCKET,
103    lpOutputBuffer: PVOID,
104    dwReceiveDataLength: DWORD,
105    dwLocalAddressLength: DWORD,
106    dwRemoteAddressLength: DWORD,
107    lpdwBytesReceived: LPDWORD,
108    lpOverlapped: LPOVERLAPPED,
109) -> BOOL}
110DEFINE_GUID!{WSAID_ACCEPTEX,
111    0xb5367df1, 0xcbac, 0x11cf, 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}
112FN!{stdcall LPFN_GETACCEPTEXSOCKADDRS(
113    lpOutputBuffer: PVOID,
114    dwReceiveDataLength: DWORD,
115    dwLocalAddressLength: DWORD,
116    dwRemoteAddressLength: DWORD,
117    LocalSockaddr: *mut *mut SOCKADDR,
118    LocalSockaddrLength: LPINT,
119    RemoteSockaddr: *mut *mut SOCKADDR,
120    RemoteSockaddrLength: LPINT,
121) -> ()}
122DEFINE_GUID!{WSAID_GETACCEPTEXSOCKADDRS,
123    0xb5367df2, 0xcbac, 0x11cf, 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}
124pub const TP_ELEMENT_MEMORY: ULONG = 1;
125pub const TP_ELEMENT_FILE: ULONG = 2;
126pub const TP_ELEMENT_EOP: ULONG = 4;
127STRUCT!{struct TRANSMIT_PACKETS_ELEMENT_u_s {
128    nFileOffset: LARGE_INTEGER,
129    hFile: HANDLE,
130}}
131UNION!{union TRANSMIT_PACKETS_ELEMENT_u {
132    [u64; 2],
133    s s_mut: TRANSMIT_PACKETS_ELEMENT_u_s,
134    pBuffer pBuffer_mut: PVOID,
135}}
136STRUCT!{struct TRANSMIT_PACKETS_ELEMENT {
137    dwElFlags: ULONG,
138    cLength: ULONG,
139    u: TRANSMIT_PACKETS_ELEMENT_u,
140}}
141pub type PTRANSMIT_PACKETS_ELEMENT = *mut TRANSMIT_PACKETS_ELEMENT;
142pub type LPTRANSMIT_PACKETS_ELEMENT = *mut TRANSMIT_PACKETS_ELEMENT;
143pub const TP_DISCONNECT: DWORD = TF_DISCONNECT;
144pub const TP_REUSE_SOCKET: DWORD = TF_REUSE_SOCKET;
145pub const TP_USE_DEFAULT_WORKER: DWORD = TF_USE_DEFAULT_WORKER;
146pub const TP_USE_SYSTEM_THREAD: DWORD = TF_USE_SYSTEM_THREAD;
147pub const TP_USE_KERNEL_APC: DWORD = TF_USE_KERNEL_APC;
148FN!{stdcall LPFN_TRANSMITPACKETS(
149    hSocket: SOCKET,
150    lpPacketArray: LPTRANSMIT_PACKETS_ELEMENT,
151    nElementCount: DWORD,
152    nSendSize: DWORD,
153    lpOverlapped: LPOVERLAPPED,
154    dwFlags: DWORD,
155) -> BOOL}
156DEFINE_GUID!{WSAID_TRANSMITPACKETS,
157    0xd9689da0, 0x1f90, 0x11d3, 0x99, 0x71, 0x00, 0xc0, 0x4f, 0x68, 0xc8, 0x76}
158FN!{stdcall LPFN_CONNECTEX(
159    s: SOCKET,
160    name: *const SOCKADDR,
161    namelen: c_int,
162    lpSendBuffer: PVOID,
163    dwSendDataLength: DWORD,
164    lpdwBytesSent: LPDWORD,
165    lpOverlapped: LPOVERLAPPED,
166) -> BOOL}
167DEFINE_GUID!{WSAID_CONNECTEX,
168    0x25a207b9, 0xddf3, 0x4660, 0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}
169FN!{stdcall LPFN_DISCONNECTEX(
170    s: SOCKET,
171    lpOverlapped: LPOVERLAPPED,
172    dwFlags: DWORD,
173    dwReserved: DWORD,
174) -> BOOL}
175DEFINE_GUID!{WSAID_DISCONNECTEX,
176    0x7fda2e11, 0x8630, 0x436f, 0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}
177pub const DE_REUSE_SOCKET: DWORD = TF_REUSE_SOCKET;
178DEFINE_GUID!{NLA_NAMESPACE_GUID,
179    0x6642243a, 0x3ba8, 0x4aa6, 0xba, 0xa5, 0x2e, 0xb, 0xd7, 0x1f, 0xdd, 0x83}
180DEFINE_GUID!{NLA_SERVICE_CLASS_GUID,
181    0x37e515, 0xb5c9, 0x4a43, 0xba, 0xda, 0x8b, 0x48, 0xa8, 0x7a, 0xd2, 0x39}
182pub const NLA_ALLUSERS_NETWORK: WSAESETSERVICEOP = 0x00000001;
183pub const NLA_FRIENDLY_NAME: WSAESETSERVICEOP = 0x00000002;
184ENUM!{enum NLA_BLOB_DATA_TYPE {
185    NLA_RAW_DATA = 0,
186    NLA_INTERFACE = 1,
187    NLA_802_1X_LOCATION = 2,
188    NLA_CONNECTIVITY = 3,
189    NLA_ICS = 4,
190}}
191pub type PNLA_BLOB_DATA_TYPE = *mut NLA_BLOB_DATA_TYPE;
192ENUM!{enum NLA_CONNECTIVITY_TYPE {
193    NLA_NETWORK_AD_HOC = 0,
194    NLA_NETWORK_MANAGED = 1,
195    NLA_NETWORK_UNMANAGED = 2,
196    NLA_NETWORK_UNKNOWN = 3,
197}}
198pub type PNLA_CONNECTIVITY_TYPE = *mut NLA_CONNECTIVITY_TYPE;
199ENUM!{enum NLA_INTERNET {
200    NLA_INTERNET_UNKNOWN = 0,
201    NLA_INTERNET_NO = 1,
202    NLA_INTERNET_YES = 2,
203}}
204pub type PNLA_INTERNET = *mut NLA_INTERNET;
205STRUCT!{struct NLA_BLOB_s {
206    type_: NLA_BLOB_DATA_TYPE,
207    dwSize: DWORD,
208    nextOffset: DWORD,
209}}
210STRUCT!{struct NLA_BLOB_u_s1 {
211    dwType: DWORD,
212    dwSpeed: DWORD,
213    adapterName: [CHAR; 1],
214}}
215STRUCT!{struct NLA_BLOB_u_s2 {
216    information: [CHAR; 1],
217}}
218STRUCT!{struct NLA_BLOB_u_s3 {
219    type_: NLA_CONNECTIVITY_TYPE,
220    internet: NLA_INTERNET,
221}}
222STRUCT!{struct NLA_BLOB_u_s4_s {
223    speed: DWORD,
224    type_: DWORD,
225    state: DWORD,
226    machineName: [WCHAR; 256],
227    sharedAdapterName: [WCHAR; 256],
228}}
229STRUCT!{struct NLA_BLOB_u_s4 {
230    remote: NLA_BLOB_u_s4_s,
231}}
232UNION!{union NLA_BLOB_u {
233    [u32; 259],
234    rawData rawData_mut: [CHAR; 1],
235    interfaceData interfaceData_mut: NLA_BLOB_u_s1,
236    locationData locationData_mut: NLA_BLOB_u_s2,
237    connectivity connectivity_mut: NLA_BLOB_u_s3,
238    ICS ICS_mut: NLA_BLOB_u_s4,
239}}
240STRUCT!{struct NLA_BLOB {
241    header: NLA_BLOB_s,
242    data: NLA_BLOB_u,
243}}
244pub type PNLA_BLOB = *mut NLA_BLOB;
245pub type LPNLA_BLOB = *mut NLA_BLOB;
246FN!{stdcall LPFN_WSARECVMSG(
247    s: SOCKET,
248    lpMsg: LPWSAMSG,
249    lpdwNumberOfBytesRecvd: LPDWORD,
250    lpOverlapped: LPWSAOVERLAPPED,
251    lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
252) -> INT}
253DEFINE_GUID!{WSAID_WSARECVMSG,
254    0xf689d7c8, 0x6f1f, 0x436b, 0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22}
255pub const SIO_BSP_HANDLE: DWORD = _WSAIOR!(IOC_WS2, 27);
256pub const SIO_BSP_HANDLE_SELECT: DWORD = _WSAIOR!(IOC_WS2, 28);
257pub const SIO_BSP_HANDLE_POLL: DWORD = _WSAIOR!(IOC_WS2, 29);
258pub const SIO_BASE_HANDLE: DWORD = _WSAIOR!(IOC_WS2, 34);
259pub const SIO_EXT_SELECT: DWORD = _WSAIORW!(IOC_WS2, 30);
260pub const SIO_EXT_POLL: DWORD = _WSAIORW!(IOC_WS2, 31);
261pub const SIO_EXT_SENDMSG: DWORD = _WSAIORW!(IOC_WS2, 32);
262STRUCT!{struct WSAPOLLDATA {
263    result: c_int,
264    fds: ULONG,
265    timeout: INT,
266    fdArray: *mut WSAPOLLFD,
267}}
268pub type LPWSAPOLLDATA = *mut WSAPOLLDATA;
269STRUCT!{struct WSASENDMSG {
270    lpMsg: LPWSAMSG,
271    dwFlags: DWORD,
272    lpNumberOfBytesSent: LPDWORD,
273    lpOverlapped: LPWSAOVERLAPPED,
274    lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
275}}
276pub type LPWSASENDMSG = *mut WSASENDMSG;
277FN!{stdcall LPFN_WSASENDMSG(
278    s: SOCKET,
279    lpMsg: LPWSAMSG,
280    dwFlags: DWORD,
281    lpNumberOfBytesSent: LPDWORD,
282    lpOverlapped: LPWSAOVERLAPPED,
283    lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
284) -> INT}
285DEFINE_GUID!{WSAID_WSASENDMSG,
286    0xa441e712, 0x754f, 0x43ca, 0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d}
287FN!{stdcall LPFN_WSAPOLL(
288    fdarray: LPWSAPOLLFD,
289    nfds: ULONG,
290    timeout: INT,
291) -> INT}
292DEFINE_GUID!{WSAID_WSAPOLL,
293    0x18C76F85, 0xDC66, 0x4964, 0x97, 0x2E, 0x23, 0xC2, 0x72, 0x38, 0x31, 0x2B}
294FN!{stdcall LPFN_RIORECEIVE(
295    SocketQueue: RIO_RQ,
296    pData: PRIO_BUF,
297    DataBufferCount: ULONG,
298    Flags: DWORD,
299    RequestContext: PVOID,
300) -> BOOL}
301FN!{stdcall LPFN_RIORECEIVEEX(
302    SocketQueue: RIO_RQ,
303    pData: PRIO_BUF,
304    DataBufferCount: ULONG,
305    pLocalAddress: PRIO_BUF,
306    pRemoteAddress: PRIO_BUF,
307    pControlContext: PRIO_BUF,
308    pFlags: PRIO_BUF,
309    Flags: DWORD,
310    RequestContext: PVOID,
311) -> c_int}
312FN!{stdcall LPFN_RIOSEND(
313    SocketQueue: RIO_RQ,
314    pData: PRIO_BUF,
315    DataBufferCount: ULONG,
316    Flags: DWORD,
317    RequestContext: PVOID,
318) -> BOOL}
319FN!{stdcall LPFN_RIOSENDEX(
320    SocketQueue: RIO_RQ,
321    pData: PRIO_BUF,
322    DataBufferCount: ULONG,
323    pLocalAddress: PRIO_BUF,
324    pRemoteAddress: PRIO_BUF,
325    pControlContext: PRIO_BUF,
326    pFlags: PRIO_BUF,
327    Flags: DWORD,
328    RequestContext: PVOID,
329) -> BOOL}
330FN!{stdcall LPFN_RIOCLOSECOMPLETIONQUEUE(
331    CQ: RIO_CQ,
332) -> ()}
333ENUM!{enum RIO_NOTIFICATION_COMPLETION_TYPE {
334    RIO_EVENT_COMPLETION = 1,
335    RIO_IOCP_COMPLETION = 2,
336}}
337pub type PRIO_NOTIFICATION_COMPLETION_TYPE = *mut RIO_NOTIFICATION_COMPLETION_TYPE;
338STRUCT!{struct RIO_NOTIFICATION_COMPLETION_u_s1 {
339    EventHandle: HANDLE,
340    NotifyReset: BOOL,
341}}
342STRUCT!{struct RIO_NOTIFICATION_COMPLETION_u_s2 {
343    IocpHandle: HANDLE,
344    CompletionKey: PVOID,
345    Overlapped: PVOID,
346}}
347UNION!{union RIO_NOTIFICATION_COMPLETION_u {
348    [u32; 3] [u64; 3],
349    Event Event_mut: RIO_NOTIFICATION_COMPLETION_u_s1,
350    Iocp Iocp_mut: RIO_NOTIFICATION_COMPLETION_u_s2,
351}}
352STRUCT!{struct RIO_NOTIFICATION_COMPLETION {
353    Type: RIO_NOTIFICATION_COMPLETION_TYPE,
354    u: RIO_NOTIFICATION_COMPLETION_u,
355}}
356pub type PRIO_NOTIFICATION_COMPLETION = *mut RIO_NOTIFICATION_COMPLETION;
357FN!{stdcall LPFN_RIOCREATECOMPLETIONQUEUE(
358    QueueSize: DWORD,
359    NotificationCompletion: PRIO_NOTIFICATION_COMPLETION,
360) -> RIO_CQ}
361FN!{stdcall LPFN_RIOCREATEREQUESTQUEUE(
362    Socket: SOCKET,
363    MaxOutstandingReceive: ULONG,
364    MaxReceiveDataBuffers: ULONG,
365    MaxOutstandingSend: ULONG,
366    MaxSendDataBuffers: ULONG,
367    ReceiveCQ: RIO_CQ,
368    SendCQ: RIO_CQ,
369    SocketContext: PVOID,
370) -> RIO_RQ}
371FN!{stdcall LPFN_RIODEQUEUECOMPLETION(
372    CQ: RIO_CQ,
373    Array: PRIORESULT,
374    ArraySize: ULONG,
375) -> ULONG}
376FN!{stdcall LPFN_RIODEREGISTERBUFFER(
377    BufferId: RIO_BUFFERID,
378) -> ()}
379FN!{stdcall LPFN_RIONOTIFY(
380    CQ: RIO_CQ,
381) -> INT}
382FN!{stdcall LPFN_RIOREGISTERBUFFER(
383    DataBuffer: PCHAR,
384    DataLength: DWORD,
385) -> RIO_BUFFERID}
386FN!{stdcall LPFN_RIORESIZECOMPLETIONQUEUE(
387    CQ: RIO_CQ,
388    QueueSize: DWORD,
389) -> BOOL}
390FN!{stdcall LPFN_RIORESIZEREQUESTQUEUE(
391    RQ: RIO_RQ,
392    MaxOutstandingReceive: DWORD,
393    MaxOutstandingSend: DWORD,
394) -> BOOL}
395STRUCT!{struct RIO_EXTENSION_FUNCTION_TABLE {
396    cbSize: DWORD,
397    RIOReceive: LPFN_RIORECEIVE,
398    RIOReceiveEx: LPFN_RIORECEIVEEX,
399    RIOSend: LPFN_RIOSEND,
400    RIOSendEx: LPFN_RIOSENDEX,
401    RIOCloseCompletionQueue: LPFN_RIOCLOSECOMPLETIONQUEUE,
402    RIOCreateCompletionQueue: LPFN_RIOCREATECOMPLETIONQUEUE,
403    RIOCreateRequestQueue: LPFN_RIOCREATEREQUESTQUEUE,
404    RIODequeueCompletion: LPFN_RIODEQUEUECOMPLETION,
405    RIODeregisterBuffer: LPFN_RIODEREGISTERBUFFER,
406    RIONotify: LPFN_RIONOTIFY,
407    RIORegisterBuffer: LPFN_RIOREGISTERBUFFER,
408    RIOResizeCompletionQueue: LPFN_RIORESIZECOMPLETIONQUEUE,
409    RIOResizeRequestQueue: LPFN_RIORESIZEREQUESTQUEUE,
410}}
411pub type PRIO_EXTENSION_FUNCTION_TABLE = *mut RIO_EXTENSION_FUNCTION_TABLE;
412DEFINE_GUID!{WSAID_MULTIPLE_RIO,
413    0x8509e081, 0x96dd, 0x4005, 0xb1, 0x65, 0x9e, 0x2e, 0xe8, 0xc7, 0x9e, 0x3f}