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