1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW Windows headers
5  *
6  * Authors: Daniel Keep
7  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
8  * Source: $(DRUNTIMESRC core/sys/windows/_mswsock.d)
9  */
10 /// Automatically imported and edited from the druntime module
11 /// core.sys.windows.mswsock for the auto-generated win32 package.
12 module win32.mswsock;
13 //version (Windows):
14 @system:
15 
16 import win32.winbase, win32.windef;
17 import win32.basetyps, win32.w32api;
18 
19 import win32.winsock2;
20 
21 //static if (_WIN32_WINNT >= 0x500) {
22     enum {
23         /* WinNT5+:
24            ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
25         SO_MAXDG             = 0x7009,
26         SO_MAXPATHDG         = 0x700A,
27     }
28 //}
29 
30 enum {
31     /* WinNT4+:
32        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options_for_windows_nt_4_0_2.htm */
33     SO_CONNDATA              = 0x7000,
34     SO_CONNOPT               = 0x7001,
35     SO_DISCDATA              = 0x7002,
36     SO_DISCOPT               = 0x7003,
37     SO_CONNDATALEN           = 0x7004,
38     SO_CONNOPTLEN            = 0x7005,
39     SO_DISCDATALEN           = 0x7006,
40     SO_DISCOPTLEN            = 0x7007,
41 
42     /* WinNT4:
43        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
44     SO_UPDATE_ACCEPT_CONTENT = 0x700B,
45 }
46 
47 enum {
48     /* Win95+, WinNT4+ but apparently shouldn't used: mark as deprecated?
49        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
50     SO_OPENTYPE                  = 0x7008,
51 
52     /* Win95+; these two are passed to the SO_OPENTYPE option as arguments,
53        so would they be deprecated as well?
54        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
55     SO_SYNCHRONOUS_ALERT         = 0x0010,
56     SO_SYNCHRONOUS_NONALERT      = 0x0020,
57 
58     /* Win95:
59        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
60     SO_CONNECT_TIME              = 0x700C,
61 }
62 
63 
64 enum {
65     TCP_BSDURGENT = 0x7000,
66 }
67 
68 /* These *appear* to be constants for passing to the TransmitFile /
69    TransmitPackets functions, which are available in WinNT3.51+
70    ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */
71 enum {
72     TF_DISCONNECT         = 1,
73     TF_REUSE_SOCKET       = 2,
74     TF_WRITE_BEHIND       = 4,
75     TF_USE_DEFAULT_WORKER = 0,
76     TF_USE_SYSTEM_THREAD  = 16,
77     TF_USE_KERNEL_APC     = 32
78 }
79 
80 /* Win95+, WinNT3.51+
81    ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_file_buffers_2.htm */
82 struct TRANSMIT_FILE_BUFFERS {
83     PVOID Head;
84     DWORD HeadLength;
85     PVOID Tail;
86     DWORD TailLength;
87 }
88 alias TRANSMIT_FILE_BUFFERS* PTRANSMIT_FILE_BUFFERS, LPTRANSMIT_FILE_BUFFERS;
89 
90 extern(Windows) {
91     /* Win95+, WinNT3.51+
92        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvex_2.htm */
93     int WSARecvEx(SOCKET, char*, int, int*);
94 
95     /* Win95+, WinNT3.51+
96        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/getacceptexSOCKADDRs_2.htm */
97     VOID GetAcceptExSockaddrs(PVOID, DWORD, DWORD, DWORD, SOCKADDR**, LPINT, SOCKADDR**, LPINT);
98 
99     /* WinNT3.51+
100        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */
101     BOOL TransmitFile(SOCKET, HANDLE, DWORD, DWORD, LPOVERLAPPED, LPTRANSMIT_FILE_BUFFERS, DWORD);
102 
103     /* WinNT3.51+
104        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/acceptex_2.htm */
105     alias BOOL function(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED) LPFN_ACCEPTEX;
106     const GUID WSAID_ACCEPTEX = {0xb5367df1,0xcbac,0x11cf,[0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]};
107 
108     alias BOOL function(SOCKET, SOCKADDR*, int, PVOID, DWORD, LPDWORD, LPOVERLAPPED) LPFN_CONNECTEX;
109     const GUID WSAID_CONNECTEX = {0x25a207b9,0xddf3,0x4660,[0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e]};
110 }
111 
112 static if (_WIN32_WINNT >= 0x501) {
113     /*  These appear to be constants for the TRANSMIT_PACKETS_ELEMENT
114      *  structure below, so I've given them the same minimum version
115      */
116     enum {
117         TP_ELEMENT_FILE   = 1,
118         TP_ELEMENT_MEMORY = 2,
119         TP_ELEMENT_EOP    = 4
120     }
121 
122     /*  WinXP+, Srv2k3+
123      *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_packets_element_2.htm
124      */
125     struct TRANSMIT_PACKETS_ELEMENT {
126         ULONG dwElFlags;
127         ULONG cLength;
128         union {
129             struct {
130                 LARGE_INTEGER nFileOffset;
131                 HANDLE        hFile;
132             }
133             PVOID pBuffer;
134         }
135     }
136 
137     struct WSABUF {
138         ULONG len;
139         CHAR* buf;
140     }
141 
142     alias WSABUF* LPWSABUF;
143 
144     /*  WinXP+, Server2003+:
145      *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsamsg_2.htm
146      */
147     struct WSAMSG {
148         LPSOCKADDR name;
149         INT        namelen;
150         LPWSABUF   lpBuffers;
151         DWORD      dwBufferCount;
152         WSABUF     Control;
153         DWORD      dwFlags;
154     }
155 
156     alias WSAMSG* PWSAMSG, LPWSAMSG;
157 
158     /* According to MSDN docs, the WSAMSG.Control buffer starts with a
159        cmsghdr header of the following form.  See also RFC 2292. */
160     /* DK: Confirmed.  So I suppose these should get the same version as
161        WSAMSG... */
162     struct WSACMSGHDR {
163         SIZE_T cmsg_len;
164         INT  cmsg_level;
165         INT  cmsg_type;
166         // followed by UCHAR cmsg_data[];
167     }
168 }
169 
170 static if (_WIN32_WINNT >= 0x600) {
171     /* TODO: Standard Posix.1g macros as per RFC 2292, with WSA_uglification. */
172     /* DK: MinGW doesn't define these, and neither does the MSDN docs.  Might have
173        to actually look up RFC 2292... */
174     /+
175     #if 0
176     #define WSA_CMSG_FIRSTHDR(mhdr)
177     #define WSA_CMSG_NXTHDR(mhdr, cmsg)
178     #define WSA_CMSG_SPACE(length)
179     #define WSA_CMSG_LEN(length)
180     #endif
181     +/
182 
183     /*  Win Vista+, Srv2k3+
184      *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/disconnectex_2.htm
185      */
186     extern(Windows) BOOL DisconnectEx(SOCKET, LPOVERLAPPED, DWORD, DWORD);
187 }
188 
189 static if (_WIN32_WINNT >= 0x501) {
190     /*  WinXP+, Srv2k3+
191      *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvmsg_2.htm
192      */
193     extern(Windows) int WSARecvMsg(SOCKET, LPWSAMSG, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
194 }