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