WinSock2.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:63k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. //-------------------------------------------------------------
  2. //
  3. //       Borland Delphi Runtime Library
  4. //       <API> interface unit
  5. //
  6. // Portions created by Microsoft are
  7. // Copyright (C) 1995-1999 Microsoft Corporation.
  8. // All Rights Reserved.
  9. //
  10. // The original file is: Winsock2.h from CBuilder5 distribution.
  11. // The original Pascal code is: winsock2.pas, released 04 Mar 2000.
  12. // The initial developer of the Pascal code is Alex Konshin
  13. // (alexk@mtgroup.ru).
  14. //
  15. // Portions created by Alex Konshin are
  16. // Copyright (C) 1998-2000 Alex Konshin
  17. //
  18. // Contributor(s): Alex Konshin
  19. //
  20. //       Obtained through:
  21. //
  22. //       Joint Endeavour of Delphi Innovators (Project JEDI)
  23. //
  24. // You may retrieve the latest version of this file at the Project
  25. // JEDI home page, located at http://delphi-jedi.org
  26. //
  27. // The contents of this file are used with permission, subject to
  28. // the Mozilla Public License Version 1.1 (the "License"); you may
  29. // not use this file except in compliance with the License. You may
  30. // obtain a copy of the License at
  31. // http://www.mozilla.org/MPL/MPL-1.1.html
  32. //
  33. // Software distributed under the License is distributed on an
  34. // "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  35. // implied. See the License for the specific language governing
  36. // rights and limitations under the License.
  37. //
  38. //-------------------------------------------------------------
  39. { Winsock2.h -- definitions to be used with the WinSock 2 DLL and WinSock 2 applications.
  40.   This header file corresponds to version 2.2.x of the WinSock API specification.
  41.   This file includes parts which are Copyright (c) 1982-1986 Regents
  42.   of the University of California. All rights reserved.
  43.   The Berkeley Software License Agreement specifies the terms and
  44.   conditions for redistribution. }
  45. // converted by Alex Konshin, mailto:alexk@mtgroup.ru
  46. // modified March,4 2000
  47. unit WinSock2;
  48. interface
  49. uses SysUtils, Windows;
  50. {$ALIGN OFF}
  51. {$RANGECHECKS OFF}
  52. {$WRITEABLECONST OFF}
  53. //  Define the current Winsock version. To build an earlier Winsock version
  54. //  application redefine this value prior to including Winsock2.h
  55. const
  56.   WINSOCK_VERSION = $0202;
  57.   WINSOCK2_DLL = 'ws2_32.dll';
  58. type
  59.   u_char = Byte;
  60.   u_short = Word;
  61.   u_int = DWORD;
  62.   u_long = DWORD;
  63.   // The new type to be used in all instances which refer to sockets.
  64.   TSocket = u_int;
  65.   WSAEVENT = THandle;
  66.   PWSAEVENT = ^WSAEVENT;
  67.   LPWSAEVENT = PWSAEVENT;
  68.   {$IFDEF UNICODE}
  69.   PMBChar = PWideChar;
  70.   {$ELSE}
  71.   PMBChar = PChar;
  72.   {$ENDIF}
  73. const
  74.   FD_SETSIZE = 64;
  75. type
  76.   PFDSet = ^TFDSet;
  77.   TFDSet = packed record
  78.     fd_count: u_int;
  79.     fd_array: array[0..FD_SETSIZE - 1] of TSocket;
  80.   end;
  81.   PTimeVal = ^TTimeVal;
  82.   TTimeVal = packed record
  83.     tv_sec: Longint;
  84.     tv_usec: Longint;
  85.   end;
  86. const
  87.   IOCPARM_MASK = $7F;
  88.   IOC_VOID = $20000000;
  89.   IOC_OUT = $40000000;
  90.   IOC_IN = $80000000;
  91.   IOC_INOUT = (IOC_IN or IOC_OUT);
  92.   // get # bytes to read
  93.   FIONREAD = IOC_OUT or (SizeOf(Longint) shl 16) or (Ord('f') shl 8) or 127;
  94.   // set/clear non-blocking i/o
  95.   FIONBIO = IOC_IN or (SizeOf(Longint) shl 16) or (Ord('f') shl 8) or 126;
  96.   // set/clear async i/o
  97.   FIOASYNC = IOC_IN or (SizeOf(Longint) shl 16) or (Ord('f') shl 8) or 125;
  98.   //  Socket I/O Controls
  99.   // set high watermark
  100.   SIOCSHIWAT = IOC_IN or (SizeOf(Longint) shl 16) or (Ord('s') shl 8);
  101.   // get high watermark
  102.   SIOCGHIWAT = IOC_OUT or (SizeOf(Longint) shl 16) or (Ord('s') shl 8) or 1;
  103.   // set low watermark
  104.   SIOCSLOWAT = IOC_IN or (SizeOf(Longint) shl 16) or (Ord('s') shl 8) or 2;
  105.   // get low watermark
  106.   SIOCGLOWAT = IOC_OUT or (SizeOf(Longint) shl 16) or (Ord('s') shl 8) or 3;
  107.   // at oob mark?
  108.   SIOCATMARK = IOC_OUT or (SizeOf(Longint) shl 16) or (Ord('s') shl 8) or 7;
  109.   //  Structures returned by network data base library, taken from the
  110.   //  BSD file netdb.h.  All addresses are supplied in host order, and
  111.   //  returned in network order (suitable for use in system calls).
  112. type
  113.   PHostEnt = ^THostEnt;
  114.   THostEnt = packed record
  115.     h_name: PChar; // official name of host
  116.     h_aliases: ^PChar; // alias list
  117.     h_addrtype: Smallint; // host address type
  118.     h_length: Smallint; // length of address
  119.     case Byte of
  120.       0: (h_addr_list: ^PChar); // list of addresses
  121.       1: (h_addr: ^PChar); // address, for backward compat
  122.   end;
  123.   //  It is assumed here that a network number
  124.   //  fits in 32 bits.
  125.   PNetEnt = ^TNetEnt;
  126.   TNetEnt = packed record
  127.     n_name: PChar; // official name of net
  128.     n_aliases: ^PChar; // alias list
  129.     n_addrtype: Smallint; // net address type
  130.     n_net: u_long; // network #
  131.   end;
  132.   PServEnt = ^TServEnt;
  133.   TServEnt = packed record
  134.     s_name: PChar; // official service name
  135.     s_aliases: ^PChar; // alias list
  136.     s_port: Smallint; // protocol to use
  137.     s_proto: PChar; // port #
  138.   end;
  139.   PProtoEnt = ^TProtoEnt;
  140.   TProtoEnt = packed record
  141.     p_name: PChar; // official protocol name
  142.     p_aliases: ^Pchar; // alias list
  143.     p_proto: Smallint; // protocol #
  144.   end;
  145.   // Constants and structures defined by the internet system,
  146.   // Per RFC 790, September 1981, taken from the BSD file netinet/in.h.
  147. const
  148.   // Protocols
  149.   IPPROTO_IP = 0; // dummy for IP
  150.   IPPROTO_ICMP = 1; // control message protocol
  151.   IPPROTO_IGMP = 2; // group management protocol
  152.   IPPROTO_GGP = 3; // gateway^2 (deprecated)
  153.   IPPROTO_TCP = 6; // TCP
  154.   IPPROTO_PUP = 12; // pup
  155.   IPPROTO_UDP = 17; // UDP - user datagram protocol
  156.   IPPROTO_IDP = 22; // xns idp
  157.   IPPROTO_ND = 77; // UNOFFICIAL net disk proto
  158.   IPPROTO_RAW = 255; // raw IP packet
  159.   IPPROTO_MAX = 256;
  160.   // Port/socket numbers: network standard functions
  161.   IPPORT_ECHO = 7;
  162.   IPPORT_DISCARD = 9;
  163.   IPPORT_SYSTAT = 11;
  164.   IPPORT_DAYTIME = 13;
  165.   IPPORT_NETSTAT = 15;
  166.   IPPORT_FTP = 21;
  167.   IPPORT_TELNET = 23;
  168.   IPPORT_SMTP = 25;
  169.   IPPORT_TIMESERVER = 37;
  170.   IPPORT_NAMESERVER = 42;
  171.   IPPORT_WHOIS = 43;
  172.   IPPORT_MTP = 57;
  173.   // Port/socket numbers: host specific functions
  174.   IPPORT_TFTP = 69;
  175.   IPPORT_RJE = 77;
  176.   IPPORT_FINGER = 79;
  177.   IPPORT_TTYLINK = 87;
  178.   IPPORT_SUPDUP = 95;
  179.   // UNIX TCP sockets
  180.   IPPORT_EXECSERVER = 512;
  181.   IPPORT_LOGINSERVER = 513;
  182.   IPPORT_CMDSERVER = 514;
  183.   IPPORT_EFSSERVER = 520;
  184.   // UNIX UDP sockets
  185.   IPPORT_BIFFUDP = 512;
  186.   IPPORT_WHOSERVER = 513;
  187.   IPPORT_ROUTESERVER = 520;
  188.   // Ports < IPPORT_RESERVED are reserved for  privileged processes (e.g. root).
  189.   IPPORT_RESERVED = 1024;
  190.   // Link numbers
  191.   IMPLINK_IP = 155;
  192.   IMPLINK_LOWEXPER = 156;
  193.   IMPLINK_HIGHEXPER = 158;
  194.   TF_DISCONNECT = $01;
  195.   TF_REUSE_SOCKET = $02;
  196.   TF_WRITE_BEHIND = $04;
  197.   // This is used instead of -1, since the TSocket type is unsigned.
  198.   INVALID_SOCKET = TSocket(not (0));
  199.   SOCKET_ERROR = -1;
  200.   //  The  following  may  be used in place of the address family, socket type, or
  201.   //  protocol  in  a  call  to WSASocket to indicate that the corresponding value
  202.   //  should  be taken from the supplied WSAPROTOCOL_INFO structure instead of the
  203.   //  parameter itself.
  204.   FROM_PROTOCOL_INFO = -1;
  205.   // Types
  206.   SOCK_STREAM = 1; { stream socket }
  207.   SOCK_DGRAM = 2; { datagram socket }
  208.   SOCK_RAW = 3; { raw-protocol interface }
  209.   SOCK_RDM = 4; { reliably-delivered message }
  210.   SOCK_SEQPACKET = 5; { sequenced packet stream }
  211.   // Option flags per-socket.
  212.   SO_DEBUG = $0001; // turn on debugging info recording
  213.   SO_ACCEPTCONN = $0002; // socket has had listen()
  214.   SO_REUSEADDR = $0004; // allow local address reuse
  215.   SO_KEEPALIVE = $0008; // keep connections alive
  216.   SO_DONTROUTE = $0010; // just use interface addresses
  217.   SO_BROADCAST = $0020; // permit sending of broadcast msgs
  218.   SO_USELOOPBACK = $0040; // bypass hardware when possible
  219.   SO_LINGER = $0080; // linger on close if data present
  220.   SO_OOBINLINE = $0100; // leave received OOB data in line
  221.   SO_DONTLINGER = not SO_LINGER;
  222.   SO_EXCLUSIVEADDRUSE = not SO_REUSEADDR; // disallow local address reuse
  223.   // Additional options.
  224.   SO_SNDBUF = $1001; // send buffer size
  225.   SO_RCVBUF = $1002; // receive buffer size
  226.   SO_SNDLOWAT = $1003; // send low-water mark
  227.   SO_RCVLOWAT = $1004; // receive low-water mark
  228.   SO_SNDTIMEO = $1005; // send timeout
  229.   SO_RCVTIMEO = $1006; // receive timeout
  230.   SO_ERROR = $1007; // get error status and clear
  231.   SO_TYPE = $1008; // get socket type
  232.   // Options for connect and disconnect data and options.
  233.   // Used only by non-TCP/IP transports such as DECNet, OSI TP4, etc.
  234.   SO_CONNDATA = $7000;
  235.   SO_CONNOPT = $7001;
  236.   SO_DISCDATA = $7002;
  237.   SO_DISCOPT = $7003;
  238.   SO_CONNDATALEN = $7004;
  239.   SO_CONNOPTLEN = $7005;
  240.   SO_DISCDATALEN = $7006;
  241.   SO_DISCOPTLEN = $7007;
  242.   // Option for opening sockets for synchronous access.
  243.   SO_OPENTYPE = $7008;
  244.   SO_SYNCHRONOUS_ALERT = $10;
  245.   SO_SYNCHRONOUS_NONALERT = $20;
  246.   // Other NT-specific options.
  247.   SO_MAXDG = $7009;
  248.   SO_MAXPATHDG = $700A;
  249.   SO_UPDATE_ACCEPT_CONTEXT = $700B;
  250.   SO_CONNECT_TIME = $700C;
  251.   // TCP options.
  252.   TCP_NODELAY = $0001;
  253.   TCP_BSDURGENT = $7000;
  254.   // WinSock 2 extension -- new options
  255.   SO_GROUP_ID = $2001; // ID of a socket group
  256.   SO_GROUP_PRIORITY = $2002; // the relative priority within a group
  257.   SO_MAX_MSG_SIZE = $2003; // maximum message size
  258.   SO_Protocol_InfoA = $2004; // WSAPROTOCOL_INFOA structure
  259.   SO_Protocol_InfoW = $2005; // WSAPROTOCOL_INFOW structure
  260.   {$IFDEF UNICODE}
  261.   SO_Protocol_Info = SO_Protocol_InfoW;
  262.   {$ELSE}
  263.   SO_Protocol_Info = SO_Protocol_InfoA;
  264.   {$ENDIF}
  265.   PVD_CONFIG = $3001; // configuration info for service provider
  266.   SO_CONDITIONAL_ACCEPT = $3002; // enable true conditional accept:
  267.   // connection is not ack-ed to the
  268.   // other side until conditional
  269.   // function returns CF_ACCEPT
  270. // Address families.
  271.   AF_UNSPEC = 0; // unspecified
  272.   AF_UNIX = 1; // local to host (pipes, portals)
  273.   AF_INET = 2; // internetwork: UDP, TCP, etc.
  274.   AF_IMPLINK = 3; // arpanet imp addresses
  275.   AF_PUP = 4; // pup protocols: e.g. BSP
  276.   AF_CHAOS = 5; // mit CHAOS protocols
  277.   AF_IPX = 6; // IPX and SPX
  278.   AF_NS = AF_IPX; // XEROX NS protocols
  279.   AF_ISO = 7; // ISO protocols
  280.   AF_OSI = AF_ISO; // OSI is ISO
  281.   AF_ECMA = 8; // european computer manufacturers
  282.   AF_DATAKIT = 9; // datakit protocols
  283.   AF_CCITT = 10; // CCITT protocols, X.25 etc
  284.   AF_SNA = 11; // IBM SNA
  285.   AF_DECnet = 12; // DECnet
  286.   AF_DLI = 13; // Direct data link interface
  287.   AF_LAT = 14; // LAT
  288.   AF_HYLINK = 15; // NSC Hyperchannel
  289.   AF_APPLETALK = 16; // AppleTalk
  290.   AF_NETBIOS = 17; // NetBios-style addresses
  291.   AF_VOICEVIEW = 18; // VoiceView
  292.   AF_FIREFOX = 19; // FireFox
  293.   AF_UNKNOWN1 = 20; // Somebody is using this!
  294.   AF_BAN = 21; // Banyan
  295.   AF_ATM = 22; // Native ATM Services
  296.   AF_INET6 = 23; // Internetwork Version 6
  297.   AF_CLUSTER = 24; // Microsoft Wolfpack
  298.   AF_12844 = 25; // IEEE 1284.4 WG AF
  299.   AF_IRDA = 26; // IrDA
  300.   AF_NETDES = 28; // Network Designers OSI & gateway enabled protocols
  301.   AF_MAX = 29;
  302.   // Protocol families, same as address families for now.
  303.   PF_UNSPEC = AF_UNSPEC;
  304.   PF_UNIX = AF_UNIX;
  305.   PF_INET = AF_INET;
  306.   PF_IMPLINK = AF_IMPLINK;
  307.   PF_PUP = AF_PUP;
  308.   PF_CHAOS = AF_CHAOS;
  309.   PF_NS = AF_NS;
  310.   PF_IPX = AF_IPX;
  311.   PF_ISO = AF_ISO;
  312.   PF_OSI = AF_OSI;
  313.   PF_ECMA = AF_ECMA;
  314.   PF_DATAKIT = AF_DATAKIT;
  315.   PF_CCITT = AF_CCITT;
  316.   PF_SNA = AF_SNA;
  317.   PF_DECnet = AF_DECnet;
  318.   PF_DLI = AF_DLI;
  319.   PF_LAT = AF_LAT;
  320.   PF_HYLINK = AF_HYLINK;
  321.   PF_APPLETALK = AF_APPLETALK;
  322.   PF_VOICEVIEW = AF_VOICEVIEW;
  323.   PF_FIREFOX = AF_FIREFOX;
  324.   PF_UNKNOWN1 = AF_UNKNOWN1;
  325.   PF_BAN = AF_BAN;
  326.   PF_ATM = AF_ATM;
  327.   PF_INET6 = AF_INET6;
  328.   PF_MAX = AF_MAX;
  329. type
  330.   SunB = packed record
  331.     s_b1, s_b2, s_b3, s_b4: u_char;
  332.   end;
  333.   SunW = packed record
  334.     s_w1, s_w2: u_short;
  335.   end;
  336.   TInAddr = packed record
  337.     case integer of
  338.       0: (S_un_b: SunB);
  339.       1: (S_un_w: SunW);
  340.       2: (S_addr: u_long);
  341.   end;
  342.   PInAddr = ^TInAddr;
  343.   // Structure used by kernel to store most addresses.
  344.   TSockAddrIn = packed record
  345.     case Integer of
  346.       0: (sin_family: u_short;
  347.         sin_port: u_short;
  348.         sin_addr: TInAddr;
  349.         sin_zero: array[0..7] of Char);
  350.       1: (sa_family: u_short;
  351.         sa_data: array[0..13] of Char)
  352.   end;
  353.   PSockAddrIn = ^TSockAddrIn;
  354.   TSockAddr = TSockAddrIn;
  355.   PSockAddr = ^TSockAddr;
  356.   SOCKADDR = TSockAddr;
  357.   SOCKADDR_IN = TSockAddrIn;
  358.   // Structure used by kernel to pass protocol information in raw sockets.
  359.   PSockProto = ^TSockProto;
  360.   TSockProto = packed record
  361.     sp_family: u_short;
  362.     sp_protocol: u_short;
  363.   end;
  364.   // Structure used for manipulating linger option.
  365.   PLinger = ^TLinger;
  366.   TLinger = packed record
  367.     l_onoff: u_short;
  368.     l_linger: u_short;
  369.   end;
  370. const
  371.   INADDR_ANY = $00000000;
  372.   INADDR_LOOPBACK = $7F000001;
  373.   INADDR_BROADCAST = $FFFFFFFF;
  374.   INADDR_NONE = $FFFFFFFF;
  375.   ADDR_ANY = INADDR_ANY;
  376.   SOL_SOCKET = $FFFF; // options for socket level
  377.   MSG_OOB = $1; // process out-of-band data
  378.   MSG_PEEK = $2; // peek at incoming message
  379.   MSG_DONTROUTE = $4; // send without using routing tables
  380.   MSG_PARTIAL = $8000; // partial send or recv for message xport
  381.   // WinSock 2 extension -- new flags for WSASend(), WSASendTo(), WSARecv() and WSARecvFrom()
  382.   MSG_INTERRUPT = $10; // send/recv in the interrupt context
  383.   MSG_MAXIOVLEN = 16;
  384.   // Define constant based on rfc883, used by gethostbyxxxx() calls.
  385.   MAXGETHOSTSTRUCT = 1024;
  386.   // Maximum queue length specifiable by listen.
  387.   SOMAXCONN = $7FFFFFFF;
  388.   // WinSock 2 extension -- bit values and indices for FD_XXX network events
  389.   FD_READ_BIT = 0;
  390.   FD_WRITE_BIT = 1;
  391.   FD_OOB_BIT = 2;
  392.   FD_ACCEPT_BIT = 3;
  393.   FD_CONNECT_BIT = 4;
  394.   FD_CLOSE_BIT = 5;
  395.   FD_QOS_BIT = 6;
  396.   FD_GROUP_QOS_BIT = 7;
  397.   FD_MAX_EVENTS = 8;
  398.   FD_READ = (1 shl FD_READ_BIT);
  399.   FD_WRITE = (1 shl FD_WRITE_BIT);
  400.   FD_OOB = (1 shl FD_OOB_BIT);
  401.   FD_ACCEPT = (1 shl FD_ACCEPT_BIT);
  402.   FD_CONNECT = (1 shl FD_CONNECT_BIT);
  403.   FD_CLOSE = (1 shl FD_CLOSE_BIT);
  404.   FD_QOS = (1 shl FD_QOS_BIT);
  405.   FD_GROUP_QOS = (1 shl FD_GROUP_QOS_BIT);
  406.   FD_ALL_EVENTS = (1 shl FD_MAX_EVENTS) - 1;
  407.   // All Windows Sockets error constants are biased by WSABASEERR from the "normal"
  408.   WSABASEERR = 10000;
  409.   // Windows Sockets definitions of regular Microsoft C error constants
  410.   WSAEINTR = WSABASEERR + 4;
  411.   WSAEBADF = WSABASEERR + 9;
  412.   WSAEACCES = WSABASEERR + 13;
  413.   WSAEFAULT = WSABASEERR + 14;
  414.   WSAEINVAL = WSABASEERR + 22;
  415.   WSAEMFILE = WSABASEERR + 24;
  416.   // Windows Sockets definitions of regular Berkeley error constants
  417.   WSAEWOULDBLOCK = WSABASEERR + 35;
  418.   WSAEINPROGRESS = WSABASEERR + 36;
  419.   WSAEALREADY = WSABASEERR + 37;
  420.   WSAENOTSOCK = WSABASEERR + 38;
  421.   WSAEDESTADDRREQ = WSABASEERR + 39;
  422.   WSAEMSGSIZE = WSABASEERR + 40;
  423.   WSAEPROTOTYPE = WSABASEERR + 41;
  424.   WSAENOPROTOOPT = WSABASEERR + 42;
  425.   WSAEPROTONOSUPPORT = WSABASEERR + 43;
  426.   WSAESOCKTNOSUPPORT = WSABASEERR + 44;
  427.   WSAEOPNOTSUPP = WSABASEERR + 45;
  428.   WSAEPFNOSUPPORT = WSABASEERR + 46;
  429.   WSAEAFNOSUPPORT = WSABASEERR + 47;
  430.   WSAEADDRINUSE = WSABASEERR + 48;
  431.   WSAEADDRNOTAVAIL = WSABASEERR + 49;
  432.   WSAENETDOWN = WSABASEERR + 50;
  433.   WSAENETUNREACH = WSABASEERR + 51;
  434.   WSAENETRESET = WSABASEERR + 52;
  435.   WSAECONNABORTED = WSABASEERR + 53;
  436.   WSAECONNRESET = WSABASEERR + 54;
  437.   WSAENOBUFS = WSABASEERR + 55;
  438.   WSAEISCONN = WSABASEERR + 56;
  439.   WSAENOTCONN = WSABASEERR + 57;
  440.   WSAESHUTDOWN = WSABASEERR + 58;
  441.   WSAETOOMANYREFS = WSABASEERR + 59;
  442.   WSAETIMEDOUT = WSABASEERR + 60;
  443.   WSAECONNREFUSED = WSABASEERR + 61;
  444.   WSAELOOP = WSABASEERR + 62;
  445.   WSAENAMETOOLONG = WSABASEERR + 63;
  446.   WSAEHOSTDOWN = WSABASEERR + 64;
  447.   WSAEHOSTUNREACH = WSABASEERR + 65;
  448.   WSAENOTEMPTY = WSABASEERR + 66;
  449.   WSAEPROCLIM = WSABASEERR + 67;
  450.   WSAEUSERS = WSABASEERR + 68;
  451.   WSAEDQUOT = WSABASEERR + 69;
  452.   WSAESTALE = WSABASEERR + 70;
  453.   WSAEREMOTE = WSABASEERR + 71;
  454.   // Extended Windows Sockets error constant definitions
  455.   WSASYSNOTREADY = WSABASEERR + 91;
  456.   WSAVERNOTSUPPORTED = WSABASEERR + 92;
  457.   WSANOTINITIALISED = WSABASEERR + 93;
  458.   WSAEDISCON = WSABASEERR + 101;
  459.   WSAENOMORE = WSABASEERR + 102;
  460.   WSAECANCELLED = WSABASEERR + 103;
  461.   WSAEINVALIDPROCTABLE = WSABASEERR + 104;
  462.   WSAEINVALIDPROVIDER = WSABASEERR + 105;
  463.   WSAEPROVIDERFAILEDINIT = WSABASEERR + 106;
  464.   WSASYSCALLFAILURE = WSABASEERR + 107;
  465.   WSASERVICE_NOT_FOUND = WSABASEERR + 108;
  466.   WSATYPE_NOT_FOUND = WSABASEERR + 109;
  467.   WSA_E_NO_MORE = WSABASEERR + 110;
  468.   WSA_E_CANCELLED = WSABASEERR + 111;
  469.   WSAEREFUSED = WSABASEERR + 112;
  470.   { Error return codes from gethostbyname() and gethostbyaddr()
  471.     (when using the resolver). Note that these errors are
  472.     retrieved via WSAGetLastError() and must therefore follow
  473.     the rules for avoiding clashes with error numbers from
  474.     specific implementations or language run-time systems.
  475.     For this reason the codes are based at WSABASEERR+1001.
  476.     Note also that [WSA]NO_ADDRESS is defined only for
  477.     compatibility purposes. }
  478.   // Authoritative Answer: Host not found
  479.   WSAHOST_NOT_FOUND = WSABASEERR + 1001;
  480.   HOST_NOT_FOUND = WSAHOST_NOT_FOUND;
  481.   // Non-Authoritative: Host not found, or SERVERFAIL
  482.   WSATRY_AGAIN = WSABASEERR + 1002;
  483.   TRY_AGAIN = WSATRY_AGAIN;
  484.   // Non recoverable errors, FORMERR, REFUSED, NOTIMP
  485.   WSANO_RECOVERY = WSABASEERR + 1003;
  486.   NO_RECOVERY = WSANO_RECOVERY;
  487.   // Valid name, no data record of requested type
  488.   WSANO_DATA = WSABASEERR + 1004;
  489.   NO_DATA = WSANO_DATA;
  490.   // no address, look for MX record
  491.   WSANO_ADDRESS = WSANO_DATA;
  492.   NO_ADDRESS = WSANO_ADDRESS;
  493.   // Define QOS related error return codes
  494.   WSA_QOS_RECEIVERS = WSABASEERR + 1005; // at least one Reserve has arrived
  495.   WSA_QOS_SENDERS = WSABASEERR + 1006; // at least one Path has arrived
  496.   WSA_QOS_NO_SENDERS = WSABASEERR + 1007; // there are no senders
  497.   WSA_QOS_NO_RECEIVERS = WSABASEERR + 1008; // there are no receivers
  498.   WSA_QOS_REQUEST_CONFIRMED = WSABASEERR + 1009; // Reserve has been confirmed
  499.   WSA_QOS_ADMISSION_FAILURE = WSABASEERR + 1010;
  500.     // error due to lack of resources
  501.   WSA_QOS_POLICY_FAILURE = WSABASEERR + 1011;
  502.     // rejected for administrative reasons - bad credentials
  503.   WSA_QOS_BAD_STYLE = WSABASEERR + 1012; // unknown or conflicting style
  504.   WSA_QOS_BAD_OBJECT = WSABASEERR + 1013;
  505.     // problem with some part of the filterspec or providerspecific buffer in general
  506.   WSA_QOS_TRAFFIC_CTRL_ERROR = WSABASEERR + 1014;
  507.     // problem with some part of the flowspec
  508.   WSA_QOS_GENERIC_ERROR = WSABASEERR + 1015; // general error
  509.   WSA_QOS_ESERVICETYPE = WSABASEERR + 1016; // invalid service type in flowspec
  510.   WSA_QOS_EFLOWSPEC = WSABASEERR + 1017; // invalid flowspec
  511.   WSA_QOS_EPROVSPECBUF = WSABASEERR + 1018; // invalid provider specific buffer
  512.   WSA_QOS_EFILTERSTYLE = WSABASEERR + 1019; // invalid filter style
  513.   WSA_QOS_EFILTERTYPE = WSABASEERR + 1020; // invalid filter type
  514.   WSA_QOS_EFILTERCOUNT = WSABASEERR + 1021; // incorrect number of filters
  515.   WSA_QOS_EOBJLENGTH = WSABASEERR + 1022; // invalid object length
  516.   WSA_QOS_EFLOWCOUNT = WSABASEERR + 1023; // incorrect number of flows
  517.   WSA_QOS_EUNKOWNPSOBJ = WSABASEERR + 1024;
  518.     // unknown object in provider specific buffer
  519.   WSA_QOS_EPOLICYOBJ = WSABASEERR + 1025;
  520.     // invalid policy object in provider specific buffer
  521.   WSA_QOS_EFLOWDESC = WSABASEERR + 1026; // invalid flow descriptor in the list
  522.   WSA_QOS_EPSFLOWSPEC = WSABASEERR + 1027;
  523.     // inconsistent flow spec in provider specific buffer
  524.   WSA_QOS_EPSFILTERSPEC = WSABASEERR + 1028;
  525.     // invalid filter spec in provider specific buffer
  526.   WSA_QOS_ESDMODEOBJ = WSABASEERR + 1029;
  527.     // invalid shape discard mode object in provider specific buffer
  528.   WSA_QOS_ESHAPERATEOBJ = WSABASEERR + 1030;
  529.     // invalid shaping rate object in provider specific buffer
  530.   WSA_QOS_RESERVED_PETYPE = WSABASEERR + 1031;
  531.     // reserved policy element in provider specific buffer
  532.   { WinSock 2 extension -- new error codes and type definition }
  533.   WSA_IO_PENDING = ERROR_IO_PENDING;
  534.   WSA_IO_INCOMPLETE = ERROR_IO_INCOMPLETE;
  535.   WSA_INVALID_HANDLE = ERROR_INVALID_HANDLE;
  536.   WSA_INVALID_PARAMETER = ERROR_INVALID_PARAMETER;
  537.   WSA_NOT_ENOUGH_MEMORY = ERROR_NOT_ENOUGH_MEMORY;
  538.   WSA_OPERATION_ABORTED = ERROR_OPERATION_ABORTED;
  539.   WSA_INVALID_EVENT = WSAEVENT(nil);
  540.   WSA_MAXIMUM_WAIT_EVENTS = MAXIMUM_WAIT_OBJECTS;
  541.   WSA_WAIT_FAILED = $FFFFFFFF;
  542.   WSA_WAIT_EVENT_0 = WAIT_OBJECT_0;
  543.   WSA_WAIT_IO_COMPLETION = WAIT_IO_COMPLETION;
  544.   WSA_WAIT_TIMEOUT = WAIT_TIMEOUT;
  545.   WSA_INFINITE = INFINITE;
  546.   { Windows Sockets errors redefined as regular Berkeley error constants.
  547.     These are commented out in Windows NT to avoid conflicts with errno.h.
  548.     Use the WSA constants instead. }
  549.   EWOULDBLOCK = WSAEWOULDBLOCK;
  550.   EINPROGRESS = WSAEINPROGRESS;
  551.   EALREADY = WSAEALREADY;
  552.   ENOTSOCK = WSAENOTSOCK;
  553.   EDESTADDRREQ = WSAEDESTADDRREQ;
  554.   EMSGSIZE = WSAEMSGSIZE;
  555.   EPROTOTYPE = WSAEPROTOTYPE;
  556.   ENOPROTOOPT = WSAENOPROTOOPT;
  557.   EPROTONOSUPPORT = WSAEPROTONOSUPPORT;
  558.   ESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT;
  559.   EOPNOTSUPP = WSAEOPNOTSUPP;
  560.   EPFNOSUPPORT = WSAEPFNOSUPPORT;
  561.   EAFNOSUPPORT = WSAEAFNOSUPPORT;
  562.   EADDRINUSE = WSAEADDRINUSE;
  563.   EADDRNOTAVAIL = WSAEADDRNOTAVAIL;
  564.   ENETDOWN = WSAENETDOWN;
  565.   ENETUNREACH = WSAENETUNREACH;
  566.   ENETRESET = WSAENETRESET;
  567.   ECONNABORTED = WSAECONNABORTED;
  568.   ECONNRESET = WSAECONNRESET;
  569.   ENOBUFS = WSAENOBUFS;
  570.   EISCONN = WSAEISCONN;
  571.   ENOTCONN = WSAENOTCONN;
  572.   ESHUTDOWN = WSAESHUTDOWN;
  573.   ETOOMANYREFS = WSAETOOMANYREFS;
  574.   ETIMEDOUT = WSAETIMEDOUT;
  575.   ECONNREFUSED = WSAECONNREFUSED;
  576.   ELOOP = WSAELOOP;
  577.   ENAMETOOLONG = WSAENAMETOOLONG;
  578.   EHOSTDOWN = WSAEHOSTDOWN;
  579.   EHOSTUNREACH = WSAEHOSTUNREACH;
  580.   ENOTEMPTY = WSAENOTEMPTY;
  581.   EPROCLIM = WSAEPROCLIM;
  582.   EUSERS = WSAEUSERS;
  583.   EDQUOT = WSAEDQUOT;
  584.   ESTALE = WSAESTALE;
  585.   EREMOTE = WSAEREMOTE;
  586.   WSADESCRIPTION_LEN = 256;
  587.   WSASYS_STATUS_LEN = 128;
  588. type
  589.   PWSAData = ^TWSAData;
  590.   TWSAData = packed record
  591.     wVersion: Word;
  592.     wHighVersion: Word;
  593.     szDescription: array[0..WSADESCRIPTION_LEN] of Char;
  594.     szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char;
  595.     iMaxSockets: Word;
  596.     iMaxUdpDg: Word;
  597.     lpVendorInfo: PChar;
  598.   end;
  599.   { WSAOVERLAPPED = Record
  600.       Internal: LongInt;
  601.       InternalHigh: LongInt;
  602.       Offset: LongInt;
  603.       OffsetHigh: LongInt;
  604.       hEvent: WSAEVENT;
  605.     end;}
  606.   WSAOVERLAPPED = TOverlapped;
  607.   TWSAOverlapped = WSAOverlapped;
  608.   PWSAOverlapped = ^WSAOverlapped;
  609.   LPWSAOVERLAPPED = PWSAOverlapped;
  610.   { WinSock 2 extension -- WSABUF and QOS struct, include qos.h }
  611.   { to pull in FLOWSPEC and related definitions }
  612.   WSABUF = packed record
  613.     len: U_LONG; { the length of the buffer }
  614.     buf: PChar; { the pointer to the buffer }
  615.   end {WSABUF};
  616.   PWSABUF = ^WSABUF;
  617.   LPWSABUF = PWSABUF;
  618.   TServiceType = LongInt;
  619.   TFlowSpec = packed record
  620.     TokenRate, // In Bytes/sec
  621.     TokenBucketSize, // In Bytes
  622.     PeakBandwidth, // In Bytes/sec
  623.     Latency, // In microseconds
  624.     DelayVariation: LongInt; // In microseconds
  625.     ServiceType: TServiceType;
  626.     MaxSduSize, MinimumPolicedSize: LongInt; // In Bytes
  627.   end;
  628.   PFlowSpec = ^TFLOWSPEC;
  629.   QOS = packed record
  630.     SendingFlowspec: TFlowSpec; { the flow spec for data sending }
  631.     ReceivingFlowspec: TFlowSpec; { the flow spec for data receiving }
  632.     ProviderSpecific: WSABUF; { additional provider specific stuff }
  633.   end;
  634.   TQualityOfService = QOS;
  635.   PQOS = ^QOS;
  636.   LPQOS = PQOS;
  637. const
  638.   SERVICETYPE_NOTRAFFIC = $00000000; // No data in this direction
  639.   SERVICETYPE_BESTEFFORT = $00000001; // Best Effort
  640.   SERVICETYPE_CONTROLLEDLOAD = $00000002; // Controlled Load
  641.   SERVICETYPE_GUARANTEED = $00000003; // Guaranteed
  642.   SERVICETYPE_NETWORK_UNAVAILABLE = $00000004; // Used to notify change to user
  643.   SERVICETYPE_GENERAL_INFORMATION = $00000005;
  644.     // corresponds to "General Parameters" defined by IntServ
  645.   SERVICETYPE_NOCHANGE = $00000006;
  646.     // used to indicate that the flow spec contains no change from any previous one
  647.   // to turn on immediate traffic control, OR this flag with the ServiceType field in teh FLOWSPEC
  648.   SERVICE_IMMEDIATE_TRAFFIC_CONTROL = $80000000;
  649.   //  WinSock 2 extension -- manifest constants for return values of the condition function
  650.   CF_ACCEPT = $0000;
  651.   CF_REJECT = $0001;
  652.   CF_DEFER = $0002;
  653.   //  WinSock 2 extension -- manifest constants for shutdown()
  654.   SD_RECEIVE = $00;
  655.   SD_SEND = $01;
  656.   SD_BOTH = $02;
  657.   //  WinSock 2 extension -- data type and manifest constants for socket groups
  658.   SG_UNCONSTRAINED_GROUP = $01;
  659.   SG_CONSTRAINED_GROUP = $02;
  660. type
  661.   GROUP = DWORD;
  662.   //  WinSock 2 extension -- data type for WSAEnumNetworkEvents()
  663.   TWSANetworkEvents = record
  664.     lNetworkEvents: LongInt;
  665.     iErrorCode: array[0..FD_MAX_EVENTS - 1] of Integer;
  666.   end;
  667.   PWSANetworkEvents = ^TWSANetworkEvents;
  668.   LPWSANetworkEvents = PWSANetworkEvents;
  669.   //  WinSock 2 extension -- WSAPROTOCOL_INFO structure
  670.   {$IFNDEF ver130}
  671.   TGUID = packed record
  672.     D1: LongInt;
  673.     D2: Word;
  674.     D3: Word;
  675.     D4: array[0..7] of Byte;
  676.   end;
  677.   PGUID = ^TGUID;
  678.   {$ENDIF}
  679.   LPGUID = PGUID;
  680.   //  WinSock 2 extension -- WSAPROTOCOL_INFO manifest constants
  681. const
  682.   MAX_PROTOCOL_CHAIN = 7;
  683.   BASE_PROTOCOL = 1;
  684.   LAYERED_PROTOCOL = 0;
  685.   WSAPROTOCOL_LEN = 255;
  686. type
  687.   TWSAProtocolChain = record
  688.     ChainLen: Integer; // the length of the chain,
  689.     // length = 0 means layered protocol,
  690.     // length = 1 means base protocol,
  691.     // length > 1 means protocol chain
  692.     ChainEntries: array[0..MAX_PROTOCOL_CHAIN - 1] of LongInt;
  693.       // a list of dwCatalogEntryIds
  694.   end;
  695. type
  696.   TWSAProtocol_InfoA = record
  697.     dwServiceFlags1: LongInt;
  698.     dwServiceFlags2: LongInt;
  699.     dwServiceFlags3: LongInt;
  700.     dwServiceFlags4: LongInt;
  701.     dwProviderFlags: LongInt;
  702.     ProviderId: TGUID;
  703.     dwCatalogEntryId: LongInt;
  704.     ProtocolChain: TWSAProtocolChain;
  705.     iVersion: Integer;
  706.     iAddressFamily: Integer;
  707.     iMaxSockAddr: Integer;
  708.     iMinSockAddr: Integer;
  709.     iSocketType: Integer;
  710.     iProtocol: Integer;
  711.     iProtocolMaxOffset: Integer;
  712.     iNetworkByteOrder: Integer;
  713.     iSecurityScheme: Integer;
  714.     dwMessageSize: LongInt;
  715.     dwProviderReserved: LongInt;
  716.     szProtocol: array[0..WSAPROTOCOL_LEN + 1 - 1] of Char;
  717.   end {TWSAProtocol_InfoA};
  718.   PWSAProtocol_InfoA = ^TWSAProtocol_InfoA;
  719.   LPWSAProtocol_InfoA = PWSAProtocol_InfoA;
  720.   TWSAProtocol_InfoW = record
  721.     dwServiceFlags1: LongInt;
  722.     dwServiceFlags2: LongInt;
  723.     dwServiceFlags3: LongInt;
  724.     dwServiceFlags4: LongInt;
  725.     dwProviderFlags: LongInt;
  726.     ProviderId: TGUID;
  727.     dwCatalogEntryId: LongInt;
  728.     ProtocolChain: TWSAProtocolChain;
  729.     iVersion: Integer;
  730.     iAddressFamily: Integer;
  731.     iMaxSockAddr: Integer;
  732.     iMinSockAddr: Integer;
  733.     iSocketType: Integer;
  734.     iProtocol: Integer;
  735.     iProtocolMaxOffset: Integer;
  736.     iNetworkByteOrder: Integer;
  737.     iSecurityScheme: Integer;
  738.     dwMessageSize: LongInt;
  739.     dwProviderReserved: LongInt;
  740.     szProtocol: array[0..WSAPROTOCOL_LEN + 1 - 1] of WideChar;
  741.   end {TWSAProtocol_InfoW};
  742.   PWSAProtocol_InfoW = ^TWSAProtocol_InfoW;
  743.   LPWSAProtocol_InfoW = PWSAProtocol_InfoW;
  744.   {$IFDEF UNICODE}
  745.   WSAProtocol_Info = TWSAProtocol_InfoW;
  746.   TWSAProtocol_Info = TWSAProtocol_InfoW;
  747.   PWSAProtocol_Info = PWSAProtocol_InfoW;
  748.   LPWSAProtocol_Info = PWSAProtocol_InfoW;
  749.   {$ELSE}
  750.   WSAProtocol_Info = TWSAProtocol_InfoA;
  751.   TWSAProtocol_Info = TWSAProtocol_InfoA;
  752.   PWSAProtocol_Info = PWSAProtocol_InfoA;
  753.   LPWSAProtocol_Info = PWSAProtocol_InfoA;
  754.   {$ENDIF}
  755. const
  756.   //  Flag bit definitions for dwProviderFlags
  757.   PFL_MULTIPLE_PROTO_ENTRIES = $00000001;
  758.   PFL_RECOMMENDED_PROTO_ENTRY = $00000002;
  759.   PFL_HIDDEN = $00000004;
  760.   PFL_MATCHES_PROTOCOL_ZERO = $00000008;
  761.   //  Flag bit definitions for dwServiceFlags1
  762.   XP1_CONNECTIONLESS = $00000001;
  763.   XP1_GUARANTEED_DELIVERY = $00000002;
  764.   XP1_GUARANTEED_ORDER = $00000004;
  765.   XP1_MESSAGE_ORIENTED = $00000008;
  766.   XP1_PSEUDO_STREAM = $00000010;
  767.   XP1_GRACEFUL_CLOSE = $00000020;
  768.   XP1_EXPEDITED_DATA = $00000040;
  769.   XP1_CONNECT_DATA = $00000080;
  770.   XP1_DISCONNECT_DATA = $00000100;
  771.   XP1_SUPPORT_BROADCAST = $00000200;
  772.   XP1_SUPPORT_MULTIPOINT = $00000400;
  773.   XP1_MULTIPOINT_CONTROL_PLANE = $00000800;
  774.   XP1_MULTIPOINT_DATA_PLANE = $00001000;
  775.   XP1_QOS_SUPPORTED = $00002000;
  776.   XP1_INTERRUPT = $00004000;
  777.   XP1_UNI_SEND = $00008000;
  778.   XP1_UNI_RECV = $00010000;
  779.   XP1_IFS_HANDLES = $00020000;
  780.   XP1_PARTIAL_MESSAGE = $00040000;
  781.   BIGENDIAN = $0000;
  782.   LITTLEENDIAN = $0001;
  783.   SECURITY_PROTOCOL_NONE = $0000;
  784.   //  WinSock 2 extension -- manifest constants for WSAJoinLeaf()
  785.   JL_SENDER_ONLY = $01;
  786.   JL_RECEIVER_ONLY = $02;
  787.   JL_BOTH = $04;
  788.   //  WinSock 2 extension -- manifest constants for WSASocket()
  789.   WSA_FLAG_OVERLAPPED = $01;
  790.   WSA_FLAG_MULTIPOINT_C_ROOT = $02;
  791.   WSA_FLAG_MULTIPOINT_C_LEAF = $04;
  792.   WSA_FLAG_MULTIPOINT_D_ROOT = $08;
  793.   WSA_FLAG_MULTIPOINT_D_LEAF = $10;
  794.   //  WinSock 2 extension -- manifest constants for WSAIoctl()
  795.   IOC_UNIX = $00000000;
  796.   IOC_WS2 = $08000000;
  797.   IOC_PROTOCOL = $10000000;
  798.   IOC_VENDOR = $18000000;
  799.   SIO_ASSOCIATE_HANDLE = 1 or IOC_WS2 or IOC_IN;
  800.   SIO_ENABLE_CIRCULAR_QUEUEING = 2 or IOC_WS2;
  801.   SIO_FIND_ROUTE = 3 or IOC_WS2 or IOC_OUT;
  802.   SIO_FLUSH = 4 or IOC_WS2;
  803.   SIO_GET_BROADCAST_ADDRESS = 5 or IOC_WS2 or IOC_OUT;
  804.   SIO_GET_EXTENSION_FUNCTION_POINTER = 6 or IOC_WS2 or IOC_INOUT;
  805.   SIO_GET_QOS = 7 or IOC_WS2 or IOC_INOUT;
  806.   SIO_GET_GROUP_QOS = 8 or IOC_WS2 or IOC_INOUT;
  807.   SIO_MULTIPOINT_LOOPBACK = 9 or IOC_WS2 or IOC_IN;
  808.   SIO_MULTICAST_SCOPE = 10 or IOC_WS2 or IOC_IN;
  809.   SIO_SET_QOS = 11 or IOC_WS2 or IOC_IN;
  810.   SIO_SET_GROUP_QOS = 12 or IOC_WS2 or IOC_IN;
  811.   SIO_TRANSLATE_HANDLE = 13 or IOC_WS2 or IOC_INOUT;
  812.   SIO_ROUTING_INTERFACE_QUERY = 20 or IOC_WS2 or IOC_INOUT;
  813.   SIO_ROUTING_INTERFACE_CHANGE = 21 or IOC_WS2 or IOC_IN;
  814.   SIO_ADDRESS_LIST_QUERY = 22 or IOC_WS2 or IOC_OUT;
  815.     // see below SOCKET_ADDRESS_LIST
  816.   SIO_ADDRESS_LIST_CHANGE = 23 or IOC_WS2;
  817.   SIO_QUERY_TARGET_PNP_HANDLE = 24 or IOC_WS2 or IOC_OUT;
  818.   //  WinSock 2 extension -- manifest constants for SIO_TRANSLATE_HANDLE ioctl
  819.   TH_NETDEV = $00000001;
  820.   TH_TAPI = $00000002;
  821. type
  822.   //  Manifest constants and type definitions related to name resolution and
  823.   //  registration (RNR) API
  824.   TBLOB = packed record
  825.     cbSize: U_LONG;
  826.     pBlobData: PBYTE;
  827.   end;
  828.   PBLOB = ^TBLOB;
  829.   //  Service Install Flags
  830. const
  831.   SERVICE_MULTIPLE = $00000001;
  832.   // & Name Spaces
  833.   NS_ALL = 0;
  834.   NS_SAP = 1;
  835.   NS_NDS = 2;
  836.   NS_PEER_BROWSE = 3;
  837.   NS_TCPIP_LOCAL = 10;
  838.   NS_TCPIP_HOSTS = 11;
  839.   NS_DNS = 12;
  840.   NS_NETBT = 13;
  841.   NS_WINS = 14;
  842.   NS_NBP = 20;
  843.   NS_MS = 30;
  844.   NS_STDA = 31;
  845.   NS_NTDS = 32;
  846.   NS_X500 = 40;
  847.   NS_NIS = 41;
  848.   NS_NISPLUS = 42;
  849.   NS_WRQ = 50;
  850.   NS_NETDES = 60;
  851.   { Resolution flags for WSAGetAddressByName().
  852.     Note these are also used by the 1.1 API GetAddressByName, so leave them around. }
  853.   RES_UNUSED_1 = $00000001;
  854.   RES_FLUSH_CACHE = $00000002;
  855.   RES_SERVICE = $00000004;
  856.   { Well known value names for Service Types }
  857.   SERVICE_TYPE_VALUE_IPXPORTA = 'IpxSocket';
  858.   SERVICE_TYPE_VALUE_IPXPORTW: PWideChar = 'IpxSocket';
  859.   SERVICE_TYPE_VALUE_SAPIDA = 'SapId';
  860.   SERVICE_TYPE_VALUE_SAPIDW: PWideChar = 'SapId';
  861.   SERVICE_TYPE_VALUE_TCPPORTA = 'TcpPort';
  862.   SERVICE_TYPE_VALUE_TCPPORTW: PWideChar = 'TcpPort';
  863.   SERVICE_TYPE_VALUE_UDPPORTA = 'UdpPort';
  864.   SERVICE_TYPE_VALUE_UDPPORTW: PWideChar = 'UdpPort';
  865.   SERVICE_TYPE_VALUE_OBJECTIDA = 'ObjectId';
  866.   SERVICE_TYPE_VALUE_OBJECTIDW: PWideChar = 'ObjectId';
  867.   {$IFDEF UNICODE}
  868.   SERVICE_TYPE_VALUE_SAPID = SERVICE_TYPE_VALUE_SAPIDW;
  869.   SERVICE_TYPE_VALUE_TCPPORT = SERVICE_TYPE_VALUE_TCPPORTW;
  870.   SERVICE_TYPE_VALUE_UDPPORT = SERVICE_TYPE_VALUE_UDPPORTW;
  871.   SERVICE_TYPE_VALUE_OBJECTID = SERVICE_TYPE_VALUE_OBJECTIDW;
  872.   {$ELSE}
  873.   SERVICE_TYPE_VALUE_SAPID = SERVICE_TYPE_VALUE_SAPIDA;
  874.   SERVICE_TYPE_VALUE_TCPPORT = SERVICE_TYPE_VALUE_TCPPORTA;
  875.   SERVICE_TYPE_VALUE_UDPPORT = SERVICE_TYPE_VALUE_UDPPORTA;
  876.   SERVICE_TYPE_VALUE_OBJECTID = SERVICE_TYPE_VALUE_OBJECTIDA;
  877.   {$ENDIF}
  878.   // SockAddr Information
  879. type
  880.   SOCKET_ADDRESS = packed record
  881.     lpSockaddr: PSockAddr;
  882.     iSockaddrLength: Integer;
  883.   end;
  884.   PSOCKET_ADDRESS = ^SOCKET_ADDRESS;
  885.   // CSAddr Information
  886.   CSADDR_INFO = packed record
  887.     LocalAddr, RemoteAddr: SOCKET_ADDRESS;
  888.     iSocketType, iProtocol: LongInt;
  889.   end;
  890.   PCSADDR_INFO = ^CSADDR_INFO;
  891.   LPCSADDR_INFO = ^CSADDR_INFO;
  892.   // Address list returned via WSAIoctl( SIO_ADDRESS_LIST_QUERY )
  893.   SOCKET_ADDRESS_LIST = packed record
  894.     iAddressCount: Integer;
  895.     Address: array[0..0] of SOCKET_ADDRESS;
  896.   end;
  897.   LPSOCKET_ADDRESS_LIST = ^SOCKET_ADDRESS_LIST;
  898.   // Address Family/Protocol Tuples
  899.   AFProtocols = record
  900.     iAddressFamily: Integer;
  901.     iProtocol: Integer;
  902.   end;
  903.   TAFProtocols = AFProtocols;
  904.   PAFProtocols = ^TAFProtocols;
  905.   //  Client Query API Typedefs
  906.   // The comparators
  907.   TWSAEComparator = (COMP_EQUAL {= 0}, COMP_NOTLESS);
  908.   TWSAVersion = record
  909.     dwVersion: DWORD;
  910.     ecHow: TWSAEComparator;
  911.   end;
  912.   PWSAVersion = ^TWSAVersion;
  913.   TWSAQuerySetA = packed record
  914.     dwSize: DWORD;
  915.     lpszServiceInstanceName: PChar;
  916.     lpServiceClassId: PGUID;
  917.     lpVersion: PWSAVERSION;
  918.     lpszComment: PChar;
  919.     dwNameSpace: DWORD;
  920.     lpNSProviderId: PGUID;
  921.     lpszContext: PChar;
  922.     dwNumberOfProtocols: DWORD;
  923.     lpafpProtocols: PAFProtocols;
  924.     lpszQueryString: PChar;
  925.     dwNumberOfCsAddrs: DWORD;
  926.     lpcsaBuffer: PCSADDR_INFO;
  927.     dwOutputFlags: DWORD;
  928.     lpBlob: PBLOB;
  929.   end;
  930.   PWSAQuerySetA = ^TWSAQuerySetA;
  931.   LPWSAQuerySetA = PWSAQuerySetA;
  932.   TWSAQuerySetW = packed record
  933.     dwSize: DWORD;
  934.     lpszServiceInstanceName: PWideChar;
  935.     lpServiceClassId: PGUID;
  936.     lpVersion: PWSAVERSION;
  937.     lpszComment: PWideChar;
  938.     dwNameSpace: DWORD;
  939.     lpNSProviderId: PGUID;
  940.     lpszContext: PWideChar;
  941.     dwNumberOfProtocols: DWORD;
  942.     lpafpProtocols: PAFProtocols;
  943.     lpszQueryString: PWideChar;
  944.     dwNumberOfCsAddrs: DWORD;
  945.     lpcsaBuffer: PCSADDR_INFO;
  946.     dwOutputFlags: DWORD;
  947.     lpBlob: PBLOB;
  948.   end;
  949.   PWSAQuerySetW = ^TWSAQuerySetW;
  950.   LPWSAQuerySetW = PWSAQuerySetW;
  951.   {$IFDEF UNICODE}
  952.   TWSAQuerySet = TWSAQuerySetA;
  953.   PWSAQuerySet = PWSAQuerySetW;
  954.   LPWSAQuerySet = PWSAQuerySetW;
  955.   {$ELSE}
  956.   TWSAQuerySet = TWSAQuerySetA;
  957.   PWSAQuerySet = PWSAQuerySetA;
  958.   LPWSAQuerySet = PWSAQuerySetA;
  959.   {$ENDIF}
  960. const
  961.   LUP_DEEP = $0001;
  962.   LUP_CONTAINERS = $0002;
  963.   LUP_NOCONTAINERS = $0004;
  964.   LUP_NEAREST = $0008;
  965.   LUP_RETURN_NAME = $0010;
  966.   LUP_RETURN_TYPE = $0020;
  967.   LUP_RETURN_VERSION = $0040;
  968.   LUP_RETURN_COMMENT = $0080;
  969.   LUP_RETURN_ADDR = $0100;
  970.   LUP_RETURN_BLOB = $0200;
  971.   LUP_RETURN_ALIASES = $0400;
  972.   LUP_RETURN_QUERY_STRING = $0800;
  973.   LUP_RETURN_ALL = $0FF0;
  974.   LUP_RES_SERVICE = $8000;
  975.   LUP_FLUSHCACHE = $1000;
  976.   LUP_FLUSHPREVIOUS = $2000;
  977.   // Return flags
  978.   RESULT_IS_ALIAS = $0001;
  979. type
  980.   // Service Address Registration and Deregistration Data Types.
  981.   TWSAeSetServiceOp = (RNRSERVICE_REGISTER {=0}, RNRSERVICE_DEREGISTER,
  982.     RNRSERVICE_DELETE);
  983.   { Service Installation/Removal Data Types. }
  984.   TWSANSClassInfoA = packed record
  985.     lpszName: PChar;
  986.     dwNameSpace: DWORD;
  987.     dwValueType: DWORD;
  988.     dwValueSize: DWORD;
  989.     lpValue: Pointer;
  990.   end;
  991.   PWSANSClassInfoA = ^TWSANSClassInfoA;
  992.   TWSANSClassInfoW = packed record
  993.     lpszName: PWideChar;
  994.     dwNameSpace: DWORD;
  995.     dwValueType: DWORD;
  996.     dwValueSize: DWORD;
  997.     lpValue: Pointer;
  998.   end {TWSANSClassInfoW};
  999.   PWSANSClassInfoW = ^TWSANSClassInfoW;
  1000.   {$IFDEF UNICODE}
  1001.   WSANSClassInfo = TWSANSClassInfoW;
  1002.   TWSANSClassInfo = TWSANSClassInfoW;
  1003.   PWSANSClassInfo = PWSANSClassInfoW;
  1004.   LPWSANSClassInfo = PWSANSClassInfoW;
  1005.   {$ELSE}
  1006.   WSANSClassInfo = TWSANSClassInfoA;
  1007.   TWSANSClassInfo = TWSANSClassInfoA;
  1008.   PWSANSClassInfo = PWSANSClassInfoA;
  1009.   LPWSANSClassInfo = PWSANSClassInfoA;
  1010.   {$ENDIF // UNICODE}
  1011.   TWSAServiceClassInfoA = packed record
  1012.     lpServiceClassId: PGUID;
  1013.     lpszServiceClassName: PChar;
  1014.     dwCount: DWORD;
  1015.     lpClassInfos: PWSANSClassInfoA;
  1016.   end;
  1017.   PWSAServiceClassInfoA = ^TWSAServiceClassInfoA;
  1018.   LPWSAServiceClassInfoA = PWSAServiceClassInfoA;
  1019.   TWSAServiceClassInfoW = packed record
  1020.     lpServiceClassId: PGUID;
  1021.     lpszServiceClassName: PWideChar;
  1022.     dwCount: DWORD;
  1023.     lpClassInfos: PWSANSClassInfoW;
  1024.   end;
  1025.   PWSAServiceClassInfoW = ^TWSAServiceClassInfoW;
  1026.   LPWSAServiceClassInfoW = PWSAServiceClassInfoW;
  1027.   {$IFDEF UNICODE}
  1028.   WSAServiceClassInfo = TWSAServiceClassInfoW;
  1029.   TWSAServiceClassInfo = TWSAServiceClassInfoW;
  1030.   PWSAServiceClassInfo = PWSAServiceClassInfoW;
  1031.   LPWSAServiceClassInfo = PWSAServiceClassInfoW;
  1032.   {$ELSE}
  1033.   WSAServiceClassInfo = TWSAServiceClassInfoA;
  1034.   TWSAServiceClassInfo = TWSAServiceClassInfoA;
  1035.   PWSAServiceClassInfo = PWSAServiceClassInfoA;
  1036.   LPWSAServiceClassInfo = PWSAServiceClassInfoA;
  1037.   {$ENDIF}
  1038.   TWSANameSpace_InfoA = packed record
  1039.     NSProviderId: TGUID;
  1040.     dwNameSpace: DWORD;
  1041.     fActive: DWORD {Bool};
  1042.     dwVersion: DWORD;
  1043.     lpszIdentifier: PChar;
  1044.   end;
  1045.   PWSANameSpace_InfoA = ^TWSANameSpace_InfoA;
  1046.   LPWSANameSpace_InfoA = PWSANameSpace_InfoA;
  1047.   TWSANameSpace_InfoW = packed record
  1048.     NSProviderId: TGUID;
  1049.     dwNameSpace: DWORD;
  1050.     fActive: DWORD {Bool};
  1051.     dwVersion: DWORD;
  1052.     lpszIdentifier: PWideChar;
  1053.   end {TWSANameSpace_InfoW};
  1054.   PWSANameSpace_InfoW = ^TWSANameSpace_InfoW;
  1055.   LPWSANameSpace_InfoW = PWSANameSpace_InfoW;
  1056.   {$IFDEF UNICODE}
  1057.   WSANameSpace_Info = TWSANameSpace_InfoW;
  1058.   TWSANameSpace_Info = TWSANameSpace_InfoW;
  1059.   PWSANameSpace_Info = PWSANameSpace_InfoW;
  1060.   LPWSANameSpace_Info = PWSANameSpace_InfoW;
  1061.   {$ELSE}
  1062.   WSANameSpace_Info = TWSANameSpace_InfoA;
  1063.   TWSANameSpace_Info = TWSANameSpace_InfoA;
  1064.   PWSANameSpace_Info = PWSANameSpace_InfoA;
  1065.   LPWSANameSpace_Info = PWSANameSpace_InfoA;
  1066.   {$ENDIF}
  1067.   { WinSock 2 extensions -- data types for the condition function in }
  1068.   { WSAAccept() and overlapped I/O completion routine. }
  1069. type
  1070.   LPCONDITIONPROC = function(lpCallerId: LPWSABUF; lpCallerData: LPWSABUF;
  1071.     lpSQOS, lpGQOS: LPQOS; lpCalleeId, lpCalleeData: LPWSABUF;
  1072.     g: GROUP; dwCallbackData: DWORD): Integer; stdcall;
  1073.   LPWSAOVERLAPPED_COMPLETION_ROUTINE = procedure(const dwError, cbTransferred:
  1074.     DWORD; const lpOverlapped: LPWSAOVERLAPPED; const dwFlags: DWORD); stdcall;
  1075. function accept(const s: TSocket; var addr: TSockAddr; var addrlen: Integer):
  1076.   TSocket; stdcall;
  1077. function bind(const s: TSocket; const addr: PSockAddr; const namelen: Integer):
  1078.   Integer; stdcall;
  1079. function closesocket(const s: TSocket): Integer; stdcall;
  1080. function connect(const s: TSocket; const name: PSockAddr; namelen: Integer):
  1081.   Integer; stdcall;
  1082. function ioctlsocket(const s: TSocket; const cmd: DWORD; var arg: u_long):
  1083.   Integer; stdcall;
  1084. function getpeername(const s: TSocket; var name: TSockAddr; var namelen:
  1085.   Integer): Integer; stdcall;
  1086. function getsockname(const s: TSocket; var name: TSockAddr; var namelen:
  1087.   Integer): Integer; stdcall;
  1088. function getsockopt(const s: TSocket; const level, optname: Integer; optval:
  1089.   PChar; var optlen: Integer): Integer; stdcall;
  1090. function htonl(hostlong: u_long): u_long; stdcall;
  1091. function htons(hostshort: u_short): u_short; stdcall;
  1092. function inet_addr(cp: PChar): u_long; stdcall;
  1093. function inet_ntoa(inaddr: TInAddr): PChar; stdcall;
  1094. function listen(s: TSocket; backlog: Integer): Integer; stdcall;
  1095. function ntohl(netlong: u_long): u_long; stdcall;
  1096. function ntohs(netshort: u_short): u_short; stdcall;
  1097. function recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  1098. function recvfrom(s: TSocket; var Buf; len, flags: Integer; var from: TSockAddr;
  1099.   var fromlen: Integer): Integer; stdcall;
  1100. function select(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout:
  1101.   PTimeVal): Integer; stdcall;
  1102. function send(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  1103. function sendto(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr;
  1104.   tolen: Integer): Integer; stdcall;
  1105. function setsockopt(s: TSocket; level, optname: Integer; optval: PChar; optlen:
  1106.   Integer): Integer; stdcall;
  1107. function shutdown(s: TSocket; how: Integer): Integer; stdcall;
  1108. function socket(const af, struct, protocol: Integer): TSocket; stdcall;
  1109. function gethostbyaddr(addr: Pointer; len, struct: Integer): PHostEnt; stdcall;
  1110. function gethostbyname(name: PChar): PHostEnt; stdcall;
  1111. function gethostname(name: PChar; len: Integer): Integer; stdcall;
  1112. function getservbyport(port: Integer; proto: PChar): PServEnt; stdcall;
  1113. function getservbyname(const name, proto: PChar): PServEnt; stdcall;
  1114. function getprotobynumber(const proto: Integer): PProtoEnt; stdcall;
  1115. function getprotobyname(const name: PChar): PProtoEnt; stdcall;
  1116. function WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer;
  1117.   stdcall;
  1118. function WSACleanup: Integer; stdcall;
  1119. procedure WSASetLastError(iError: Integer); stdcall;
  1120. function WSAGetLastError: Integer; stdcall;
  1121. function WSAIsBlocking: BOOL; stdcall;
  1122. function WSAUnhookBlockingHook: Integer; stdcall;
  1123. function WSASetBlockingHook(lpBlockFunc: TFarProc): TFarProc; stdcall;
  1124. function WSACancelBlockingCall: Integer; stdcall;
  1125. function WSAAsyncGetServByName(HWindow: HWND; wMsg: u_int; name, proto, buf:
  1126.   PChar; buflen: Integer): THandle; stdcall;
  1127. function WSAAsyncGetServByPort(HWindow: HWND; wMsg, port: u_int; proto, buf:
  1128.   PChar; buflen: Integer): THandle; stdcall;
  1129. function WSAAsyncGetProtoByName(HWindow: HWND; wMsg: u_int; name, buf: PChar;
  1130.   buflen: Integer): THandle; stdcall;
  1131. function WSAAsyncGetProtoByNumber(HWindow: HWND; wMsg: u_int; number: Integer;
  1132.   buf: PChar; buflen: Integer): THandle; stdcall;
  1133. function WSAAsyncGetHostByName(HWindow: HWND; wMsg: u_int; name, buf: PChar;
  1134.   buflen: Integer): THandle; stdcall;
  1135. function WSAAsyncGetHostByAddr(HWindow: HWND; wMsg: u_int; addr: PChar; len,
  1136.   struct: Integer; buf: PChar; buflen: Integer): THandle; stdcall;
  1137. function WSACancelAsyncRequest(hAsyncTaskHandle: THandle): Integer; stdcall;
  1138. function WSAAsyncSelect(s: TSocket; HWindow: HWND; wMsg: u_int; lEvent:
  1139.   Longint): Integer; stdcall;
  1140. function __WSAFDIsSet(s: TSOcket; var FDSet: TFDSet): Bool; stdcall;
  1141. { WinSock 2 API new function prototypes }
  1142. function WSAAccept(s: TSocket; addr: TSockAddr; addrlen: PInteger;
  1143.   lpfnCondition: LPCONDITIONPROC; dwCallbackData: DWORD): TSocket; stdcall;
  1144. function WSACloseEvent(hEvent: WSAEVENT): WordBool; stdcall;
  1145. function WSAConnect(s: TSocket; const name: PSockAddr; namelen: Integer;
  1146.   lpCallerData, lpCalleeData: LPWSABUF; lpSQOS, lpGQOS: LPQOS): Integer; stdcall;
  1147. function WSACreateEvent: WSAEVENT; stdcall;
  1148. function WSADuplicateSocketA(s: TSocket; dwProcessId: DWORD; lpProtocolInfo:
  1149.   LPWSAProtocol_InfoA): Integer; stdcall;
  1150. function WSADuplicateSocketW(s: TSocket; dwProcessId: DWORD; lpProtocolInfo:
  1151.   LPWSAProtocol_InfoW): Integer; stdcall;
  1152. function WSADuplicateSocket(s: TSocket; dwProcessId: DWORD; lpProtocolInfo:
  1153.   LPWSAProtocol_Info): Integer; stdcall;
  1154. function WSAEnumNetworkEvents(const s: TSocket; const hEventObject: WSAEVENT;
  1155.   lpNetworkEvents: LPWSANETWORKEVENTS): Integer; stdcall;
  1156. function WSAEnumProtocolsA(lpiProtocols: PInteger; lpProtocolBuffer:
  1157.   LPWSAProtocol_InfoA; var lpdwBufferLength: DWORD): Integer; stdcall;
  1158. function WSAEnumProtocolsW(lpiProtocols: PInteger; lpProtocolBuffer:
  1159.   LPWSAProtocol_InfoW; var lpdwBufferLength: DWORD): Integer; stdcall;
  1160. function WSAEnumProtocols(lpiProtocols: PInteger; lpProtocolBuffer:
  1161.   LPWSAProtocol_Info; var lpdwBufferLength: DWORD): Integer; stdcall;
  1162. function WSAEventSelect(s: TSocket; hEventObject: WSAEVENT; lNetworkEvents:
  1163.   LongInt): Integer; stdcall;
  1164. function WSAGetOverlappedResult(s: TSocket; lpOverlapped: LPWSAOVERLAPPED;
  1165.   lpcbTransfer: LPDWORD; fWait: BOOL; var lpdwFlags: DWORD): WordBool; stdcall;
  1166. function WSAGetQosByName(s: TSocket; lpQOSName: LPWSABUF; lpQOS: LPQOS):
  1167.   WordBool; stdcall;
  1168. function WSAhtonl(s: TSocket; hostlong: u_long; var lpnetlong: DWORD): Integer;
  1169.   stdcall;
  1170. function WSAhtons(s: TSocket; hostshort: u_short; var lpnetshort: WORD):
  1171.   Integer; stdcall;
  1172. function WSAIoctl(s: TSocket; dwIoControlCode: DWORD; lpvInBuffer: Pointer;
  1173.   cbInBuffer: DWORD; lpvOutBuffer: Pointer; cbOutBuffer: DWORD;
  1174.   lpcbBytesReturned: LPDWORD; lpOverlapped: LPWSAOVERLAPPED;
  1175.     lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  1176. function WSAJoinLeaf(s: TSocket; name: PSockAddr; namelen: Integer;
  1177.   lpCallerData, lpCalleeData: LPWSABUF;
  1178.   lpSQOS, lpGQOS: LPQOS; dwFlags: DWORD): TSocket; stdcall;
  1179. function WSANtohl(s: TSocket; netlong: u_long; var lphostlong: DWORD): Integer;
  1180.   stdcall;
  1181. function WSANtohs(s: TSocket; netshort: u_short; var lphostshort: WORD):
  1182.   Integer; stdcall;
  1183. function WSARecv(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var
  1184.   lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD;
  1185.   lpOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine:
  1186.     LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  1187. function WSARecvDisconnect(s: TSocket; lpInboundDisconnectData: LPWSABUF):
  1188.   Integer; stdcall;
  1189. function WSARecvFrom(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var
  1190.   lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD;
  1191.   lpFrom: PSockAddr; lpFromlen: PInteger; lpOverlapped: LPWSAOVERLAPPED;
  1192.     lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  1193. function WSAResetEvent(hEvent: WSAEVENT): WordBool; stdcall;
  1194. function WSASend(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var
  1195.   lpNumberOfBytesSent: DWORD; dwFlags: DWORD;
  1196.   lpOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine:
  1197.     LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  1198. function WSASendDisconnect(s: TSocket; lpOutboundDisconnectData: LPWSABUF):
  1199.   Integer; stdcall;
  1200. function WSASendTo(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var
  1201.   lpNumberOfBytesSent: DWORD; dwFlags: DWORD;
  1202.   lpTo: PSockAddr; iTolen: Integer; lpOverlapped: LPWSAOVERLAPPED;
  1203.     lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  1204. function WSASetEvent(hEvent: WSAEVENT): WordBool; stdcall;
  1205. function WSASocketA(af, iType, protocol: Integer; lpProtocolInfo:
  1206.   LPWSAProtocol_InfoA; g: GROUP; dwFlags: DWORD): TSocket; stdcall;
  1207. function WSASocketW(af, iType, protocol: Integer; lpProtocolInfo:
  1208.   LPWSAProtocol_InfoW; g: GROUP; dwFlags: DWORD): TSocket; stdcall;
  1209. function WSASocket(af, iType, protocol: Integer; lpProtocolInfo:
  1210.   LPWSAProtocol_Info; g: GROUP; dwFlags: DWORD): TSocket; stdcall;
  1211. function WSAWaitForMultipleEvents(cEvents: DWORD; lphEvents: PWSAEVENT;
  1212.   fWaitAll: LongBool;
  1213.   dwTimeout: DWORD; fAlertable: LongBool): DWORD; stdcall;
  1214. function WSAAddressToStringA(lpsaAddress: PSockAddr; const dwAddressLength:
  1215.   DWORD; const lpProtocolInfo: LPWSAProtocol_InfoA;
  1216.   const lpszAddressString: PChar; var lpdwAddressStringLength: DWORD): Integer;
  1217.     stdcall;
  1218. function WSAAddressToStringW(lpsaAddress: PSockAddr; const dwAddressLength:
  1219.   DWORD; const lpProtocolInfo: LPWSAProtocol_InfoW;
  1220.   const lpszAddressString: PWideChar; var lpdwAddressStringLength: DWORD):
  1221.     Integer; stdcall;
  1222. function WSAAddressToString(lpsaAddress: PSockAddr; const dwAddressLength:
  1223.   DWORD; const lpProtocolInfo: LPWSAProtocol_Info;
  1224.   const lpszAddressString: PMBChar; var lpdwAddressStringLength: DWORD):
  1225.     Integer; stdcall;
  1226. function WSAStringToAddressA(const AddressString: PChar; const AddressFamily:
  1227.   Integer; const lpProtocolInfo: LPWSAProtocol_InfoA;
  1228.   var lpAddress: TSockAddr; var lpAddressLength: Integer): Integer; stdcall;
  1229. function WSAStringToAddressW(const AddressString: PWideChar; const
  1230.   AddressFamily: Integer; const lpProtocolInfo: LPWSAProtocol_InfoA;
  1231.   var lpAddress: TSockAddr; var lpAddressLength: Integer): Integer; stdcall;
  1232. function WSAStringToAddress(const AddressString: PMBChar; const AddressFamily:
  1233.   Integer; const lpProtocolInfo: LPWSAProtocol_Info;
  1234.   var lpAddress: TSockAddr; var lpAddressLength: Integer): Integer; stdcall;
  1235. { Registration and Name Resolution API functions }
  1236. function WSALookupServiceBeginA(var qsRestrictions: TWSAQuerySetA; const
  1237.   dwControlFlags: DWORD; var hLookup: THANDLE): Integer; stdcall;
  1238. function WSALookupServiceBeginW(var qsRestrictions: TWSAQuerySetW; const
  1239.   dwControlFlags: DWORD; var hLookup: THANDLE): Integer; stdcall;
  1240. function WSALookupServiceBegin(var qsRestrictions: TWSAQuerySet; const
  1241.   dwControlFlags: DWORD; var hLookup: THANDLE): Integer; stdcall;
  1242. function WSALookupServiceNextA(const hLookup: THandle; const dwControlFlags:
  1243.   DWORD; var dwBufferLength: DWORD; lpqsResults: PWSAQuerySetA): Integer; stdcall;
  1244. function WSALookupServiceNextW(const hLookup: THandle; const dwControlFlags:
  1245.   DWORD; var dwBufferLength: DWORD; lpqsResults: PWSAQuerySetW): Integer; stdcall;
  1246. function WSALookupServiceNext(const hLookup: THandle; const dwControlFlags:
  1247.   DWORD; var dwBufferLength: DWORD; lpqsResults: PWSAQuerySet): Integer; stdcall;
  1248. function WSALookupServiceEnd(const hLookup: THandle): Integer; stdcall;
  1249. function WSAInstallServiceClassA(const lpServiceClassInfo:
  1250.   LPWSAServiceClassInfoA): Integer; stdcall;
  1251. function WSAInstallServiceClassW(const lpServiceClassInfo:
  1252.   LPWSAServiceClassInfoW): Integer; stdcall;
  1253. function WSAInstallServiceClass(const lpServiceClassInfo:
  1254.   LPWSAServiceClassInfo): Integer; stdcall;
  1255. function WSARemoveServiceClass(const lpServiceClassId: PGUID): Integer; stdcall;
  1256. function WSAGetServiceClassInfoA(const lpProviderId: PGUID; const
  1257.   lpServiceClassId: PGUID; var lpdwBufSize: DWORD;
  1258.   lpServiceClassInfo: LPWSAServiceClassInfoA): Integer; stdcall;
  1259. function WSAGetServiceClassInfoW(const lpProviderId: PGUID; const
  1260.   lpServiceClassId: PGUID; var lpdwBufSize: DWORD;
  1261.   lpServiceClassInfo: LPWSAServiceClassInfoW): Integer; stdcall;
  1262. function WSAGetServiceClassInfo(const lpProviderId: PGUID; const
  1263.   lpServiceClassId: PGUID; var lpdwBufSize: DWORD;
  1264.   lpServiceClassInfo: LPWSAServiceClassInfo): Integer; stdcall;
  1265. function WSAEnumNameSpaceProvidersA(var lpdwBufferLength: DWORD; const
  1266.   lpnspBuffer: LPWSANameSpace_InfoA): Integer; stdcall;
  1267. function WSAEnumNameSpaceProvidersW(var lpdwBufferLength: DWORD; const
  1268.   lpnspBuffer: LPWSANameSpace_InfoW): Integer; stdcall;
  1269. function WSAEnumNameSpaceProviders(var lpdwBufferLength: DWORD; const
  1270.   lpnspBuffer: LPWSANameSpace_Info): Integer; stdcall;
  1271. function WSAGetServiceClassNameByClassIdA(const lpServiceClassId: PGUID;
  1272.   lpszServiceClassName: PChar;
  1273.   var lpdwBufferLength: DWORD): Integer; stdcall;
  1274. function WSAGetServiceClassNameByClassIdW(const lpServiceClassId: PGUID;
  1275.   lpszServiceClassName: PWideChar;
  1276.   var lpdwBufferLength: DWORD): Integer; stdcall;
  1277. function WSAGetServiceClassNameByClassId(const lpServiceClassId: PGUID;
  1278.   lpszServiceClassName: PMBChar;
  1279.   var lpdwBufferLength: DWORD): Integer; stdcall;
  1280. function WSASetServiceA(const lpqsRegInfo: LPWSAQuerySetA; const essoperation:
  1281.   TWSAeSetServiceOp;
  1282.   const dwControlFlags: DWORD): Integer; stdcall;
  1283. function WSASetServiceW(const lpqsRegInfo: LPWSAQuerySetW; const essoperation:
  1284.   TWSAeSetServiceOp;
  1285.   const dwControlFlags: DWORD): Integer; stdcall;
  1286. function WSASetService(const lpqsRegInfo: LPWSAQuerySet; const essoperation:
  1287.   TWSAeSetServiceOp;
  1288.   const dwControlFlags: DWORD): Integer; stdcall;
  1289. function WSAProviderConfigChange(var lpNotificationHandle: THandle;
  1290.   lpOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine:
  1291.   LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  1292. { Macros }
  1293. function WSAMakeSyncReply(Buflen, Error: Word): Longint;
  1294. function WSAMakeSelectReply(Event, Error: Word): Longint;
  1295. function WSAGetAsyncBuflen(Param: Longint): Word;
  1296. function WSAGetAsyncError(Param: Longint): Word;
  1297. function WSAGetSelectEvent(Param: Longint): Word;
  1298. function WSAGetSelectError(Param: Longint): Word;
  1299. procedure FD_CLR(Socket: TSocket; var FDSet: TFDSet);
  1300. function FD_ISSET(Socket: TSocket; var FDSet: TFDSet): Boolean;
  1301. procedure FD_SET(Socket: TSocket; var FDSet: TFDSet);
  1302. procedure FD_ZERO(var FDSet: TFDSet);
  1303. {$INCLUDE ws2tcpip.inc}
  1304. {$INCLUDE wsipx.inc}
  1305. {$INCLUDE wsnwlink.inc}
  1306. {$INCLUDE wsnetbs.inc}
  1307. //=============================================================
  1308. implementation
  1309. //=============================================================
  1310. function accept; external WINSOCK2_DLL name 'accept';
  1311. function bind; external WINSOCK2_DLL name 'bind';
  1312. function closesocket; external WINSOCK2_DLL name 'closesocket';
  1313. function connect; external WINSOCK2_DLL name 'connect';
  1314. function ioctlsocket; external WINSOCK2_DLL name 'ioctlsocket';
  1315. function getpeername; external WINSOCK2_DLL name 'getpeername';
  1316. function getsockname; external WINSOCK2_DLL name 'getsockname';
  1317. function getsockopt; external WINSOCK2_DLL name 'getsockopt';
  1318. function htonl; external WINSOCK2_DLL name 'htonl';
  1319. function htons; external WINSOCK2_DLL name 'htons';
  1320. function inet_addr; external WINSOCK2_DLL name 'inet_addr';
  1321. function inet_ntoa; external WINSOCK2_DLL name 'inet_ntoa';
  1322. function listen; external WINSOCK2_DLL name 'listen';
  1323. function ntohl; external WINSOCK2_DLL name 'ntohl';
  1324. function ntohs; external WINSOCK2_DLL name 'ntohs';
  1325. function recv; external WINSOCK2_DLL name 'recv';
  1326. function recvfrom; external WINSOCK2_DLL name 'recvfrom';
  1327. function select; external WINSOCK2_DLL name 'select';
  1328. function send; external WINSOCK2_DLL name 'send';
  1329. function sendto; external WINSOCK2_DLL name 'sendto';
  1330. function setsockopt; external WINSOCK2_DLL name 'setsockopt';
  1331. function shutdown; external WINSOCK2_DLL name 'shutdown';
  1332. function socket; external WINSOCK2_DLL name 'socket';
  1333. function gethostbyaddr; external WINSOCK2_DLL name 'gethostbyaddr';
  1334. function gethostbyname; external WINSOCK2_DLL name 'gethostbyname';
  1335. function gethostname; external WINSOCK2_DLL name 'gethostname';
  1336. function getservbyport; external WINSOCK2_DLL name 'getservbyport';
  1337. function getservbyname; external WINSOCK2_DLL name 'getservbyname';
  1338. function getprotobynumber; external WINSOCK2_DLL name 'getprotobynumber';
  1339. function getprotobyname; external WINSOCK2_DLL name 'getprotobyname';
  1340. function WSAStartup; external WINSOCK2_DLL name 'WSAStartup';
  1341. function WSACleanup; external WINSOCK2_DLL name 'WSACleanup';
  1342. procedure WSASetLastError; external WINSOCK2_DLL name 'WSASetLastError';
  1343. function WSAGetLastError; external WINSOCK2_DLL name 'WSAGetLastError';
  1344. function WSAIsBlocking; external WINSOCK2_DLL name 'WSAIsBlocking';
  1345. function WSAUnhookBlockingHook; external WINSOCK2_DLL name
  1346.   'WSAUnhookBlockingHook';
  1347. function WSASetBlockingHook; external WINSOCK2_DLL name 'WSASetBlockingHook';
  1348. function WSACancelBlockingCall; external WINSOCK2_DLL name
  1349.   'WSACancelBlockingCall';
  1350. function WSAAsyncGetServByName; external WINSOCK2_DLL name
  1351.   'WSAAsyncGetServByName';
  1352. function WSAAsyncGetServByPort; external WINSOCK2_DLL name
  1353.   'WSAAsyncGetServByPort';
  1354. function WSAAsyncGetProtoByName; external WINSOCK2_DLL name
  1355.   'WSAAsyncGetProtoByName';
  1356. function WSAAsyncGetProtoByNumber; external WINSOCK2_DLL name
  1357.   'WSAAsyncGetProtoByNumber';
  1358. function WSAAsyncGetHostByName; external WINSOCK2_DLL name
  1359.   'WSAAsyncGetHostByName';
  1360. function WSAAsyncGetHostByAddr; external WINSOCK2_DLL name
  1361.   'WSAAsyncGetHostByAddr';
  1362. function WSACancelAsyncRequest; external WINSOCK2_DLL name
  1363.   'WSACancelAsyncRequest';
  1364. function WSAAsyncSelect; external WINSOCK2_DLL name 'WSAAsyncSelect';
  1365. function __WSAFDIsSet; external WINSOCK2_DLL name '__WSAFDIsSet';
  1366. { WinSock 2 API new function prototypes }
  1367. function WSAAccept; external WINSOCK2_DLL name 'WSAAccept';
  1368. function WSACloseEvent; external WINSOCK2_DLL name 'WSACloseEvent';
  1369. function WSAConnect; external WINSOCK2_DLL name 'WSAConnect';
  1370. function WSACreateEvent; external WINSOCK2_DLL name 'WSACreateEvent';
  1371. function WSADuplicateSocketA; external WINSOCK2_DLL name 'WSADuplicateSocketA';
  1372. function WSADuplicateSocketW; external WINSOCK2_DLL name 'WSADuplicateSocketW';
  1373. function WSAEnumNetworkEvents; external WINSOCK2_DLL name
  1374.   'WSAEnumNetworkEvents';
  1375. function WSAEnumProtocolsA; external WINSOCK2_DLL name 'WSAEnumProtocolsA';
  1376. function WSAEnumProtocolsW; external WINSOCK2_DLL name 'WSAEnumProtocolsW';
  1377. function WSAEventSelect; external WINSOCK2_DLL name 'WSAEventSelect';
  1378. function WSAGetOverlappedResult; external WINSOCK2_DLL name
  1379.   'WSAGetOverlappedResult';
  1380. function WSAGetQosByName; external WINSOCK2_DLL name 'WSAGetQosByName';
  1381. function WSAhtonl; external WINSOCK2_DLL name 'WSAhtonl';
  1382. function WSAhtons; external WINSOCK2_DLL name 'WSAhtons';
  1383. function WSAIoctl; external WINSOCK2_DLL name 'WSAIoctl';
  1384. function WSAJoinLeaf; external WINSOCK2_DLL name 'WSAJoinLeaf';
  1385. function WSANtohl; external WINSOCK2_DLL name 'WSANtohl';
  1386. function WSANtohs; external WINSOCK2_DLL name 'WSANtohs';
  1387. function WSARecv; external WINSOCK2_DLL name 'WSARecv';
  1388. function WSARecvDisconnect; external WINSOCK2_DLL name 'WSARecvDisconnect';
  1389. function WSARecvFrom; external WINSOCK2_DLL name 'WSARecvFrom';
  1390. function WSAResetEvent; external WINSOCK2_DLL name 'WSAResetEvent';
  1391. function WSASend; external WINSOCK2_DLL name 'WSASend';
  1392. function WSASendDisconnect; external WINSOCK2_DLL name 'WSASendDisconnect';
  1393. function WSASendTo; external WINSOCK2_DLL name 'WSASendTo';
  1394. function WSASetEvent; external WINSOCK2_DLL name 'WSASetEvent';
  1395. function WSASocketA; external WINSOCK2_DLL name 'WSASocketA';
  1396. function WSASocketW; external WINSOCK2_DLL name 'WSASocketW';
  1397. function WSAWaitForMultipleEvents; external WINSOCK2_DLL name
  1398.   'WSAWaitForMultipleEvents';
  1399. function WSAAddressToStringA; external WINSOCK2_DLL name 'WSAAddressToStringA';
  1400. function WSAAddressToStringW; external WINSOCK2_DLL name 'WSAAddressToStringW';
  1401. function WSAStringToAddressA; external WINSOCK2_DLL name 'WSAStringToAddressA';
  1402. function WSAStringToAddressW; external WINSOCK2_DLL name 'WSAStringToAddressW';
  1403. { Registration and Name Resolution API functions }
  1404. function WSALookupServiceBeginA; external WINSOCK2_DLL name
  1405.   'WSALookupServiceBeginA';
  1406. function WSALookupServiceBeginW; external WINSOCK2_DLL name
  1407.   'WSALookupServiceBeginW';
  1408. function WSALookupServiceNextA; external WINSOCK2_DLL name
  1409.   'WSALookupServiceNextA';
  1410. function WSALookupServiceNextW; external WINSOCK2_DLL name
  1411.   'WSALookupServiceNextW';
  1412. function WSALookupServiceEnd; external WINSOCK2_DLL name 'WSALookupServiceEnd';
  1413. function WSAInstallServiceClassA; external WINSOCK2_DLL name
  1414.   'WSAInstallServiceClassA';
  1415. function WSAInstallServiceClassW; external WINSOCK2_DLL name
  1416.   'WSAInstallServiceClassW';
  1417. function WSARemoveServiceClass; external WINSOCK2_DLL name
  1418.   'WSARemoveServiceClass';
  1419. function WSAGetServiceClassInfoA; external WINSOCK2_DLL name
  1420.   'WSAGetServiceClassInfoA';
  1421. function WSAGetServiceClassInfoW; external WINSOCK2_DLL name
  1422.   'WSAGetServiceClassInfoW';
  1423. function WSAEnumNameSpaceProvidersA; external WINSOCK2_DLL name
  1424.   'WSAEnumNameSpaceProvidersA';
  1425. function WSAEnumNameSpaceProvidersW; external WINSOCK2_DLL name
  1426.   'WSAEnumNameSpaceProvidersW';
  1427. function WSAGetServiceClassNameByClassIdA; external WINSOCK2_DLL name
  1428.   'WSAGetServiceClassNameByClassIdA';
  1429. function WSAGetServiceClassNameByClassIdW; external WINSOCK2_DLL name
  1430.   'WSAGetServiceClassNameByClassIdW';
  1431. function WSASetServiceA; external WINSOCK2_DLL name 'WSASetServiceA';
  1432. function WSASetServiceW; external WINSOCK2_DLL name 'WSASetServiceW';
  1433. {$IFDEF UNICODE}
  1434. function WSADuplicateSocket; external WINSOCK2_DLL name 'WSADuplicateSocketW';
  1435. function WSAEnumProtocols; external WINSOCK2_DLL name 'WSAEnumProtocolsW';
  1436. function WSASocket; external WINSOCK2_DLL name 'WSASocketW';
  1437. function WSAAddressToString; external WINSOCK2_DLL name 'WSAAddressToStringW';
  1438. function WSAStringToAddress; external WINSOCK2_DLL name 'WSAStringToAddressW';
  1439. function WSALookupServiceBegin; external WINSOCK2_DLL name
  1440.   'WSALookupServiceBeginW';
  1441. function WSALookupServiceNext; external WINSOCK2_DLL name
  1442.   'WSALookupServiceNextW';
  1443. function WSAInstallServiceClass; external WINSOCK2_DLL name
  1444.   'WSAInstallServiceClassW';
  1445. function WSAGetServiceClassInfo; external WINSOCK2_DLL name
  1446.   'WSAGetServiceClassInfoW';
  1447. function WSAEnumNameSpaceProviders; external WINSOCK2_DLL name
  1448.   'WSAEnumNameSpaceProvidersW';
  1449. function WSAGetServiceClassNameByClassId; external WINSOCK2_DLL name
  1450.   'WSAGetServiceClassNameByClassIdW';
  1451. function WSASetService; external WINSOCK2_DLL name 'WSASetServiceW';
  1452. {$ELSE}
  1453. function WSADuplicateSocket; external WINSOCK2_DLL name 'WSADuplicateSocketA';
  1454. function WSAEnumProtocols; external WINSOCK2_DLL name 'WSAEnumProtocolsA';
  1455. function WSASocket; external WINSOCK2_DLL name 'WSASocketA';
  1456. function WSAAddressToString; external WINSOCK2_DLL name 'WSAAddressToStringA';
  1457. function WSAStringToAddress; external WINSOCK2_DLL name 'WSAStringToAddressA';
  1458. function WSALookupServiceBegin; external WINSOCK2_DLL name
  1459.   'WSALookupServiceBeginA';
  1460. function WSALookupServiceNext; external WINSOCK2_DLL name
  1461.   'WSALookupServiceNextA';
  1462. function WSAInstallServiceClass; external WINSOCK2_DLL name
  1463.   'WSAInstallServiceClassA';
  1464. function WSAGetServiceClassInfo; external WINSOCK2_DLL name
  1465.   'WSAGetServiceClassInfoA';
  1466. function WSAEnumNameSpaceProviders; external WINSOCK2_DLL name
  1467.   'WSAEnumNameSpaceProvidersA';
  1468. function WSAGetServiceClassNameByClassId; external WINSOCK2_DLL name
  1469.   'WSAGetServiceClassNameByClassIdA';
  1470. function WSASetService; external WINSOCK2_DLL name 'WSASetServiceA';
  1471. {$ENDIF}
  1472. function WSAProviderConfigChange; external WINSOCK2_DLL name
  1473.   'WSAProviderConfigChange';
  1474. function WSAMakeSyncReply;
  1475. begin
  1476.   WSAMakeSyncReply := MakeLong(Buflen, Error);
  1477. end;
  1478. function WSAMakeSelectReply;
  1479. begin
  1480.   WSAMakeSelectReply := MakeLong(Event, Error);
  1481. end;
  1482. function WSAGetAsyncBuflen;
  1483. begin
  1484.   WSAGetAsyncBuflen := LOWORD(Param);
  1485. end;
  1486. function WSAGetAsyncError;
  1487. begin
  1488.   WSAGetAsyncError := HIWORD(Param);
  1489. end;
  1490. function WSAGetSelectEvent;
  1491. begin
  1492.   WSAGetSelectEvent := LOWORD(Param);
  1493. end;
  1494. function WSAGetSelectError;
  1495. begin
  1496.   WSAGetSelectError := HIWORD(Param);
  1497. end;
  1498. procedure FD_CLR(Socket: TSocket; var FDSet: TFDSet);
  1499. var
  1500.   i: DWORD;
  1501. begin
  1502.   i := 0;
  1503.   while i < FDSet.fd_count do
  1504.   begin
  1505.     if FDSet.fd_array[i] = Socket then
  1506.     begin
  1507.       while i < FDSet.fd_count - 1 do
  1508.       begin
  1509.         FDSet.fd_array[i] := FDSet.fd_array[i + 1];
  1510.         Inc(i);
  1511.       end;
  1512.       Dec(FDSet.fd_count);
  1513.       Break;
  1514.     end;
  1515.     Inc(i);
  1516.   end;
  1517. end;
  1518. function FD_ISSET(Socket: TSocket; var FDSet: TFDSet): Boolean;
  1519. begin
  1520.   Result := __WSAFDIsSet(Socket, FDSet);
  1521. end;
  1522. procedure FD_SET(Socket: TSocket; var FDSet: TFDSet);
  1523. begin
  1524.   if FDSet.fd_count < FD_SETSIZE then
  1525.   begin
  1526.     FDSet.fd_array[FDSet.fd_count] := Socket;
  1527.     Inc(FDSet.fd_count);
  1528.   end;
  1529. end;
  1530. procedure FD_ZERO(var FDSet: TFDSet);
  1531. begin
  1532.   FDSet.fd_count := 0;
  1533. end;
  1534. //  A macro convenient for setting up NETBIOS SOCKADDRs.
  1535. procedure SET_NETBIOS_SOCKADDR(snb: PSOCKADDR_NB; const SnbType: Word; const
  1536.   Name: PChar; const Port: Char);
  1537. var
  1538.   len: Integer;
  1539. begin
  1540.   if snb <> nil then
  1541.     with snb^ do
  1542.     begin
  1543.       snb_family := AF_NETBIOS;
  1544.       snb_type := SnbType;
  1545.       len := StrLen(Name);
  1546.       if len >= NETBIOS_NAME_LENGTH - 1 then
  1547.         System.Move(Name^, snb_name, NETBIOS_NAME_LENGTH - 1)
  1548.       else
  1549.       begin
  1550.         if len > 0 then System.Move(Name^, snb_name, len);
  1551.         FillChar((PChar(@snb_name) + len)^, NETBIOS_NAME_LENGTH - 1 - len, ' ');
  1552.       end;
  1553.       snb_name[NETBIOS_NAME_LENGTH - 1] := Port;
  1554.     end;
  1555. end;
  1556. end.