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