diff win32/winsock2.d @ 1:4a9dcbd9e54f

-files of 0.13 beta -fixes so that it now compiles with the current dmd version
author marton@basel.hu
date Tue, 05 Apr 2011 20:44:01 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winsock2.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1464 @@
+/***********************************************************************\
+*                              winsock2.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                             by Daniel Keep                            *
+\***********************************************************************/
+module win32.winsock2;
+pragma(lib, "Ws2_32.lib");
+
+/*
+  Definitions for winsock 2
+
+  Contributed by the WINE project.
+
+  Portions Copyright (c) 1980, 1983, 1988, 1993
+  The Regents of the University of California.  All rights reserved.
+
+  Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ */
+
+/*	DRK: This module should not be included if -version=Win32_Winsock2 has
+ *	not been set.  If it has, assert.  I think it's better this way than
+ *	letting the user believe that it's worked.
+ *
+ *	SG: It has now been changed so that winsock2 is the default, and
+ *	-version=Win32_Winsock1 must be set to use winsock.
+ */
+version(Win32_Winsock1) {
+	pragma(msg, "Cannot use win32.winsock2 with Win32_Winsock1 defined.");
+	static assert(false);
+}
+
+import win32.winbase;
+import win32.windef;
+import win32.basetyps;
+
+alias char u_char;
+alias ushort u_short;
+alias uint u_int, u_long, SOCKET;
+
+const size_t FD_SETSIZE = 64;
+
+/* shutdown() how types */
+enum : int {
+	SD_RECEIVE,
+	SD_SEND,
+	SD_BOTH
+}
+
+/* Good grief this is stupid... is it a struct?  A preprocessor macro?  A
+   struct tag?  Who the hell knows!? */
+struct FD_SET {
+	u_int               fd_count;
+	SOCKET[FD_SETSIZE]  fd_array;
+
+	/* this differs from the define in winsock.h and in cygwin sys/types.h */
+	static void opCall(SOCKET fd, FD_SET set) {
+		u_int i;
+		for (i = 0; i < set.fd_count; i++)
+			if (set.fd_array[i] == fd)
+				break;
+		if (i == set.fd_count)
+			if (set.fd_count < FD_SETSIZE) {
+				set.fd_array[i] = fd;
+				set.fd_count++;
+			}
+	}
+}
+alias FD_SET* PFD_SET, LPFD_SET;
+
+// Keep this alias, since fd_set isn't a tag name in the original header.
+alias FD_SET fd_set;
+
+extern(Windows) int __WSAFDIsSet(SOCKET, FD_SET*);
+alias __WSAFDIsSet FD_ISSET;
+
+void FD_CLR(SOCKET fd, FD_SET* set) {
+	for (u_int i = 0; i < set.fd_count; i++) {
+		if (set.fd_array[i] == fd) {
+			while (i < set.fd_count - 1) {
+				set.fd_array[i] = set.fd_array[i+1];
+				i++;
+			}
+			set.fd_count--;
+			break;
+		}
+	}
+}
+
+void FD_ZERO(FD_SET* set) {
+	set.fd_count = 0;
+}
+
+
+struct TIMEVAL {
+	int tv_sec;
+	int tv_usec;
+
+	int opCmp(TIMEVAL tv) {
+		if (tv_sec < tv.tv_sec)   return -1;
+		if (tv_sec > tv.tv_sec)   return  1;
+		if (tv_usec < tv.tv_usec) return -1;
+		if (tv_usec > tv.tv_usec) return  1;
+		return 0;
+	}
+}
+alias TIMEVAL* PTIMEVAL, LPTIMEVAL;
+
+bool timerisset(TIMEVAL* tvp) {
+	return tvp.tv_sec || tvp.tv_usec;
+}
+
+/+
+/* DRK: These have been commented out because it was felt that using
+ * omCmp on the TIMEVAL struct was cleaner.  Still, perhaps these should
+ * be enabled under a version tag for compatibility's sake?
+ * If it is decided that it's just ugly and unwanted, then feel free to
+ * delete this section :)
+ */
+int timercmp(TIMEVAL* tvp, TIMEVAL* uvp) {
+	return tvp.tv_sec != uvp.tv_sec ?
+	    (tvp.tv_sec < uvp.tv_sec ? -1 :
+            (tvp.tv_sec > uvp.tv_sec ? 1 : 0)) :
+	    (tvp.tv_usec < uvp.tv_usec ? -1 :
+	        (tvp.tv_usec > uvp.tv_usec ? 1 : 0));
+}
+
+int timercmp(TIMEVAL* tvp, TIMEVAL* uvp, int function(long,long) cmp) {
+	return tvp.tv_sec != uvp.tv_sec ?
+	    cmp(tvp.tv_sec, uvp.tv_sec) :
+	    cmp(tvp.tv_usec, uvp.tv_usec);
+}+/
+
+void timerclear(inout TIMEVAL tvp) {
+	tvp.tv_sec = tvp.tv_usec = 0;
+}
+
+struct HOSTENT {
+	char*  h_name;
+	char** h_aliases;
+	short  h_addrtype;
+	short  h_length;
+	char** h_addr_list;
+
+	char* h_addr() { return h_addr_list[0]; }
+	char* h_addr(char* h) { return h_addr_list[0] = h; }
+}
+alias HOSTENT* PHOSTENT, LPHOSTENT;
+
+struct LINGER {
+	u_short l_onoff;
+	u_short l_linger;
+}
+alias LINGER* PLINGER, LPLINGER;
+
+enum : DWORD {
+	IOCPARAM_MASK = 0x7f,
+	IOC_VOID      = 0x20000000,
+	IOC_OUT       = 0x40000000,
+	IOC_IN        = 0x80000000,
+	IOC_INOUT     = IOC_IN|IOC_OUT
+}
+
+// NOTE: This isn't even used anywhere...
+private template _IO(char x, ubyte y) {
+	const DWORD _IO = IOC_VOID | (cast(ubyte)x<<8) | y;
+}
+
+private template _IOR(char x, ubyte y, t) {
+	const DWORD _IOR = IOC_OUT | ((t.sizeof & IOCPARAM_MASK)<<16)
+		| (cast(ubyte)x<<8) | y;
+}
+
+private template _IOW(char x, ubyte y, t) {
+	const DWORD _IOW = IOC_IN | ((t.sizeof & IOCPARAM_MASK)<<16)
+		| (cast(ubyte)x<<8) | y;
+}
+
+enum : DWORD {
+	FIONBIO    = _IOW!('f', 126, u_long),
+	FIONREAD   = _IOR!('f', 127, u_long),
+	FIOASYNC   = _IOW!('f', 125, u_long),
+	SIOCSHIWAT = _IOW!('s',   0, u_long),
+	SIOCGHIWAT = _IOR!('s',   1, u_long),
+	SIOCSLOWAT = _IOW!('s',   2, u_long),
+	SIOCGLOWAT = _IOR!('s',   3, u_long),
+	SIOCATMARK = _IOR!('s',   7, u_long)
+}
+
+struct netent {
+	char*  n_name;
+	char** n_aliases;
+	short  n_addrtype;
+	u_long n_net;
+}
+
+struct SERVENT {
+	char*  s_name;
+	char** s_aliases;
+	short  s_port;
+	char*  s_proto;
+}
+alias SERVENT* PSERVENT, LPSERVENT;
+
+struct PROTOENT {
+	char*  p_name;
+	char** p_aliases;
+	short  p_proto;
+}
+alias PROTOENT* PPROTOENT, LPPROTOENT;
+
+enum : int {
+	IPPROTO_IP   =   0,
+	IPPROTO_ICMP =   1,
+	IPPROTO_IGMP =   2,
+	IPPROTO_GGP  =   3,
+	IPPROTO_TCP  =   6,
+	IPPROTO_PUP  =  12,
+	IPPROTO_UDP  =  17,
+	IPPROTO_IDP  =  22,
+	IPPROTO_ND   =  77,
+	IPPROTO_RAW  = 255,
+	IPPROTO_MAX  = 256,
+
+	// IPv6 options
+	IPPROTO_HOPOPTS  =  0, // IPv6 Hop-by-Hop options
+	IPPROTO_IPV6     = 41, // IPv6 header
+	IPPROTO_ROUTING  = 43, // IPv6 Routing header
+	IPPROTO_FRAGMENT = 44, // IPv6 fragmentation header
+	IPPROTO_ESP      = 50, // encapsulating security payload
+	IPPROTO_AH       = 51, // authentication header
+	IPPROTO_ICMPV6   = 58, // ICMPv6
+	IPPROTO_NONE     = 59, // IPv6 no next header
+	IPPROTO_DSTOPTS  = 60  // IPv6 Destination options
+}
+
+enum {
+	IPPORT_ECHO        =    7,
+	IPPORT_DISCARD     =    9,
+	IPPORT_SYSTAT      =   11,
+	IPPORT_DAYTIME     =   13,
+	IPPORT_NETSTAT     =   15,
+	IPPORT_FTP         =   21,
+	IPPORT_TELNET      =   23,
+	IPPORT_SMTP        =   25,
+	IPPORT_TIMESERVER  =   37,
+	IPPORT_NAMESERVER  =   42,
+	IPPORT_WHOIS       =   43,
+	IPPORT_MTP         =   57,
+	IPPORT_TFTP        =   69,
+	IPPORT_RJE         =   77,
+	IPPORT_FINGER      =   79,
+	IPPORT_TTYLINK     =   87,
+	IPPORT_SUPDUP      =   95,
+	IPPORT_EXECSERVER  =  512,
+	IPPORT_LOGINSERVER =  513,
+	IPPORT_CMDSERVER   =  514,
+	IPPORT_EFSSERVER   =  520,
+	IPPORT_BIFFUDP     =  512,
+	IPPORT_WHOSERVER   =  513,
+	IPPORT_ROUTESERVER =  520,
+	IPPORT_RESERVED    = 1024
+}
+
+enum {
+	IMPLINK_IP         =  155,
+	IMPLINK_LOWEXPER   =  156,
+	IMPLINK_HIGHEXPER  =  158
+}
+
+struct IN_ADDR {
+	union {
+		struct { u_char  s_b1, s_b2, s_b3, s_b4; }
+		struct { u_char  s_net, s_host, s_lh, s_impno; }
+		struct { u_short s_w1, s_w2; }
+		struct { u_short s_w_, s_imp; } // Can I get rid of s_w_ using alignment tricks?
+		u_long S_addr;
+		u_long s_addr;
+	}
+}
+alias IN_ADDR* PIN_ADDR, LPIN_ADDR;
+
+// IN_CLASSx are not used anywhere or documented on MSDN.
+bool IN_CLASSA(int i) { return (i & 0x80000000) == 0; }
+
+const IN_CLASSA_NET    = 0xff000000;
+const IN_CLASSA_NSHIFT =         24;
+const IN_CLASSA_HOST   = 0x00ffffff;
+const IN_CLASSA_MAX    =        128;
+
+bool IN_CLASSB(int i) { return (i & 0xc0000000) == 0x80000000; }
+
+const IN_CLASSB_NET    = 0xffff0000;
+const IN_CLASSB_NSHIFT =         16;
+const IN_CLASSB_HOST   = 0x0000ffff;
+const IN_CLASSB_MAX    =      65536;
+
+bool IN_CLASSC(int i) { return (i & 0xe0000000) == 0xc0000000; }
+
+const IN_CLASSC_NET    = 0xffffff00;
+const IN_CLASSC_NSHIFT =          8;
+const IN_CLASSC_HOST   = 0x000000ff;
+
+const u_long
+	INADDR_ANY       = 0,
+	INADDR_LOOPBACK  = 0x7F000001,
+	INADDR_BROADCAST = 0xFFFFFFFF,
+	INADDR_NONE      = 0xFFFFFFFF;
+
+struct SOCKADDR_IN {
+	short   sin_family;
+	u_short sin_port;
+	IN_ADDR sin_addr;
+	char[8] sin_zero;
+}
+alias SOCKADDR_IN* PSOCKADDR_IN, LPSOCKADDR_IN;
+
+const size_t
+	WSADESCRIPTION_LEN = 256,
+	WSASYS_STATUS_LEN  = 128;
+
+struct WSADATA {
+	WORD   wVersion;
+	WORD   wHighVersion;
+	char[WSADESCRIPTION_LEN+1] szDescription;
+	char[WSASYS_STATUS_LEN+1]  szSystemStatus;
+	ushort iMaxSockets;
+	ushort iMaxUdpDg;
+	char*  lpVendorInfo;
+}
+alias WSADATA* LPWSADATA;
+
+// This is not documented on the MSDN site
+const IP_OPTIONS = 1;
+
+const int
+	SO_OPTIONS     =   1,
+	SO_DEBUG       =   1,
+	SO_ACCEPTCONN  =   2,
+	SO_REUSEADDR   =   4,
+	SO_KEEPALIVE   =   8,
+	SO_DONTROUTE   =  16,
+	SO_BROADCAST   =  32,
+	SO_USELOOPBACK =  64,
+	SO_LINGER      = 128,
+	SO_OOBINLINE   = 256,
+	SO_DONTLINGER  = ~SO_LINGER,
+	SO_EXCLUSIVEADDRUSE= ~SO_REUSEADDR;
+
+enum : int {
+	SO_SNDBUF = 0x1001,
+	SO_RCVBUF,
+	SO_SNDLOWAT,
+	SO_RCVLOWAT,
+	SO_SNDTIMEO,
+	SO_RCVTIMEO,
+	SO_ERROR,
+	SO_TYPE // = 0x1008
+}
+
+const SOCKET INVALID_SOCKET = cast(SOCKET)(~0);
+const int SOCKET_ERROR = -1;
+
+enum : int {
+	SOCK_STREAM = 1,
+	SOCK_DGRAM,
+	SOCK_RAW,
+	SOCK_RDM,
+	SOCK_SEQPACKET
+}
+
+const int TCP_NODELAY = 0x0001;
+
+enum : int {
+	AF_UNSPEC,
+	AF_UNIX,
+	AF_INET,
+	AF_IMPLINK,
+	AF_PUP,
+	AF_CHAOS,
+	AF_IPX,  // =  6
+	AF_NS       =  6,
+	AF_ISO,
+	AF_OSI      = AF_ISO,
+	AF_ECMA,
+	AF_DATAKIT,
+	AF_CCITT,
+	AF_SNA,
+	AF_DECnet,
+	AF_DLI,
+	AF_LAT,
+	AF_HYLINK,
+	AF_APPLETALK,
+	AF_NETBIOS,
+	AF_VOICEVIEW,
+	AF_FIREFOX,
+	AF_UNKNOWN1,
+	AF_BAN,
+	AF_ATM,
+	AF_INET6,
+	// AF_CLUSTER, AF_12844 nad AF_NETDES are not documented on MSDN
+	AF_CLUSTER,
+	AF_12844,
+	AF_IRDA, // = 26
+	AF_NETDES   = 28,
+	AF_MAX   // = 29
+}
+
+struct SOCKADDR {
+	u_short  sa_family;
+	char[14] sa_data;
+}
+alias SOCKADDR* PSOCKADDR, LPSOCKADDR;
+
+/* Portable IPv6/IPv4 version of sockaddr.
+   Uses padding to force 8 byte alignment
+   and maximum size of 128 bytes */
+struct SOCKADDR_STORAGE {
+    short     ss_family;
+    char[6]   __ss_pad1;   // pad to 8
+    long      __ss_align;  // force alignment
+    char[112] __ss_pad2;   // pad to 128
+}
+alias SOCKADDR_STORAGE* PSOCKADDR_STORAGE;
+
+struct sockproto {
+	u_short sp_family;
+	u_short sp_protocol;
+}
+
+enum : int {
+	PF_UNSPEC    = AF_UNSPEC,
+	PF_UNIX      = AF_UNIX,
+	PF_INET      = AF_INET,
+	PF_IMPLINK   = AF_IMPLINK,
+	PF_PUP       = AF_PUP,
+	PF_CHAOS     = AF_CHAOS,
+	PF_NS        = AF_NS,
+	PF_IPX       = AF_IPX,
+	PF_ISO       = AF_ISO,
+	PF_OSI       = AF_OSI,
+	PF_ECMA      = AF_ECMA,
+	PF_DATAKIT   = AF_DATAKIT,
+	PF_CCITT     = AF_CCITT,
+	PF_SNA       = AF_SNA,
+	PF_DECnet    = AF_DECnet,
+	PF_DLI       = AF_DLI,
+	PF_LAT       = AF_LAT,
+	PF_HYLINK    = AF_HYLINK,
+	PF_APPLETALK = AF_APPLETALK,
+	PF_VOICEVIEW = AF_VOICEVIEW,
+	PF_FIREFOX   = AF_FIREFOX,
+	PF_UNKNOWN1  = AF_UNKNOWN1,
+	PF_BAN       = AF_BAN,
+	PF_ATM       = AF_ATM,
+	PF_INET6     = AF_INET6,
+	PF_MAX       = AF_MAX
+}
+
+const int SOL_SOCKET = 0xFFFF;
+
+const int SOMAXCONN = 5;
+
+const int
+	MSG_OOB       = 1,
+	MSG_PEEK      = 2,
+	MSG_DONTROUTE = 4,
+	MSG_MAXIOVLEN = 16,
+	MSG_PARTIAL   = 0x8000;
+
+const size_t MAXGETHOSTSTRUCT = 1024;
+
+// Not documented on MSDN
+enum {
+	FD_READ_BIT,
+	FD_WRITE_BIT,
+	FD_OOB_BIT,
+	FD_ACCEPT_BIT,
+	FD_CONNECT_BIT,
+	FD_CLOSE_BIT,
+	FD_QOS_BIT,
+	FD_GROUP_QOS_BIT,
+	FD_ROUTING_INTERFACE_CHANGE_BIT,
+	FD_ADDRESS_LIST_CHANGE_BIT,
+	FD_MAX_EVENTS // = 10
+}
+
+const int
+	FD_READ                     = 1 << FD_READ_BIT,
+	FD_WRITE                    = 1 << FD_WRITE_BIT,
+	FD_OOB                      = 1 << FD_OOB_BIT,
+	FD_ACCEPT                   = 1 << FD_ACCEPT_BIT,
+	FD_CONNECT                  = 1 << FD_CONNECT_BIT,
+	FD_CLOSE                    = 1 << FD_CLOSE_BIT,
+	FD_QOS                      = 1 << FD_QOS_BIT,
+	FD_GROUP_QOS                = 1 << FD_GROUP_QOS_BIT,
+	FD_ROUTING_INTERFACE_CHANGE = 1 << FD_ROUTING_INTERFACE_CHANGE_BIT,
+	FD_ADDRESS_LIST_CHANGE      = 1 << FD_ADDRESS_LIST_CHANGE_BIT,
+	FD_ALL_EVENTS               = (1 << FD_MAX_EVENTS) - 1;
+
+enum : int {
+	WSABASEERR         = 10000,
+	WSAEINTR           = WSABASEERR + 4,
+	WSAEBADF           = WSABASEERR + 9,
+	WSAEACCES          = WSABASEERR + 13,
+	WSAEFAULT          = WSABASEERR + 14,
+	WSAEINVAL          = WSABASEERR + 22,
+	WSAEMFILE          = WSABASEERR + 24,
+	WSAEWOULDBLOCK     = WSABASEERR + 35,
+	WSAEINPROGRESS     = WSABASEERR + 36, // deprecated on WinSock2
+	WSAEALREADY        = WSABASEERR + 37,
+	WSAENOTSOCK        = WSABASEERR + 38,
+	WSAEDESTADDRREQ    = WSABASEERR + 39,
+	WSAEMSGSIZE        = WSABASEERR + 40,
+	WSAEPROTOTYPE      = WSABASEERR + 41,
+	WSAENOPROTOOPT     = WSABASEERR + 42,
+	WSAEPROTONOSUPPORT = WSABASEERR + 43,
+	WSAESOCKTNOSUPPORT = WSABASEERR + 44,
+	WSAEOPNOTSUPP      = WSABASEERR + 45,
+	WSAEPFNOSUPPORT    = WSABASEERR + 46,
+	WSAEAFNOSUPPORT    = WSABASEERR + 47,
+	WSAEADDRINUSE      = WSABASEERR + 48,
+	WSAEADDRNOTAVAIL   = WSABASEERR + 49,
+	WSAENETDOWN        = WSABASEERR + 50,
+	WSAENETUNREACH     = WSABASEERR + 51,
+	WSAENETRESET       = WSABASEERR + 52,
+	WSAECONNABORTED    = WSABASEERR + 53,
+	WSAECONNRESET      = WSABASEERR + 54,
+	WSAENOBUFS         = WSABASEERR + 55,
+	WSAEISCONN         = WSABASEERR + 56,
+	WSAENOTCONN        = WSABASEERR + 57,
+	WSAESHUTDOWN       = WSABASEERR + 58,
+	WSAETOOMANYREFS    = WSABASEERR + 59,
+	WSAETIMEDOUT       = WSABASEERR + 60,
+	WSAECONNREFUSED    = WSABASEERR + 61,
+	WSAELOOP           = WSABASEERR + 62,
+	WSAENAMETOOLONG    = WSABASEERR + 63,
+	WSAEHOSTDOWN       = WSABASEERR + 64,
+	WSAEHOSTUNREACH    = WSABASEERR + 65,
+	WSAENOTEMPTY       = WSABASEERR + 66,
+	WSAEPROCLIM        = WSABASEERR + 67,
+	WSAEUSERS          = WSABASEERR + 68,
+	WSAEDQUOT          = WSABASEERR + 69,
+	WSAESTALE          = WSABASEERR + 70,
+	WSAEREMOTE         = WSABASEERR + 71,
+	WSAEDISCON         = WSABASEERR + 101,
+	WSASYSNOTREADY     = WSABASEERR + 91,
+	WSAVERNOTSUPPORTED = WSABASEERR + 92,
+	WSANOTINITIALISED  = WSABASEERR + 93,
+	WSAHOST_NOT_FOUND  = WSABASEERR + 1001,
+	WSATRY_AGAIN       = WSABASEERR + 1002,
+	WSANO_RECOVERY     = WSABASEERR + 1003,
+	WSANO_DATA         = WSABASEERR + 1004,
+	WSANO_ADDRESS      = WSANO_DATA,
+
+	// WinSock2 specific error codes
+	WSAENOMORE             = WSABASEERR + 102,
+	WSAECANCELLED          = WSABASEERR + 103,
+	WSAEINVALIDPROCTABLE   = WSABASEERR + 104,
+	WSAEINVALIDPROVIDER    = WSABASEERR + 105,
+	WSAEPROVIDERFAILEDINIT = WSABASEERR + 106,
+	WSASYSCALLFAILURE      = WSABASEERR + 107,
+	WSASERVICE_NOT_FOUND   = WSABASEERR + 108,
+	WSATYPE_NOT_FOUND      = WSABASEERR + 109,
+	WSA_E_NO_MORE          = WSABASEERR + 110,
+	WSA_E_CANCELLED        = WSABASEERR + 111,
+	WSAEREFUSED            = WSABASEERR + 112,
+
+	// WS QualityofService errors
+	WSA_QOS_RECEIVERS          = WSABASEERR + 1005,
+	WSA_QOS_SENDERS            = WSABASEERR + 1006,
+	WSA_QOS_NO_SENDERS         = WSABASEERR + 1007,
+	WSA_QOS_NO_RECEIVERS       = WSABASEERR + 1008,
+	WSA_QOS_REQUEST_CONFIRMED  = WSABASEERR + 1009,
+	WSA_QOS_ADMISSION_FAILURE  = WSABASEERR + 1010,
+	WSA_QOS_POLICY_FAILURE     = WSABASEERR + 1011,
+	WSA_QOS_BAD_STYLE          = WSABASEERR + 1012,
+	WSA_QOS_BAD_OBJECT         = WSABASEERR + 1013,
+	WSA_QOS_TRAFFIC_CTRL_ERROR = WSABASEERR + 1014,
+	WSA_QOS_GENERIC_ERROR      = WSABASEERR + 1015,
+	WSA_QOS_ESERVICETYPE       = WSABASEERR + 1016,
+	WSA_QOS_EFLOWSPEC          = WSABASEERR + 1017,
+	WSA_QOS_EPROVSPECBUF       = WSABASEERR + 1018,
+	WSA_QOS_EFILTERSTYLE       = WSABASEERR + 1019,
+	WSA_QOS_EFILTERTYPE        = WSABASEERR + 1020,
+	WSA_QOS_EFILTERCOUNT       = WSABASEERR + 1021,
+	WSA_QOS_EOBJLENGTH         = WSABASEERR + 1022,
+	WSA_QOS_EFLOWCOUNT         = WSABASEERR + 1023,
+	WSA_QOS_EUNKOWNPSOBJ       = WSABASEERR + 1024,
+	WSA_QOS_EPOLICYOBJ         = WSABASEERR + 1025,
+	WSA_QOS_EFLOWDESC          = WSABASEERR + 1026,
+	WSA_QOS_EPSFLOWSPEC        = WSABASEERR + 1027,
+	WSA_QOS_EPSFILTERSPEC      = WSABASEERR + 1028,
+	WSA_QOS_ESDMODEOBJ         = WSABASEERR + 1029,
+	WSA_QOS_ESHAPERATEOBJ      = WSABASEERR + 1030,
+	WSA_QOS_RESERVED_PETYPE    = WSABASEERR + 1031
+}
+
+alias WSAGetLastError h_errno;
+
+enum : int {
+	HOST_NOT_FOUND = WSAHOST_NOT_FOUND,
+	TRY_AGAIN      = WSATRY_AGAIN,
+	NO_RECOVERY    = WSANO_RECOVERY,
+	NO_DATA        = WSANO_DATA,
+	NO_ADDRESS     = WSANO_ADDRESS
+}
+
+extern (Windows) {
+	SOCKET accept(SOCKET, SOCKADDR*, int*);
+	int bind(SOCKET, SOCKADDR*, int);
+	int closesocket(SOCKET);
+	int connect(SOCKET, SOCKADDR*, int);
+	int ioctlsocket(SOCKET, int, u_long*);
+	int getpeername(SOCKET, SOCKADDR*, int*);
+	int getsockname(SOCKET, SOCKADDR*, int*);
+	int getsockopt(SOCKET, int, int, void*, int*);
+	uint inet_addr(char*);
+	int listen(SOCKET, int);
+	int recv(SOCKET, ubyte*, int, int);
+	int recvfrom(SOCKET, ubyte*, int, int, SOCKADDR*, int*);
+	int send(SOCKET, ubyte*, int, int);
+	int sendto(SOCKET, ubyte*, int, int, SOCKADDR*, int);
+	int setsockopt(SOCKET, int, int, void*, int);
+	int shutdown(SOCKET, int);
+	SOCKET socket(int, int, int);
+
+	alias typeof(&accept) LPFN_ACCEPT;
+	alias typeof(&bind) LPFN_BIND;
+	alias typeof(&closesocket) LPFN_CLOSESOCKET;
+	alias typeof(&connect) LPFN_CONNECT;
+	alias typeof(&ioctlsocket) LPFN_IOCTLSOCKET;
+	alias typeof(&getpeername) LPFN_GETPEERNAME;
+	alias typeof(&getsockname) LPFN_GETSOCKNAME;
+	alias typeof(&getsockopt) LPFN_GETSOCKOPT;
+	alias typeof(&inet_addr) LPFN_INET_ADDR;
+	alias typeof(&listen) LPFN_LISTEN;
+	alias typeof(&recv) LPFN_RECV;
+	alias typeof(&recvfrom) LPFN_RECVFROM;
+	alias typeof(&send) LPFN_SEND;
+	alias typeof(&sendto) LPFN_SENDTO;
+	alias typeof(&setsockopt) LPFN_SETSOCKOPT;
+	alias typeof(&shutdown) LPFN_SHUTDOWN;
+	alias typeof(&socket) LPFN_SOCKET;
+}
+
+extern(Windows) {
+	char* inet_ntoa(IN_ADDR);
+	HOSTENT* gethostbyaddr(char*, int, int);
+	HOSTENT* gethostbyname(char*);
+	SERVENT* getservbyport(int, char*);
+	SERVENT* getservbyname(char*, char*);
+	PROTOENT* getprotobynumber(int);
+	PROTOENT* getprotobyname(char*);
+
+	/* NOTE: DK: in the original headers, these were declared with
+	   PASCAL linkage.  Since this is at odds with the definition
+	   of the functions themselves, and also since MinGW seems to
+	   treat the two interchangably, I have moved them here. */
+	alias typeof(&inet_ntoa) LPFN_INET_NTOA;
+	alias typeof(&gethostbyaddr) LPFN_GETHOSTBYADDR;
+	alias typeof(&gethostbyname) LPFN_GETHOSTBYNAME;
+	alias typeof(&getservbyport) LPFN_GETSERVBYPORT;
+	alias typeof(&getservbyname) LPFN_GETSERVBYNAME;
+	alias typeof(&getprotobynumber) LPFN_GETPROTOBYNUMBER;
+	alias typeof(&getprotobyname) LPFN_GETPROTOBYNAME;
+}
+
+extern(Windows) {
+	int WSAStartup(WORD, LPWSADATA);
+	int WSACleanup();
+	void WSASetLastError(int);
+	int WSAGetLastError();
+
+	alias typeof(&WSAStartup) LPFN_WSASTARTUP;
+	alias typeof(&WSACleanup) LPFN_WSACLEANUP;
+	alias typeof(&WSASetLastError) LPFN_WSASETLASTERROR;
+	alias typeof(&WSAGetLastError) LPFN_WSAGETLASTERROR;
+}
+
+/*
+ * Pseudo-blocking functions are deprecated in WinSock2
+ * spec. Use threads instead.
+ */
+deprecated extern(Windows) {
+	BOOL WSAIsBlocking();
+	int WSAUnhookBlockingHook();
+	FARPROC WSASetBlockingHook(FARPROC);
+	int WSACancelBlockingCall();
+
+	alias typeof(&WSAIsBlocking) LPFN_WSAISBLOCKING;
+	alias typeof(&WSAUnhookBlockingHook) LPFN_WSAUNHOOKBLOCKINGHOOK;
+	alias typeof(&WSASetBlockingHook) LPFN_WSASETBLOCKINGHOOK;
+	alias typeof(&WSACancelBlockingCall) LPFN_WSACANCELBLOCKINGCALL;
+}
+
+extern(Windows) {
+	HANDLE WSAAsyncGetServByName(HWND, u_int, char*, char*, char*, int);
+	HANDLE WSAAsyncGetServByPort(HWND, u_int, int, char*, char*, int);
+	HANDLE WSAAsyncGetProtoByName(HWND, u_int, char*, char*, int);
+	HANDLE WSAAsyncGetProtoByNumber(HWND, u_int, int, char*, int);
+	HANDLE WSAAsyncGetHostByName(HWND, u_int, char*, char*, int);
+	HANDLE WSAAsyncGetHostByAddr(HWND, u_int, char*, int, int, char*, int);
+	int WSACancelAsyncRequest(HANDLE);
+	int WSAAsyncSelect(SOCKET, HWND, u_int, long);
+
+	alias typeof(&WSAAsyncGetServByName) LPFN_WSAAsyncGetServByName;
+	alias typeof(&WSAAsyncGetServByPort) LPFN_WSAASYNCGETSERVBYPORT;
+	alias typeof(&WSAAsyncGetProtoByName) LPFN_WSAASYNCGETPROTOBYNAME;
+	alias typeof(&WSAAsyncGetProtoByNumber) LPFN_WSAASYNCGETPROTOBYNUMBER;
+	alias typeof(&WSAAsyncGetHostByName) LPFN_WSAASYNCGETHOSTBYNAME;
+	alias typeof(&WSAAsyncGetHostByAddr) LPFN_WSAASYNCGETHOSTBYADDR;
+	alias typeof(&WSACancelAsyncRequest) LPFN_WSACANCELASYNCREQUEST;
+	alias typeof(&WSAAsyncSelect) LPFN_WSAASYNCSELECT;
+}
+
+extern(Windows) {
+	u_long htonl(u_long);
+	u_long ntohl(u_long);
+	u_short htons(u_short);
+	u_short ntohs(u_short);
+	int select(int nfds, fd_set*, fd_set*, fd_set*, TIMEVAL*);
+
+	alias typeof(&htonl) LPFN_HTONL;
+	alias typeof(&ntohl) LPFN_NTOHL;
+	alias typeof(&htons) LPFN_HTONS;
+	alias typeof(&ntohs) LPFN_NTOHS;
+	alias typeof(&select) LPFN_SELECT;
+
+	int gethostname(char*, int);
+	alias typeof(&gethostname) LPFN_GETHOSTNAME;
+}
+
+alias MAKELONG WSAMAKEASYNCREPLY, WSAMAKESELECTREPLY;
+alias LOWORD WSAGETASYNCBUFLEN, WSAGETSELECTEVENT;
+alias HIWORD WSAGETASYNCERROR, WSAGETSELECTERROR;
+
+
+alias INADDR_ANY ADDR_ANY;
+
+bool IN_CLASSD(int i) { return (i & 0xf0000000) == 0xe0000000; }
+
+const IN_CLASSD_NET    = 0xf0000000;
+const IN_CLASSD_NSHIFT =         28;
+const IN_CLASSD_HOST   = 0x0fffffff;
+
+alias IN_CLASSD IN_MULTICAST;
+
+const FROM_PROTOCOL_INFO = -1;
+
+enum : int {
+	SO_GROUP_ID = 0x2001,
+	SO_GROUP_PRIORITY,
+	SO_MAX_MSG_SIZE,
+	SO_PROTOCOL_INFOA,
+	SO_PROTOCOL_INFOW
+}
+// NOTE: These are logically part of the previous enum, but you can't
+// have version statements in an enum body...
+version(Unicode)
+	const int SO_PROTOCOL_INFO = SO_PROTOCOL_INFOW;
+else
+	const int SO_PROTOCOL_INFO = SO_PROTOCOL_INFOA;
+
+const PVD_CONFIG = 0x3001;
+
+const MSG_INTERRUPT = 0x10;
+//const MSG_MAXIOVLEN = 16; // Already declared above
+
+alias HANDLE WSAEVENT;
+alias LPHANDLE LPWSAEVENT;
+alias OVERLAPPED WSAOVERLAPPED;
+alias OVERLAPPED* LPWSAOVERLAPPED;
+
+private import win32.winerror;
+private import win32.winbase;
+
+enum {
+	WSA_IO_PENDING        = ERROR_IO_PENDING,
+	WSA_IO_INCOMPLETE     = ERROR_IO_INCOMPLETE,
+	WSA_INVALID_HANDLE    = ERROR_INVALID_HANDLE,
+	WSA_INVALID_PARAMETER = ERROR_INVALID_PARAMETER,
+	WSA_NOT_ENOUGH_MEMORY = ERROR_NOT_ENOUGH_MEMORY,
+	WSA_OPERATION_ABORTED = ERROR_OPERATION_ABORTED
+}
+
+const WSA_INVALID_EVENT = cast(WSAEVENT)null;
+const WSA_MAXIMUM_WAIT_EVENTS = MAXIMUM_WAIT_OBJECTS;
+const WSA_WAIT_FAILED = cast(DWORD)-1;
+const WSA_WAIT_EVENT_0 = WAIT_OBJECT_0;
+const WSA_WAIT_IO_COMPLETION = WAIT_IO_COMPLETION;
+const WSA_WAIT_TIMEOUT = WAIT_TIMEOUT;
+const WSA_INFINITE = INFINITE;
+
+struct WSABUF {
+	uint  len;
+	char* buf;
+}
+
+alias WSABUF* LPWSABUF;
+
+enum GUARANTEE {
+	BestEffortService,
+	ControlledLoadService,
+	PredictiveService,
+	GuaranteedDelayService,
+	GuaranteedService
+}
+
+/* TODO: FLOWSPEC and related definitions belong in qos.h */
+
+/*
+   Windows Sockets 2 Application Programming Interface,
+   revision 2.2.2 (1997) uses the type uint32 for SERVICETYPE
+   and the elements of _flowspec, but the type uint32 is not defined
+   or used anywhere else in the w32api. For now, just use
+   unsigned int, which is 32 bits on _WIN32 and _WIN64.
+*/
+
+alias uint SERVICETYPE;
+
+struct FLOWSPEC {
+	uint        TokenRate;
+	uint        TokenBucketSize;
+	uint        PeakBandwidth;
+	uint        Latency;
+	uint        DelayVariation;
+	SERVICETYPE ServiceType;
+	uint        MaxSduSize;
+	uint        MinimumPolicedSize;
+}
+
+alias FLOWSPEC* PFLOWSPEC, LPFLOWSPEC;
+
+struct QOS
+{
+	FLOWSPEC SendingFlowspec;
+	FLOWSPEC ReceivingFlowspec;
+	WSABUF   ProviderSpecific;
+}
+
+alias QOS* LPQOS;
+
+enum {
+	CF_ACCEPT,
+	CF_REJECT,
+	CF_DEFER
+}
+
+// REM: Already defined above
+/*enum {
+	SD_RECEIVE,
+	SD_SEND,
+	SD_BOTH
+}*/
+
+alias uint GROUP;
+
+enum {
+	SG_UNCONSTRAINED_GROUP = 0x01,
+	SG_CONSTRAINED_GROUP
+}
+
+struct WSANETWORKEVENTS {
+	int lNetworkEvents;
+	int[FD_MAX_EVENTS] iErrorCode;
+}
+
+alias WSANETWORKEVENTS* LPWSANETWORKEVENTS;
+
+const MAX_PROTOCOL_CHAIN = 7;
+
+const BASE_PROTOCOL    = 1;
+const LAYERED_PROTOCOL = 0;
+
+enum WSAESETSERVICEOP
+{
+	RNRSERVICE_REGISTER = 0,
+	RNRSERVICE_DEREGISTER,
+	RNRSERVICE_DELETE
+}
+
+alias WSAESETSERVICEOP* PWSAESETSERVICEOP, LPWSAESETSERVICEOP;
+
+struct AFPROTOCOLS {
+	INT iAddressFamily;
+	INT iProtocol;
+}
+
+alias AFPROTOCOLS* PAFPROTOCOLS, LPAFPROTOCOLS;
+
+enum WSAECOMPARATOR
+{
+	COMP_EQUAL = 0,
+	COMP_NOTLESS
+}
+
+alias WSAECOMPARATOR* PWSAECOMPARATOR, LPWSAECOMPARATOR;
+
+struct WSAVERSION
+{
+	DWORD          dwVersion;
+	WSAECOMPARATOR ecHow;
+}
+
+alias WSAVERSION* PWSAVERSION, LPWSAVERSION;
+
+// Import for SOCKET_ADDRESS, CSADDR_INFO
+// import win32.nspapi;
+//#ifndef __CSADDR_T_DEFINED /* also in nspapi.h */
+//#define __CSADDR_T_DEFINED
+
+struct SOCKET_ADDRESS {
+	LPSOCKADDR lpSockaddr;
+	INT        iSockaddrLength;
+}
+
+alias SOCKET_ADDRESS* PSOCKET_ADDRESS, LPSOCKET_ADDRESS;
+
+struct CSADDR_INFO {
+	SOCKET_ADDRESS LocalAddr;
+	SOCKET_ADDRESS RemoteAddr;
+	INT            iSocketType;
+	INT            iProtocol;
+}
+
+alias CSADDR_INFO* PCSADDR_INFO, LPCSADDR_INFO;
+
+//#endif
+
+struct SOCKET_ADDRESS_LIST {
+    INT               iAddressCount;
+    SOCKET_ADDRESS[1] _Address;
+    SOCKET_ADDRESS* Address() { return _Address.ptr; }
+}
+
+alias SOCKET_ADDRESS_LIST* LPSOCKET_ADDRESS_LIST;
+
+// TODO: Import wtypes/nspapi?
+//#ifndef __BLOB_T_DEFINED /* also in wtypes.h and nspapi.h */
+//#define __BLOB_T_DEFINED
+struct BLOB {
+	ULONG cbSize;
+	BYTE* pBlobData;
+}
+
+alias BLOB* PBLOB, LPBLOB;
+//#endif
+
+struct WSAQUERYSETA
+{
+	DWORD         dwSize;
+	LPSTR         lpszServiceInstanceName;
+	LPGUID        lpServiceClassId;
+	LPWSAVERSION  lpVersion;
+	LPSTR         lpszComment;
+	DWORD         dwNameSpace;
+	LPGUID        lpNSProviderId;
+	LPSTR         lpszContext;
+	DWORD         dwNumberOfProtocols;
+	LPAFPROTOCOLS lpafpProtocols;
+	LPSTR         lpszQueryString;
+	DWORD         dwNumberOfCsAddrs;
+	LPCSADDR_INFO lpcsaBuffer;
+	DWORD         dwOutputFlags;
+	LPBLOB        lpBlob;
+}
+
+alias WSAQUERYSETA* PWSAQUERYSETA, LPWSAQUERYSETA;
+
+struct WSAQUERYSETW
+{
+	DWORD         dwSize;
+	LPWSTR        lpszServiceInstanceName;
+	LPGUID        lpServiceClassId;
+	LPWSAVERSION  lpVersion;
+	LPWSTR        lpszComment;
+	DWORD         dwNameSpace;
+	LPGUID        lpNSProviderId;
+	LPWSTR        lpszContext;
+	DWORD         dwNumberOfProtocols;
+	LPAFPROTOCOLS lpafpProtocols;
+	LPWSTR        lpszQueryString;
+	DWORD         dwNumberOfCsAddrs;
+	LPCSADDR_INFO lpcsaBuffer;
+	DWORD         dwOutputFlags;
+	LPBLOB        lpBlob;
+}
+
+
+alias WSAQUERYSETW* PWSAQUERYSETW, LPWSAQUERYSETW;
+
+version(Unicode) {
+	alias WSAQUERYSETW WSAQUERYSET;
+	alias PWSAQUERYSETW PWSAQUERYSET;
+	alias LPWSAQUERYSETW LPWSAQUERYSET;
+} else {
+	alias WSAQUERYSETA WSAQUERYSET;
+	alias PWSAQUERYSETA PWSAQUERYSET;
+	alias LPWSAQUERYSETA LPWSAQUERYSET;
+}
+
+const int
+	LUP_DEEP                = 0x0001,
+	LUP_CONTAINERS          = 0x0002,
+	LUP_NOCONTAINERS        = 0x0004,
+	LUP_NEAREST             = 0x0008,
+	LUP_RETURN_NAME         = 0x0010,
+	LUP_RETURN_TYPE         = 0x0020,
+	LUP_RETURN_VERSION      = 0x0040,
+	LUP_RETURN_COMMENT      = 0x0080,
+	LUP_RETURN_ADDR         = 0x0100,
+	LUP_RETURN_BLOB         = 0x0200,
+	LUP_RETURN_ALIASES      = 0x0400,
+	LUP_RETURN_QUERY_STRING = 0x0800,
+	LUP_RETURN_ALL          = 0x0FF0,
+	LUP_RES_SERVICE         = 0x8000,
+	LUP_FLUSHCACHE          = 0x1000,
+	LUP_FLUSHPREVIOUS       = 0x2000;
+
+struct WSANSCLASSINFOA
+{
+	LPSTR  lpszName;
+	DWORD  dwNameSpace;
+	DWORD  dwValueType;
+	DWORD  dwValueSize;
+	LPVOID lpValue;
+}
+
+alias WSANSCLASSINFOA* PWSANSCLASSINFOA, LPWSANSCLASSINFOA;
+
+struct WSANSCLASSINFOW
+{
+	LPWSTR lpszName;
+	DWORD  dwNameSpace;
+	DWORD  dwValueType;
+	DWORD  dwValueSize;
+	LPVOID lpValue;
+}
+
+alias WSANSCLASSINFOW* PWSANSCLASSINFOW, LPWSANSCLASSINFOW;
+
+version(Unicode) {
+	alias WSANSCLASSINFOW WSANSCLASSINFO;
+	alias PWSANSCLASSINFOW PWSANSCLASSINFO;
+	alias LPWSANSCLASSINFOW LPWSANSCLASSINFO;
+} else {
+	alias WSANSCLASSINFOA WSANSCLASSINFO;
+	alias PWSANSCLASSINFOA PWSANSCLASSINFO;
+	alias LPWSANSCLASSINFOA LPWSANSCLASSINFO;
+}
+
+struct WSASERVICECLASSINFOA
+{
+	LPGUID            lpServiceClassId;
+	LPSTR             lpszServiceClassName;
+	DWORD             dwCount;
+	LPWSANSCLASSINFOA lpClassInfos;
+}
+
+alias WSASERVICECLASSINFOA* PWSASERVICECLASSINFOA, LPWSASERVICECLASSINFOA;
+
+struct WSASERVICECLASSINFOW
+{
+	LPGUID            lpServiceClassId;
+	LPWSTR            lpszServiceClassName;
+	DWORD             dwCount;
+	LPWSANSCLASSINFOW lpClassInfos;
+}
+
+alias WSASERVICECLASSINFOW* PWSASERVICECLASSINFOW, LPWSASERVICECLASSINFOW;
+
+version(Unicode) {
+	alias WSASERVICECLASSINFOW WSASERVICECLASSINFO;
+	alias PWSASERVICECLASSINFOW PWSASERVICECLASSINFO;
+	alias LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO;
+} else {
+	alias WSASERVICECLASSINFOA WSASERVICECLASSINFO;
+	alias PWSASERVICECLASSINFOA PWSASERVICECLASSINFO;
+	alias LPWSASERVICECLASSINFOA LPWSASERVICECLASSINFO;
+}
+
+struct WSANAMESPACE_INFOA {
+	GUID  NSProviderId;
+	DWORD dwNameSpace;
+	BOOL  fActive;
+	DWORD dwVersion;
+	LPSTR lpszIdentifier;
+}
+
+alias WSANAMESPACE_INFOA* PWSANAMESPACE_INFOA, LPWSANAMESPACE_INFOA;
+
+struct WSANAMESPACE_INFOW {
+	GUID   NSProviderId;
+	DWORD  dwNameSpace;
+	BOOL   fActive;
+	DWORD  dwVersion;
+	LPWSTR lpszIdentifier;
+}
+
+alias WSANAMESPACE_INFOW* PWSANAMESPACE_INFOW, LPWSANAMESPACE_INFOW;
+
+version(Unicode) {
+	alias WSANAMESPACE_INFOW WSANAMESPACE_INFO;
+	alias PWSANAMESPACE_INFOW PWSANAMESPACE_INFO;
+	alias LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO;
+} else {
+	alias WSANAMESPACE_INFOA WSANAMESPACE_INFO;
+	alias PWSANAMESPACE_INFOA PWSANAMESPACE_INFO;
+	alias LPWSANAMESPACE_INFOA LPWSANAMESPACE_INFO;
+}
+
+struct WSAPROTOCOLCHAIN {
+	int                       ChainLen;
+	DWORD[MAX_PROTOCOL_CHAIN] ChainEntries;
+}
+
+alias WSAPROTOCOLCHAIN* LPWSAPROTOCOLCHAIN;
+
+const WSAPROTOCOL_LEN = 255;
+
+struct WSAPROTOCOL_INFOA {
+	DWORD dwServiceFlags1;
+	DWORD dwServiceFlags2;
+	DWORD dwServiceFlags3;
+	DWORD dwServiceFlags4;
+	DWORD dwProviderFlags;
+	GUID ProviderId;
+	DWORD dwCatalogEntryId;
+	WSAPROTOCOLCHAIN ProtocolChain;
+	int iVersion;
+	int iAddressFamily;
+	int iMaxSockAddr;
+	int iMinSockAddr;
+	int iSocketType;
+	int iProtocol;
+	int iProtocolMaxOffset;
+	int iNetworkByteOrder;
+	int iSecurityScheme;
+	DWORD dwMessageSize;
+	DWORD dwProviderReserved;
+	CHAR[WSAPROTOCOL_LEN+1] szProtocol;
+}
+
+alias WSAPROTOCOL_INFOA* LPWSAPROTOCOL_INFOA;
+
+struct WSAPROTOCOL_INFOW {
+	DWORD dwServiceFlags1;
+	DWORD dwServiceFlags2;
+	DWORD dwServiceFlags3;
+	DWORD dwServiceFlags4;
+	DWORD dwProviderFlags;
+	GUID ProviderId;
+	DWORD dwCatalogEntryId;
+	WSAPROTOCOLCHAIN ProtocolChain;
+	int iVersion;
+	int iAddressFamily;
+	int iMaxSockAddr;
+	int iMinSockAddr;
+	int iSocketType;
+	int iProtocol;
+	int iProtocolMaxOffset;
+	int iNetworkByteOrder;
+	int iSecurityScheme;
+	DWORD dwMessageSize;
+	DWORD dwProviderReserved;
+	WCHAR[WSAPROTOCOL_LEN+1] szProtocol;
+}
+
+alias WSAPROTOCOL_INFOW* LPWSAPROTOCOL_INFOW;
+
+// TODO: Below fptr was defined as "CALLBACK" for linkage; is this right?
+extern(C) {
+	alias int function(LPWSABUF, LPWSABUF, LPQOS, LPQOS, LPWSABUF, LPWSABUF, GROUP *, DWORD) LPCONDITIONPROC;
+}
+
+extern(Windows) {
+	alias void function(DWORD, DWORD, LPWSAOVERLAPPED, DWORD) LPWSAOVERLAPPED_COMPLETION_ROUTINE;
+}
+
+version(Unicode) {
+	alias WSAPROTOCOL_INFOW WSAPROTOCOL_INFO;
+	alias LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO;
+} else {
+	alias WSAPROTOCOL_INFOA WSAPROTOCOL_INFO;
+	alias LPWSAPROTOCOL_INFOA LPWSAPROTOCOL_INFO;
+}
+
+/* Needed for XP & .NET Server function WSANSPIoctl.  */
+enum WSACOMPLETIONTYPE {
+    NSP_NOTIFY_IMMEDIATELY = 0,
+    NSP_NOTIFY_HWND,
+    NSP_NOTIFY_EVENT,
+    NSP_NOTIFY_PORT,
+    NSP_NOTIFY_APC
+}
+
+alias WSACOMPLETIONTYPE* PWSACOMPLETIONTYPE, LPWSACOMPLETIONTYPE;
+
+struct WSACOMPLETION {
+    WSACOMPLETIONTYPE Type;
+    union WSACOMPLETION_PARAMETERS {
+        struct WSACOMPLETION_WINDOWMESSAGE {
+            HWND hWnd;
+            UINT uMsg;
+            WPARAM context;
+        }
+		WSACOMPLETION_WINDOWMESSAGE WindowMessage;
+        struct WSACOMPLETION_EVENT {
+            LPWSAOVERLAPPED lpOverlapped;
+        }
+		WSACOMPLETION_EVENT Event;
+        struct WSACOMPLETION_APC {
+            LPWSAOVERLAPPED lpOverlapped;
+            LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc;
+        }
+		WSACOMPLETION_APC Apc;
+        struct WSACOMPLETION_PORT {
+            LPWSAOVERLAPPED lpOverlapped;
+            HANDLE hPort;
+            ULONG_PTR Key;
+        }
+		WSACOMPLETION_PORT Port;
+    }
+	WSACOMPLETION_PARAMETERS Parameters;
+}
+
+alias WSACOMPLETION* PWSACOMPLETION, LPWSACOMPLETION;
+
+const int
+	PFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001,
+	PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002,
+	PFL_HIDDEN                  = 0x00000004,
+	PFL_MATCHES_PROTOCOL_ZERO   = 0x00000008;
+
+const int
+	XP1_CONNECTIONLESS           = 0x00000001,
+	XP1_GUARANTEED_DELIVERY      = 0x00000002,
+	XP1_GUARANTEED_ORDER         = 0x00000004,
+	XP1_MESSAGE_ORIENTED         = 0x00000008,
+	XP1_PSEUDO_STREAM            = 0x00000010,
+	XP1_GRACEFUL_CLOSE           = 0x00000020,
+	XP1_EXPEDITED_DATA           = 0x00000040,
+	XP1_CONNECT_DATA             = 0x00000080,
+	XP1_DISCONNECT_DATA          = 0x00000100,
+	XP1_SUPPORT_BROADCAST        = 0x00000200,
+	XP1_SUPPORT_MULTIPOINT       = 0x00000400,
+	XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800,
+	XP1_MULTIPOINT_DATA_PLANE    = 0x00001000,
+	XP1_QOS_SUPPORTED            = 0x00002000,
+	XP1_INTERRUPT                = 0x00004000,
+	XP1_UNI_SEND                 = 0x00008000,
+	XP1_UNI_RECV                 = 0x00010000,
+	XP1_IFS_HANDLES              = 0x00020000,
+	XP1_PARTIAL_MESSAGE          = 0x00040000;
+
+enum : int {
+	BIGENDIAN    = 0x0000,
+	LITTLEENDIAN = 0x0001
+}
+
+const SECURITY_PROTOCOL_NONE = 0x0000;
+
+const JL_SENDER_ONLY = 0x01;
+const JL_RECEIVER_ONLY = 0x02;
+const JL_BOTH = 0x04;
+
+const WSA_FLAG_OVERLAPPED = 0x01;
+const WSA_FLAG_MULTIPOINT_C_ROOT = 0x02;
+const WSA_FLAG_MULTIPOINT_C_LEAF = 0x04;
+const WSA_FLAG_MULTIPOINT_D_ROOT = 0x08;
+const WSA_FLAG_MULTIPOINT_D_LEAF = 0x10;
+
+const int IOC_UNIX = 0x00000000;
+const int IOC_WS2 = 0x08000000;
+const int IOC_PROTOCOL = 0x10000000;
+const int IOC_VENDOR = 0x18000000;
+
+template _WSAIO(int x, int y) { const int _WSAIO = IOC_VOID | x | y; }
+template _WSAIOR(int x, int y) { const int _WSAIOR = IOC_OUT | x | y; }
+template _WSAIOW(int x, int y) { const int _WSAIOW = IOC_IN | x | y; }
+template _WSAIORW(int x, int y) { const int _WSAIORW = IOC_INOUT | x | y; }
+
+const int SIO_ASSOCIATE_HANDLE               = _WSAIOW!(IOC_WS2,1);
+const int SIO_ENABLE_CIRCULAR_QUEUEING       = _WSAIO!(IOC_WS2,2);
+const int SIO_FIND_ROUTE                     = _WSAIOR!(IOC_WS2,3);
+const int SIO_FLUSH                          = _WSAIO!(IOC_WS2,4);
+const int SIO_GET_BROADCAST_ADDRESS          = _WSAIOR!(IOC_WS2,5);
+const int SIO_GET_EXTENSION_FUNCTION_POINTER = _WSAIORW!(IOC_WS2,6);
+const int SIO_GET_QOS                        = _WSAIORW!(IOC_WS2,7);
+const int SIO_GET_GROUP_QOS                  = _WSAIORW!(IOC_WS2,8);
+const int SIO_MULTIPOINT_LOOPBACK            = _WSAIOW!(IOC_WS2,9);
+const int SIO_MULTICAST_SCOPE                = _WSAIOW!(IOC_WS2,10);
+const int SIO_SET_QOS                        = _WSAIOW!(IOC_WS2,11);
+const int SIO_SET_GROUP_QOS                  = _WSAIOW!(IOC_WS2,12);
+const int SIO_TRANSLATE_HANDLE               = _WSAIORW!(IOC_WS2,13);
+const int SIO_ROUTING_INTERFACE_QUERY        = _WSAIORW!(IOC_WS2,20);
+const int SIO_ROUTING_INTERFACE_CHANGE       = _WSAIOW!(IOC_WS2,21);
+const int SIO_ADDRESS_LIST_QUERY             = _WSAIOR!(IOC_WS2,22);
+const int SIO_ADDRESS_LIST_CHANGE            = _WSAIO!(IOC_WS2,23);
+const int SIO_QUERY_TARGET_PNP_HANDLE        = _WSAIOR!(IOC_WS2,24);
+const int SIO_NSP_NOTIFY_CHANGE              = _WSAIOW!(IOC_WS2,25);
+
+const int TH_NETDEV = 1;
+const int TH_TAPI   = 2;
+
+
+extern(Windows) {
+	SOCKET WSAAccept(SOCKET, SOCKADDR*, LPINT, LPCONDITIONPROC, DWORD);
+	INT WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD);
+	INT WSAAddressToStringW(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD);
+	BOOL WSACloseEvent(WSAEVENT);
+	int WSAConnect(SOCKET, SOCKADDR*, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS);
+	WSAEVENT WSACreateEvent();
+	int WSADuplicateSocketA(SOCKET, DWORD, LPWSAPROTOCOL_INFOA);
+	int WSADuplicateSocketW(SOCKET, DWORD, LPWSAPROTOCOL_INFOW);
+	INT WSAEnumNameSpaceProvidersA(LPDWORD, LPWSANAMESPACE_INFOA);
+	INT WSAEnumNameSpaceProvidersW(LPDWORD, LPWSANAMESPACE_INFOW);
+	int WSAEnumNetworkEvents(SOCKET, WSAEVENT, LPWSANETWORKEVENTS);
+	int WSAEnumProtocolsA(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD);
+	int WSAEnumProtocolsW(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD);
+	int WSAEventSelect(SOCKET, WSAEVENT, int);
+	BOOL WSAGetOverlappedResult(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD);
+	BOOL WSAGetQOSByName(SOCKET, LPWSABUF, LPQOS);
+	INT WSAGetServiceClassInfoA(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA);
+	INT WSAGetServiceClassInfoW(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW);
+	INT WSAGetServiceClassNameByClassIdA(LPGUID, LPSTR, LPDWORD);
+	INT WSAGetServiceClassNameByClassIdW(LPGUID, LPWSTR, LPDWORD);
+	int WSAHtonl(SOCKET, uint, uint*);
+	int WSAHtons(SOCKET, ushort, ushort*);
+	INT WSAInstallServiceClassA(LPWSASERVICECLASSINFOA);
+	INT WSAInstallServiceClassW(LPWSASERVICECLASSINFOW);
+	int WSAIoctl(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+	SOCKET WSAJoinLeaf(SOCKET, SOCKADDR*, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD);
+	INT WSALookupServiceBeginA(LPWSAQUERYSETA, DWORD, LPHANDLE);
+	INT WSALookupServiceBeginW(LPWSAQUERYSETW lpqsRestrictions, DWORD, LPHANDLE);
+	INT WSALookupServiceNextA(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA);
+	INT WSALookupServiceNextW(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW);
+	INT WSALookupServiceEnd(HANDLE);
+	int WSANSPIoctl(HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION); /* XP or .NET Server */
+	int WSANtohl(SOCKET, uint, uint*);
+	int WSANtohs(SOCKET, ushort, ushort*);
+	int WSARecv(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+	int WSARecvDisconnect(SOCKET, LPWSABUF);
+	int WSARecvFrom(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, SOCKADDR*, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+	INT WSARemoveServiceClass(LPGUID);
+	BOOL WSAResetEvent(WSAEVENT);
+	int WSASend(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+	int WSASendDisconnect(SOCKET, LPWSABUF);
+	int WSASendTo(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, SOCKADDR*, int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+	BOOL WSASetEvent(WSAEVENT);
+	INT WSASetServiceA(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD); // NB: was declared with "WSAAPI" linkage
+	INT WSASetServiceW(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD);
+	SOCKET WSASocketA(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD);
+	SOCKET WSASocketW(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD);
+	INT WSAStringToAddressA(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT);
+	INT WSAStringToAddressW(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT);
+	DWORD WSAWaitForMultipleEvents(DWORD, WSAEVENT*, BOOL, DWORD, BOOL);
+
+	alias typeof(&WSAAccept) LPFN_WSAACCEPT;
+	alias typeof(&WSAAddressToStringA) LPFN_WSAADDRESSTOSTRINGA;
+	alias typeof(&WSAAddressToStringW) LPFN_WSAADDRESSTOSTRINGW;
+	alias typeof(&WSACloseEvent) LPFN_WSACLOSEEVENT;
+	alias typeof(&WSAConnect) LPFN_WSACONNECT;
+	alias typeof(&WSACreateEvent) LPFN_WSACREATEEVENT;
+	alias typeof(&WSADuplicateSocketA) LPFN_WSADUPLICATESOCKETA;
+	alias typeof(&WSADuplicateSocketW) LPFN_WSADUPLICATESOCKETW;
+	alias typeof(&WSAEnumNameSpaceProvidersA) LPFN_WSAENUMNAMESPACEPROVIDERSA;
+	alias typeof(&WSAEnumNameSpaceProvidersW) LPFN_WSAENUMNAMESPACEPROVIDERSW;
+	alias typeof(&WSAEnumNetworkEvents) LPFN_WSAENUMNETWORKEVENTS;
+	alias typeof(&WSAEnumProtocolsA) LPFN_WSAENUMPROTOCOLSA;
+	alias typeof(&WSAEnumProtocolsW) LPFN_WSAENUMPROTOCOLSW;
+	alias typeof(&WSAEventSelect) LPFN_WSAEVENTSELECT;
+	alias typeof(&WSAGetOverlappedResult) LPFN_WSAGETOVERLAPPEDRESULT;
+	alias typeof(&WSAGetQOSByName) LPFN_WSAGETQOSBYNAME;
+	alias typeof(&WSAGetServiceClassInfoA) LPFN_WSAGETSERVICECLASSINFOA;
+	alias typeof(&WSAGetServiceClassInfoW) LPFN_WSAGETSERVICECLASSINFOW;
+	alias typeof(&WSAGetServiceClassNameByClassIdA) LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA;
+	alias typeof(&WSAGetServiceClassNameByClassIdW) LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW;
+	alias typeof(&WSAHtonl) LPFN_WSAHTONL;
+	alias typeof(&WSAHtons) LPFN_WSAHTONS;
+	alias typeof(&WSAInstallServiceClassA) LPFN_WSAINSTALLSERVICECLASSA;
+	alias typeof(&WSAInstallServiceClassW) LPFN_WSAINSTALLSERVICECLASSW;
+	alias typeof(&WSAIoctl) LPFN_WSAIOCTL;
+	alias typeof(&WSAJoinLeaf) LPFN_WSAJOINLEAF;
+	alias typeof(&WSALookupServiceBeginA) LPFN_WSALOOKUPSERVICEBEGINA;
+	alias typeof(&WSALookupServiceBeginW) LPFN_WSALOOKUPSERVICEBEGINW;
+	alias typeof(&WSALookupServiceNextA) LPFN_WSALOOKUPSERVICENEXTA;
+	alias typeof(&WSALookupServiceNextW) LPFN_WSALOOKUPSERVICENEXTW;
+	alias typeof(&WSALookupServiceEnd) LPFN_WSALOOKUPSERVICEEND;
+	alias typeof(&WSANSPIoctl) LPFN_WSANSPIoctl;
+	alias typeof(&WSANtohl) LPFN_WSANTOHL;
+	alias typeof(&WSANtohs) LPFN_WSANTOHS;
+	alias typeof(&WSARecv) LPFN_WSARECV;
+	alias typeof(&WSARecvDisconnect) LPFN_WSARECVDISCONNECT;
+	alias typeof(&WSARecvFrom) LPFN_WSARECVFROM;
+	alias typeof(&WSARemoveServiceClass) LPFN_WSAREMOVESERVICECLASS;
+	alias typeof(&WSAResetEvent) LPFN_WSARESETEVENT;
+	alias typeof(&WSASend) LPFN_WSASEND;
+	alias typeof(&WSASendDisconnect) LPFN_WSASENDDISCONNECT;
+	alias typeof(&WSASendTo) LPFN_WSASENDTO;
+	alias typeof(&WSASetEvent) LPFN_WSASETEVENT;
+	alias typeof(&WSASetServiceA) LPFN_WSASETSERVICEA;
+	alias typeof(&WSASetServiceW) LPFN_WSASETSERVICEW;
+	alias typeof(&WSASocketA) LPFN_WSASOCKETA;
+	alias typeof(&WSASocketW) LPFN_WSASOCKETW;
+	alias typeof(&WSAStringToAddressA) LPFN_WSASTRINGTOADDRESSA;
+	alias typeof(&WSAStringToAddressW) LPFN_WSASTRINGTOADDRESSW;
+	alias typeof(&WSAWaitForMultipleEvents) LPFN_WSAWAITFORMULTIPLEEVENTS;
+}
+
+version(Unicode) {
+	alias LPFN_WSAADDRESSTOSTRINGW LPFN_WSAADDRESSTOSTRING;
+	alias LPFN_WSADUPLICATESOCKETW LPFN_WSADUPLICATESOCKET;
+	alias LPFN_WSAENUMNAMESPACEPROVIDERSW LPFN_WSAENUMNAMESPACEPROVIDERS;
+	alias LPFN_WSAENUMPROTOCOLSW LPFN_WSAENUMPROTOCOLS;
+	alias LPFN_WSAGETSERVICECLASSINFOW LPFN_WSAGETSERVICECLASSINFO;
+	alias LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW LPFN_WSAGETSERVICECLASSNAMEBYCLASSID;
+	alias LPFN_WSAINSTALLSERVICECLASSW LPFN_WSAINSTALLSERVICECLASS;
+	alias LPFN_WSALOOKUPSERVICEBEGINW LPFN_WSALOOKUPSERVICEBEGIN;
+	alias LPFN_WSALOOKUPSERVICENEXTW LPFN_WSALOOKUPSERVICENEXT;
+	alias LPFN_WSASETSERVICEW LPFN_WSASETSERVICE;
+	alias LPFN_WSASOCKETW LPFN_WSASOCKET;
+	alias LPFN_WSASTRINGTOADDRESSW LPFN_WSASTRINGTOADDRESS;
+	alias WSAAddressToStringW WSAAddressToString;
+	alias WSADuplicateSocketW WSADuplicateSocket;
+	alias WSAEnumNameSpaceProvidersW WSAEnumNameSpaceProviders;
+	alias WSAEnumProtocolsW WSAEnumProtocols;
+	alias WSAGetServiceClassInfoW WSAGetServiceClassInfo;
+	alias WSAGetServiceClassNameByClassIdW WSAGetServiceClassNameByClassId;
+	alias WSASetServiceW WSASetService;
+	alias WSASocketW WSASocket;
+	alias WSAStringToAddressW WSAStringToAddress;
+	alias WSALookupServiceBeginW WSALookupServiceBegin;
+	alias WSALookupServiceNextW WSALookupServiceNext;
+	alias WSAInstallServiceClassW WSAInstallServiceClass;
+} else {
+	alias LPFN_WSAADDRESSTOSTRINGA LPFN_WSAADDRESSTOSTRING;
+	alias LPFN_WSADUPLICATESOCKETW LPFN_WSADUPLICATESOCKET;
+	alias LPFN_WSAENUMNAMESPACEPROVIDERSA LPFN_WSAENUMNAMESPACEPROVIDERS;
+	alias LPFN_WSAENUMPROTOCOLSA LPFN_WSAENUMPROTOCOLS;
+	alias LPFN_WSAGETSERVICECLASSINFOA LPFN_WSAGETSERVICECLASSINFO;
+	alias LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA LPFN_WSAGETSERVICECLASSNAMEBYCLASSID;
+	alias LPFN_WSAINSTALLSERVICECLASSA LPFN_WSAINSTALLSERVICECLASS;
+	alias LPFN_WSALOOKUPSERVICEBEGINA LPFN_WSALOOKUPSERVICEBEGIN;
+	alias LPFN_WSALOOKUPSERVICENEXTA LPFN_WSALOOKUPSERVICENEXT;
+	alias LPFN_WSASETSERVICEA LPFN_WSASETSERVICE;
+	alias LPFN_WSASOCKETA LPFN_WSASOCKET;
+	alias LPFN_WSASTRINGTOADDRESSA LPFN_WSASTRINGTOADDRESS;
+	alias WSAAddressToStringA WSAAddressToString;
+	alias WSADuplicateSocketA WSADuplicateSocket;
+	alias WSAEnumNameSpaceProvidersA WSAEnumNameSpaceProviders;
+	alias WSAEnumProtocolsA WSAEnumProtocols;
+	alias WSAGetServiceClassInfoA WSAGetServiceClassInfo;
+	alias WSAGetServiceClassNameByClassIdA WSAGetServiceClassNameByClassId;
+	alias WSAInstallServiceClassA WSAInstallServiceClass;
+	alias WSALookupServiceBeginA WSALookupServiceBegin;
+	alias WSALookupServiceNextA WSALookupServiceNext;
+	alias WSASocketA WSASocket;
+	alias WSAStringToAddressA WSAStringToAddress;
+	alias WSASetServiceA WSASetService;
+}