JwaWinsock2.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:139k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Winsock2 API interface Unit for Object Pascal                                }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: winsock2.h, released June 2000. The original Pascal    }
  9. { code is: WinSock2.pas, released December 2000. The initial developer of the  }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaWinsock2;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "winsock2.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaQos, JwaWinType, JwaWinBase, JwaWinError, JwaWinNT;
  52. type // TODO
  53.   ULONG_PTR = ULONG;
  54.   DWORD_PTR = DWORD;
  55.   PPChar = ^PChar;
  56.   {$NODEFINE PPChar}
  57.   HANDLE = THandle;
  58.   {$NODEFINE HANDLE}
  59.   LPHANDLE = ^THandle;
  60.   {$NODEFINE LPHANDLE}
  61.   LPBYTE = ^BYTE;
  62.   {$NODEFINE LPBYTE}
  63.   LPVOID = Pointer;
  64.   {$NODEFINE LPVOID}
  65.   USHORT = Word;
  66.   {$NODEFINE USHORT}
  67.   UCHAR = Byte;
  68.   {$NODEFINE UCHAR}
  69.   ULONG = Cardinal;
  70.   {$NODEFINE ULONG}
  71. //#include <pshpack4.h>
  72. {$ALIGN ON}
  73. // Winsock2.h -- definitions to be used with the WinSock 2 DLL and
  74. //               WinSock 2 applications.
  75. //
  76. // This header file corresponds to version 2.2.x of the WinSock API
  77. // specification.
  78. //
  79. // This file includes parts which are Copyright (c) 1982-1986 Regents
  80. // of the University of California.  All rights reserved.  The
  81. // Berkeley Software License Agreement specifies the terms and
  82. // conditions for redistribution.
  83. //
  84. (*
  85.  * Default: include function prototypes, don't include function typedefs.
  86.  *)
  87. {$IFNDEF INCL_WINSOCK_API_PROTOTYPES}
  88. const
  89.   INCL_WINSOCK_API_PROTOTYPES = 1;
  90.   {$EXTERNALSYM INCL_WINSOCK_API_PROTOTYPES}
  91. {$ENDIF}
  92. {$IFNDEF INCL_WINSOCK_API_TYPEDEFS}
  93. const
  94.   INCL_WINSOCK_API_TYPEDEFS = 0;
  95.   {$EXTERNALSYM INCL_WINSOCK_API_TYPEDEFS}
  96. {$ENDIF}
  97. const
  98.   WINSOCK_VERSION = $0202;
  99.   {$EXTERNALSYM WINSOCK_VERSION}
  100. //
  101. // Basic system type definitions, taken from the BSD file sys/types.h.
  102. //
  103. type
  104.   u_char = Byte;
  105.   {$EXTERNALSYM u_char}
  106.   u_short = Word;
  107.   {$EXTERNALSYM u_short}
  108.   u_int = Cardinal;
  109.   {$EXTERNALSYM u_int}
  110.   u_long = Cardinal;
  111.   {$EXTERNALSYM u_long}
  112.   u_int64 = Int64; // unsigned __int64 !! TODO For Delphi 7 ??
  113.   {$EXTERNALSYM u_int64}
  114. //
  115. // The new type to be used in all
  116. // instances which refer to sockets.
  117. //
  118. type
  119.   TSocket = Cardinal;
  120. //
  121. // Select uses arrays of SOCKETs.  These macros manipulate such
  122. // arrays.  FD_SETSIZE may be defined by the user before including
  123. // this file, but the default here should be >= 64.
  124. //
  125. // CAVEAT IMPLEMENTOR and USER: THESE MACROS AND TYPES MUST BE
  126. // INCLUDED IN WINSOCK2.H EXACTLY AS SHOWN HERE.
  127. //
  128. const
  129.   FD_SETSIZE = 64;
  130.   {$EXTERNALSYM FD_SETSIZE}
  131. type
  132.   fd_set = record
  133.     fd_count: u_int;                                 // how many are SET?
  134.     fd_array: array [0..FD_SETSIZE - 1] of TSocket;   // an array of SOCKETs
  135.   end;
  136.   {$EXTERNALSYM fd_set}
  137.   TFdSet = fd_set;
  138.   PFdSet = ^fd_set;
  139. function __WSAFDIsSet(s: TSocket; var FDSet: TFDSet): Integer; stdcall;
  140. {$EXTERNALSYM __WSAFDIsSet}
  141. procedure FD_CLR(fd: TSocket; var fdset: TFdSet);
  142. {$EXTERNALSYM FD_CLR}
  143. procedure _FD_SET(fd: TSocket; var fdset: TFDSet);
  144. //{$EXTERNALSYM FD_SET}
  145. procedure FD_ZERO(var fdset: TFdSet);
  146. {$EXTERNALSYM FD_ZERO}
  147. function FD_ISSET(fd: TSocket; var fdset: TFdSet): Boolean;
  148. {$EXTERNALSYM FD_ISSET}
  149. //
  150. // Structure used in select() call, taken from the BSD file sys/time.h.
  151. //
  152. type
  153.   timeval = record
  154.     tv_sec: Longint;         // seconds
  155.     tv_usec: Longint;        // and microseconds
  156.   end;
  157.   {$EXTERNALSYM timeval}
  158.   TTimeVal = timeval;
  159.   PTimeVal = ^timeval;
  160. //
  161. // Operations on timevals.
  162. //
  163. // NB: timercmp does not work for >= or <=.
  164. //
  165. function timerisset(const tvp: TTimeVal): Boolean;
  166. {$EXTERNALSYM timerisset}
  167. //function timercmp(const tvp, uvp: TTimeVal; cmp): Boolean;
  168. //{$EXTERNALSYM timercmp}
  169. procedure timerclear(var tvp: TTimeVal);
  170. {$EXTERNALSYM timerclear}
  171. //
  172. // Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
  173. //
  174. //
  175. // Ioctl's have the command encoded in the lower word,
  176. // and the size of any in or out parameters in the upper
  177. // word.  The high 2 bits of the upper word are used
  178. // to encode the in/out status of the parameter; for now
  179. // we restrict parameters to at most 128 bytes.
  180. //
  181. const
  182.   IOCPARM_MASK = $7f;              // parameters must be < 128 bytes
  183.   {$EXTERNALSYM IOCPARM_MASK}
  184.   IOC_VOID     = $20000000;        // no parameters
  185.   {$EXTERNALSYM IOC_VOID}
  186.   IOC_OUT      = $40000000;        // copy out parameters
  187.   {$EXTERNALSYM IOC_OUT}
  188.   IOC_IN       = DWORD($80000000); // copy in parameters
  189.   {$EXTERNALSYM IOC_IN}
  190.   IOC_INOUT    = DWORD(IOC_IN or IOC_OUT);
  191.   {$EXTERNALSYM IOC_INOUT}
  192.   // 0x20000000 distinguishes new & old ioctl's
  193. function _IO(x, y: DWORD): DWORD;
  194. {$EXTERNALSYM _IO}
  195. function _IOR(x, y, t: DWORD): DWORD;
  196. {$EXTERNALSYM _IOR}
  197. function _IOW(x, y, t: DWORD): DWORD;
  198. {$EXTERNALSYM _IOW}
  199. const
  200.   FIONREAD = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 127; // get # bytes to read
  201.   {$EXTERNALSYM FIONREAD}
  202.   FIONBIO = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 126; // set/clear non-blocking i/o
  203.   {$EXTERNALSYM FIONBIO}
  204.   FIOASYNC = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 125; // set/clear async i/o
  205.   {$EXTERNALSYM FIOASYNC}
  206. // Socket I/O Controls
  207.   SIOCSHIWAT = DWORD(IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 0); // set high watermark
  208.   {$EXTERNALSYM SIOCSHIWAT}
  209.   SIOCGHIWAT = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 1; // get high watermark
  210.   {$EXTERNALSYM SIOCGHIWAT}
  211.   SIOCSLOWAT = DWORD(IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 2); // set low watermark
  212.   {$EXTERNALSYM SIOCSLOWAT}
  213.   SIOCGLOWAT = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 3; // get low watermark
  214.   {$EXTERNALSYM SIOCGLOWAT}
  215.   SIOCATMARK = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 7; // at oob mark?
  216.   {$EXTERNALSYM SIOCATMARK}
  217. //
  218. // Structures returned by network data base library, taken from the
  219. // BSD file netdb.h.  All addresses are supplied in host order, and
  220. // returned in network order (suitable for use in system calls).
  221. //
  222. type
  223.   hostent = record
  224.     h_name: PChar;           // official name of host
  225.     h_aliases: PPChar;  // alias list
  226.     h_addrtype: Smallint;             // host address type
  227.     h_length: Smallint;               // length of address
  228.     case Integer of
  229.       0: (h_addr_list: PPChar); // list of addresses
  230.       1: (h_addr: PPChar);          // address, for backward compat
  231.   end;
  232.   {$EXTERNALSYM hostent}
  233.   THostEnt = hostent;
  234.   PHostEnt = ^hostent;
  235. //
  236. // It is assumed here that a network number
  237. // fits in 32 bits.
  238. //
  239. type
  240.   netent = record
  241.     n_name: PChar;           // official name of net
  242.     n_aliases: PPChar;  // alias list
  243.     n_addrtype: Smallint;             // net address type
  244.     n_net: u_long;                  // network #
  245.   end;
  246.   {$EXTERNALSYM netent}
  247.   TNetEnt = netent;
  248.   PNetEnt = ^netent;
  249.   servent = record
  250.     s_name: PChar;           // official service name
  251.     s_aliases: PPChar;  // alias list
  252.     s_port: Smallint;                 // port #
  253.     s_proto: PChar;          // protocol to use
  254.   end;
  255.   {$EXTERNALSYM servent}
  256.   TServEnt = servent;
  257.   PServEnt = ^servent;
  258.   protoent = record
  259.     p_name: PChar;           // official protocol name
  260.     p_aliases: PPChar;  // alias list
  261.     p_proto: Smallint;                // protocol #
  262.   end;
  263.   {$EXTERNALSYM protoent}
  264.   TProtoEnt = protoent;
  265.   PProtoEnt = ^protoent;
  266. //
  267. // Constants and structures defined by the internet system,
  268. // Per RFC 790, September 1981, taken from the BSD file netinet/in.h.
  269. //
  270. //
  271. // Protocols
  272. //
  273. const
  274.   IPPROTO_IP   = 0; // dummy for IP
  275.   {$EXTERNALSYM IPPROTO_IP}
  276.   IPPROTO_HOPOPTS = 0; // IPv6 hop-by-hop options
  277.   {$EXTERNALSYM IPPROTO_HOPOPTS}
  278.   IPPROTO_ICMP = 1; // control message protocol
  279.   {$EXTERNALSYM IPPROTO_ICMP}
  280.   IPPROTO_IGMP = 2; // internet group management protocol
  281.   {$EXTERNALSYM IPPROTO_IGMP}
  282.   IPPROTO_GGP  = 3; // gateway^2 (deprecated)
  283.   {$EXTERNALSYM IPPROTO_GGP}
  284.   IPPROTO_IPV4 = 4; // IPv4
  285.   {$EXTERNALSYM IPPROTO_IPV4}
  286.   IPPROTO_TCP  = 6; // tcp
  287.   {$EXTERNALSYM IPPROTO_TCP}
  288.   IPPROTO_PUP  = 12; // pup
  289.   {$EXTERNALSYM IPPROTO_PUP}
  290.   IPPROTO_UDP  = 17; // user datagram protocol
  291.   {$EXTERNALSYM IPPROTO_UDP}
  292.   IPPROTO_IDP  = 22; // xns idp
  293.   {$EXTERNALSYM IPPROTO_IDP}
  294.   IPPROTO_IPV6 = 41; // IPv6
  295.   {$EXTERNALSYM IPPROTO_IPV6}
  296.   IPPROTO_ROUTING        = 43;              // IPv6 routing header
  297.   {$EXTERNALSYM IPPROTO_ROUTING}
  298.   IPPROTO_FRAGMENT       = 44;              // IPv6 fragmentation header
  299.   {$EXTERNALSYM IPPROTO_FRAGMENT}
  300.   IPPROTO_ESP            = 50;              // IPsec ESP header
  301.   {$EXTERNALSYM IPPROTO_ESP}
  302.   IPPROTO_AH             = 51;              // IPsec AH
  303.   {$EXTERNALSYM IPPROTO_AH}
  304.   IPPROTO_ICMPV6         = 58;              // ICMPv6
  305.   {$EXTERNALSYM IPPROTO_ICMPV6}
  306.   IPPROTO_NONE           = 59;              // IPv6 no next header
  307.   {$EXTERNALSYM IPPROTO_NONE}
  308.   IPPROTO_DSTOPTS        = 60;              // IPv6 destination options
  309.   {$EXTERNALSYM IPPROTO_DSTOPTS}
  310.   IPPROTO_ND   = 77; // UNOFFICIAL net disk proto
  311.   {$EXTERNALSYM IPPROTO_ND}
  312.   IPPROTO_ICLFXBM = 78;
  313.   {$EXTERNALSYM IPPROTO_ICLFXBM}
  314.   IPPROTO_RAW  = 255; // raw IP packet
  315.   {$EXTERNALSYM IPPROTO_RAW}
  316.   IPPROTO_MAX  = 256;
  317.   {$EXTERNALSYM IPPROTO_MAX}
  318. //
  319. // Port/socket numbers: network standard functions
  320. //
  321.   IPPORT_ECHO       = 7;
  322.   {$EXTERNALSYM IPPORT_ECHO}
  323.   IPPORT_DISCARD    = 9;
  324.   {$EXTERNALSYM IPPORT_DISCARD}
  325.   IPPORT_SYSTAT     = 11;
  326.   {$EXTERNALSYM IPPORT_SYSTAT}
  327.   IPPORT_DAYTIME    = 13;
  328.   {$EXTERNALSYM IPPORT_DAYTIME}
  329.   IPPORT_NETSTAT    = 15;
  330.   {$EXTERNALSYM IPPORT_NETSTAT}
  331.   IPPORT_FTP        = 21;
  332.   {$EXTERNALSYM IPPORT_FTP}
  333.   IPPORT_TELNET     = 23;
  334.   {$EXTERNALSYM IPPORT_TELNET}
  335.   IPPORT_SMTP       = 25;
  336.   {$EXTERNALSYM IPPORT_SMTP}
  337.   IPPORT_TIMESERVER = 37;
  338.   {$EXTERNALSYM IPPORT_TIMESERVER}
  339.   IPPORT_NAMESERVER = 42;
  340.   {$EXTERNALSYM IPPORT_NAMESERVER}
  341.   IPPORT_WHOIS      = 43;
  342.   {$EXTERNALSYM IPPORT_WHOIS}
  343.   IPPORT_MTP        = 57;
  344.   {$EXTERNALSYM IPPORT_MTP}
  345. //
  346. // Port/socket numbers: host specific functions
  347. //
  348.   IPPORT_TFTP    = 69;
  349.   {$EXTERNALSYM IPPORT_TFTP}
  350.   IPPORT_RJE     = 77;
  351.   {$EXTERNALSYM IPPORT_RJE}
  352.   IPPORT_FINGER  = 79;
  353.   {$EXTERNALSYM IPPORT_FINGER}
  354.   IPPORT_TTYLINK = 87;
  355.   {$EXTERNALSYM IPPORT_TTYLINK}
  356.   IPPORT_SUPDUP  = 95;
  357.   {$EXTERNALSYM IPPORT_SUPDUP}
  358. //
  359. // UNIX TCP sockets
  360. //
  361.   IPPORT_EXECSERVER  = 512;
  362.   {$EXTERNALSYM IPPORT_EXECSERVER}
  363.   IPPORT_LOGINSERVER = 513;
  364.   {$EXTERNALSYM IPPORT_LOGINSERVER}
  365.   IPPORT_CMDSERVER   = 514;
  366.   {$EXTERNALSYM IPPORT_CMDSERVER}
  367.   IPPORT_EFSSERVER   = 520;
  368.   {$EXTERNALSYM IPPORT_EFSSERVER}
  369. //
  370. // UNIX UDP sockets
  371. //
  372.   IPPORT_BIFFUDP     = 512;
  373.   {$EXTERNALSYM IPPORT_BIFFUDP}
  374.   IPPORT_WHOSERVER   = 513;
  375.   {$EXTERNALSYM IPPORT_WHOSERVER}
  376.   IPPORT_ROUTESERVER = 520;
  377.   {$EXTERNALSYM IPPORT_ROUTESERVER}
  378.   // 520+1 also used
  379. //
  380. // Ports < IPPORT_RESERVED are reserved for
  381. // privileged processes (e.g. root).
  382. //
  383.   IPPORT_RESERVED = 1024;
  384.   {$EXTERNALSYM IPPORT_RESERVED}
  385. //
  386. // Link numbers
  387. //
  388.   IMPLINK_IP        = 155;
  389.   {$EXTERNALSYM IMPLINK_IP}
  390.   IMPLINK_LOWEXPER  = 156;
  391.   {$EXTERNALSYM IMPLINK_LOWEXPER}
  392.   IMPLINK_HIGHEXPER = 158;
  393.   {$EXTERNALSYM IMPLINK_HIGHEXPER}
  394. //
  395. // Internet address (old style... should be updated)
  396. //
  397. type
  398.   SunB = packed record
  399.     s_b1, s_b2, s_b3, s_b4: u_char;
  400.   end;
  401.   {$EXTERNALSYM SunB}
  402.   SunC = packed record
  403.     s_c1, s_c2, s_c3, s_c4: Char;
  404.   end;
  405.   {$NODEFINE SunC}
  406.   SunW = packed record
  407.     s_w1, s_w2: u_short;
  408.   end;
  409.   {$EXTERNALSYM SunW}
  410.   in_addr = record
  411.     case Integer of
  412.       0: (S_un_b: SunB);
  413.       1: (S_un_c: SunC);
  414.       2: (S_un_w: SunW);
  415.       3: (S_addr: u_long);
  416.     // #define s_addr  S_un.S_addr // can be used for most tcp & ip code
  417.     // #define s_host  S_un.S_un_b.s_b2 // host on imp
  418.     // #define s_net   S_un.S_un_b.s_b1  // netword
  419.     // #define s_imp   S_un.S_un_w.s_w2 // imp
  420.     // #define s_impno S_un.S_un_b.s_b4 // imp #
  421.     // #define s_lh    S_un.S_un_b.s_b3 // logical host
  422.   end;
  423.   {$EXTERNALSYM in_addr}
  424.   TInAddr = in_addr;
  425.   PInAddr = ^in_addr;
  426. //
  427. // Definitions of bits in internet address integers.
  428. // On subnets, the decomposition of addresses to host and net parts
  429. // is done according to subnet mask, not the masks here.
  430. //
  431. function IN_CLASSA(i: DWORD): Boolean;
  432. {$EXTERNALSYM IN_CLASSA}
  433. const
  434.   IN_CLASSA_NET    = DWORD($ff000000);
  435.   {$EXTERNALSYM IN_CLASSA_NET}
  436.   IN_CLASSA_NSHIFT = 24;
  437.   {$EXTERNALSYM IN_CLASSA_NSHIFT}
  438.   IN_CLASSA_HOST   = $00ffffff;
  439.   {$EXTERNALSYM IN_CLASSA_HOST}
  440.   IN_CLASSA_MAX    = 128;
  441.   {$EXTERNALSYM IN_CLASSA_MAX}
  442. function IN_CLASSB(i: DWORD): Boolean;
  443. {$EXTERNALSYM IN_CLASSB}
  444. const
  445.   IN_CLASSB_NET    = DWORD($ffff0000);
  446.   {$EXTERNALSYM IN_CLASSB_NET}
  447.   IN_CLASSB_NSHIFT = 16;
  448.   {$EXTERNALSYM IN_CLASSB_NSHIFT}
  449.   IN_CLASSB_HOST   = $0000ffff;
  450.   {$EXTERNALSYM IN_CLASSB_HOST}
  451.   IN_CLASSB_MAX    = 65536;
  452.   {$EXTERNALSYM IN_CLASSB_MAX}
  453. function IN_CLASSC(i: DWORD): Boolean;
  454. {$EXTERNALSYM IN_CLASSC}
  455. const
  456.   IN_CLASSC_NET    = DWORD($ffffff00);
  457.   {$EXTERNALSYM IN_CLASSC_NET}
  458.   IN_CLASSC_NSHIFT = 8;
  459.   {$EXTERNALSYM IN_CLASSC_NSHIFT}
  460.   IN_CLASSC_HOST   = $000000ff;
  461.   {$EXTERNALSYM IN_CLASSC_HOST}
  462. function IN_CLASSD(i: DWORD): Boolean;
  463. {$EXTERNALSYM IN_CLASSD}
  464. const
  465.   IN_CLASSD_NET    = DWORD($f0000000); // These ones aren't really
  466.   {$EXTERNALSYM IN_CLASSD_NET}
  467.   IN_CLASSD_NSHIFT = 28; // net and host fields, but
  468.   {$EXTERNALSYM IN_CLASSD_NSHIFT}
  469.   IN_CLASSD_HOST   = $0fffffff; // routing needn't know.
  470.   {$EXTERNALSYM IN_CLASSD_HOST}
  471. function IN_MULTICAST(i: DWORD): Boolean;
  472. {$EXTERNALSYM IN_MULTICAST}
  473. const
  474.   INADDR_ANY       = u_long($00000000);
  475.   {$EXTERNALSYM INADDR_ANY}
  476.   INADDR_LOOPBACK  = $7f000001;
  477.   {$EXTERNALSYM INADDR_LOOPBACK}
  478.   INADDR_BROADCAST = u_long($ffffffff);
  479.   {$EXTERNALSYM INADDR_BROADCAST}
  480.   INADDR_NONE      = DWORD($ffffffff);
  481.   {$EXTERNALSYM INADDR_NONE}
  482.   ADDR_ANY         = INADDR_ANY;
  483.   {$EXTERNALSYM ADDR_ANY}
  484. //
  485. // Socket address, internet style.
  486. //
  487. type
  488.   sockaddr_in = record
  489.     sin_family: Smallint;
  490.     sin_port: u_short;
  491.     sin_addr: in_addr;
  492.     sin_zero: array [0..7] of Char;
  493.   end;
  494.   {$EXTERNALSYM sockaddr_in}
  495.   TSockAddrIn = sockaddr_in;
  496.   PSockAddrIn = ^sockaddr_in;
  497. const
  498.   WSADESCRIPTION_LEN = 256;
  499.   {$EXTERNALSYM WSADESCRIPTION_LEN}
  500.   WSASYS_STATUS_LEN  = 128;
  501.   {$EXTERNALSYM WSASYS_STATUS_LEN}
  502. type
  503.   WSAData = record
  504.     wVersion: WORD;
  505.     wHighVersion: WORD;
  506.     szDescription: array [0..WSADESCRIPTION_LEN] of Char;
  507.     szSystemStatus: array [0..WSASYS_STATUS_LEN] of Char;
  508.     iMaxSockets: Word;
  509.     iMaxUdpDg: Word;
  510.     lpVendorInfo: PChar;
  511.   end;
  512.   {$EXTERNALSYM WSAData}
  513.   LPWSADATA = ^WSAData;
  514.   {$EXTERNALSYM LPWSADATA}
  515.   TWsaData = WSAData;
  516.   PWsaData = LPWSADATA;
  517. //
  518. // Definitions related to sockets: types, address families, options,
  519. // taken from the BSD file sys/socket.h.
  520. //
  521. //
  522. // This is used instead of -1, since the
  523. // SOCKET type is unsigned.
  524. //
  525. const
  526.   INVALID_SOCKET = TSocket(not 0);
  527.   {$EXTERNALSYM INVALID_SOCKET}
  528.   SOCKET_ERROR   = -1;
  529.   {$EXTERNALSYM SOCKET_ERROR}
  530. //
  531. // The  following  may  be used in place of the address family, socket type, or
  532. // protocol  in  a  call  to WSASocket to indicate that the corresponding value
  533. // should  be taken from the supplied WSAPROTOCOL_INFO structure instead of the
  534. // parameter itself.
  535. //
  536.   FROM_PROTOCOL_INFO = -1;
  537.   {$EXTERNALSYM FROM_PROTOCOL_INFO}
  538. //
  539. // Types
  540. //
  541.   SOCK_STREAM    = 1; // stream socket
  542.   {$EXTERNALSYM SOCK_STREAM}
  543.   SOCK_DGRAM     = 2; // datagram socket
  544.   {$EXTERNALSYM SOCK_DGRAM}
  545.   SOCK_RAW       = 3; // raw-protocol interface
  546.   {$EXTERNALSYM SOCK_RAW}
  547.   SOCK_RDM       = 4; // reliably-delivered message
  548.   {$EXTERNALSYM SOCK_RDM}
  549.   SOCK_SEQPACKET = 5; // sequenced packet stream
  550.   {$EXTERNALSYM SOCK_SEQPACKET}
  551. //
  552. // Option flags per-socket.
  553. //
  554.   SO_DEBUG       = $0001; // turn on debugging info recording
  555.   {$EXTERNALSYM SO_DEBUG}
  556.   SO_ACCEPTCONN  = $0002; // socket has had listen()
  557.   {$EXTERNALSYM SO_ACCEPTCONN}
  558.   SO_REUSEADDR   = $0004; // allow local address reuse
  559.   {$EXTERNALSYM SO_REUSEADDR}
  560.   SO_KEEPALIVE   = $0008; // keep connections alive
  561.   {$EXTERNALSYM SO_KEEPALIVE}
  562.   SO_DONTROUTE   = $0010; // just use interface addresses
  563.   {$EXTERNALSYM SO_DONTROUTE}
  564.   SO_BROADCAST   = $0020; // permit sending of broadcast msgs
  565.   {$EXTERNALSYM SO_BROADCAST}
  566.   SO_USELOOPBACK = $0040; // bypass hardware when possible
  567.   {$EXTERNALSYM SO_USELOOPBACK}
  568.   SO_LINGER      = $0080; // linger on close if data present
  569.   {$EXTERNALSYM SO_LINGER}
  570.   SO_OOBINLINE   = $0100; // leave received OOB data in line
  571.   {$EXTERNALSYM SO_OOBINLINE}
  572.   SO_DONTLINGER       = DWORD(not SO_LINGER);
  573.   {$EXTERNALSYM SO_DONTLINGER}
  574.   SO_EXCLUSIVEADDRUSE = DWORD(not SO_REUSEADDR); // disallow local address reuse
  575.   {$EXTERNALSYM SO_EXCLUSIVEADDRUSE}
  576. //
  577. // Additional options.
  578. //
  579.   SO_SNDBUF   = $1001; // send buffer size
  580.   {$EXTERNALSYM SO_SNDBUF}
  581.   SO_RCVBUF   = $1002; // receive buffer size
  582.   {$EXTERNALSYM SO_RCVBUF}
  583.   SO_SNDLOWAT = $1003; // send low-water mark
  584.   {$EXTERNALSYM SO_SNDLOWAT}
  585.   SO_RCVLOWAT = $1004; // receive low-water mark
  586.   {$EXTERNALSYM SO_RCVLOWAT}
  587.   SO_SNDTIMEO = $1005; // send timeout
  588.   {$EXTERNALSYM SO_SNDTIMEO}
  589.   SO_RCVTIMEO = $1006; // receive timeout
  590.   {$EXTERNALSYM SO_RCVTIMEO}
  591.   SO_ERROR    = $1007; // get error status and clear
  592.   {$EXTERNALSYM SO_ERROR}
  593.   SO_TYPE     = $1008; // get socket type
  594.   {$EXTERNALSYM SO_TYPE}
  595. //
  596. // WinSock 2 extension -- new options
  597. //
  598.   SO_GROUP_ID       = $2001; // ID of a socket group
  599.   {$EXTERNALSYM SO_GROUP_ID}
  600.   SO_GROUP_PRIORITY = $2002; // the relative priority within a group
  601.   {$EXTERNALSYM SO_GROUP_PRIORITY}
  602.   SO_MAX_MSG_SIZE   = $2003; // maximum message size
  603.   {$EXTERNALSYM SO_MAX_MSG_SIZE}
  604.   SO_PROTOCOL_INFOA = $2004; // WSAPROTOCOL_INFOA structure
  605.   {$EXTERNALSYM SO_PROTOCOL_INFOA}
  606.   SO_PROTOCOL_INFOW = $2005; // WSAPROTOCOL_INFOW structure
  607.   {$EXTERNALSYM SO_PROTOCOL_INFOW}
  608. {$IFDEF UNICODE}
  609.   SO_PROTOCOL_INFO = SO_PROTOCOL_INFOW;
  610.   {$EXTERNALSYM SO_PROTOCOL_INFO}
  611. {$ELSE}
  612.   SO_PROTOCOL_INFO = SO_PROTOCOL_INFOA;
  613.   {$EXTERNALSYM SO_PROTOCOL_INFO}
  614. {$ENDIF}
  615.   PVD_CONFIG            = $3001; // configuration info for service provider
  616.   {$EXTERNALSYM PVD_CONFIG}
  617.   SO_CONDITIONAL_ACCEPT = $3002; // enable true conditional accept:
  618.                                  //  connection is not ack-ed to the
  619.                                  //  other side until conditional
  620.                                  //  function returns CF_ACCEPT
  621.   {$EXTERNALSYM SO_CONDITIONAL_ACCEPT}
  622. //
  623. // TCP options.
  624. //
  625.   TCP_NODELAY = $0001;
  626.   {$EXTERNALSYM TCP_NODELAY}
  627. //
  628. // Address families.
  629. //
  630.   AF_UNSPEC = 0; // unspecified
  631.   {$EXTERNALSYM AF_UNSPEC}
  632. //
  633. // Although  AF_UNSPEC  is  defined for backwards compatibility, using
  634. // AF_UNSPEC for the "af" parameter when creating a socket is STRONGLY
  635. // DISCOURAGED.    The  interpretation  of  the  "protocol"  parameter
  636. // depends  on the actual address family chosen.  As environments grow
  637. // to  include  more  and  more  address families that use overlapping
  638. // protocol  values  there  is  more  and  more  chance of choosing an
  639. // undesired address family when AF_UNSPEC is used.
  640. //
  641.   AF_UNIX      = 1; // local to host (pipes, portals
  642.   {$EXTERNALSYM AF_UNIX}
  643.   AF_INET      = 2; // internetwork: UDP, TCP, etc.
  644.   {$EXTERNALSYM AF_INET}
  645.   AF_IMPLINK   = 3; // arpanet imp addresses
  646.   {$EXTERNALSYM AF_IMPLINK}
  647.   AF_PUP       = 4; // pup protocols: e.g. BSP
  648.   {$EXTERNALSYM AF_PUP}
  649.   AF_CHAOS     = 5; // mit CHAOS protocols
  650.   {$EXTERNALSYM AF_CHAOS}
  651.   AF_NS        = 6; // XEROX NS protocols
  652.   {$EXTERNALSYM AF_NS}
  653.   AF_IPX       = AF_NS; // IPX protocols: IPX, SPX, etc.
  654.   {$EXTERNALSYM AF_IPX}
  655.   AF_ISO       = 7; // ISO protocols
  656.   {$EXTERNALSYM AF_ISO}
  657.   AF_OSI       = AF_ISO; // OSI is ISO
  658.   {$EXTERNALSYM AF_OSI}
  659.   AF_ECMA      = 8; // european computer manufacturers
  660.   {$EXTERNALSYM AF_ECMA}
  661.   AF_DATAKIT   = 9; // datakit protocols
  662.   {$EXTERNALSYM AF_DATAKIT}
  663.   AF_CCITT     = 10; // CCITT protocols, X.25 etc
  664.   {$EXTERNALSYM AF_CCITT}
  665.   AF_SNA       = 11; // IBM SNA
  666.   {$EXTERNALSYM AF_SNA}
  667.   AF_DECnet    = 12; // DECnet
  668.   {$EXTERNALSYM AF_DECnet}
  669.   AF_DLI       = 13; // Direct data link interface
  670.   {$EXTERNALSYM AF_DLI}
  671.   AF_LAT       = 14; // LAT
  672.   {$EXTERNALSYM AF_LAT}
  673.   AF_HYLINK    = 15; // NSC Hyperchannel
  674.   {$EXTERNALSYM AF_HYLINK}
  675.   AF_APPLETALK = 16; // AppleTalk
  676.   {$EXTERNALSYM AF_APPLETALK}
  677.   AF_NETBIOS   = 17; // NetBios-style addresses
  678.   {$EXTERNALSYM AF_NETBIOS}
  679.   AF_VOICEVIEW = 18; // VoiceView
  680.   {$EXTERNALSYM AF_VOICEVIEW}
  681.   AF_FIREFOX   = 19; // Protocols from Firefox
  682.   {$EXTERNALSYM AF_FIREFOX}
  683.   AF_UNKNOWN1  = 20; // Somebody is using this!
  684.   {$EXTERNALSYM AF_UNKNOWN1}
  685.   AF_BAN       = 21; // Banyan
  686.   {$EXTERNALSYM AF_BAN}
  687.   AF_ATM       = 22; // Native ATM Services
  688.   {$EXTERNALSYM AF_ATM}
  689.   AF_INET6     = 23; // Internetwork Version 6
  690.   {$EXTERNALSYM AF_INET6}
  691.   AF_CLUSTER   = 24; // Microsoft Wolfpack
  692.   {$EXTERNALSYM AF_CLUSTER}
  693.   AF_12844     = 25; // IEEE 1284.4 WG AF
  694.   {$EXTERNALSYM AF_12844}
  695.   AF_IRDA      = 26; // IrDA
  696.   {$EXTERNALSYM AF_IRDA}
  697.   AF_NETDES    = 28; // Network Designers OSI & gateway enabled protocols
  698.   {$EXTERNALSYM AF_NETDES}
  699.   AF_TCNPROCESS = 29;
  700.   {$EXTERNALSYM AF_TCNPROCESS}
  701.   AF_TCNMESSAGE = 30;
  702.   {$EXTERNALSYM AF_TCNMESSAGE}
  703.   AF_ICLFXBM    = 31;
  704.   {$EXTERNALSYM AF_ICLFXBM}
  705.   AF_MAX = 32;
  706.   {$EXTERNALSYM AF_MAX}
  707. //
  708. // Structure used by kernel to store most
  709. // addresses.
  710. //
  711. type
  712.   sockaddr = record
  713.     sa_family: u_short;              // address family
  714.     sa_data: array [0..13] of Char;            // up to 14 bytes of direct address
  715.   end;
  716.   {$EXTERNALSYM sockaddr}
  717.   TSockAddr = sockaddr;
  718.   PSockAddr = ^sockaddr;
  719. //
  720. // Portable socket structure (RFC 2553).
  721. //
  722. //
  723. // Desired design of maximum size and alignment.
  724. // These are implementation specific.
  725. //
  726. const
  727.   _SS_MAXSIZE   = 128;               // Maximum size.
  728.   {$EXTERNALSYM _SS_MAXSIZE}
  729.   _SS_ALIGNSIZE = SizeOf(Int64);  // Desired alignment.
  730.   {$EXTERNALSYM _SS_ALIGNSIZE}
  731. //
  732. // Definitions used for sockaddr_storage structure paddings design.
  733. //
  734.   _SS_PAD1SIZE = _SS_ALIGNSIZE - SizeOf(short);
  735.   {$EXTERNALSYM _SS_PAD1SIZE}
  736.   _SS_PAD2SIZE = _SS_MAXSIZE - (SizeOf(short) + _SS_PAD1SIZE + _SS_ALIGNSIZE);
  737.   {$EXTERNALSYM _SS_PAD2SIZE}
  738.   
  739. type
  740.   sockaddr_storage = record
  741.     ss_family: short;               // Address family.
  742.     __ss_pad1: array [0.._SS_PAD1SIZE - 1] of char;  // 6 byte pad, this is to make
  743.                                    // implementation specific pad up to
  744.                                    // alignment field that follows explicit
  745.                                    // in the data structure.
  746.     __ss_align: Int64;            // Field to force desired structure.
  747.     __ss_pad2: array [0.._SS_PAD2SIZE - 1] of char;  // 112 byte pad to achieve desired size;
  748.                                    // _SS_MAXSIZE value minus size of
  749.                                    // ss_family, __ss_pad1, and
  750.                                    // __ss_align fields is 112.
  751.   end;
  752.   {$EXTERNALSYM sockaddr_storage}
  753.   TSockAddrStorage = sockaddr_storage;
  754.   PSockAddrStorage = ^sockaddr_storage;
  755. //
  756. // Structure used by kernel to pass protocol
  757. // information in raw sockets.
  758. //
  759.   sockproto = record
  760.     sp_family: u_short;              // address family
  761.     sp_protocol: u_short;            // protocol
  762.   end;
  763.   {$EXTERNALSYM sockproto}
  764.   TSockProto = sockproto;
  765.   PSockProto = ^sockproto;
  766. //
  767. // Protocol families, same as address families for now.
  768. //
  769. const
  770.   PF_UNSPEC    = AF_UNSPEC;
  771.   {$EXTERNALSYM PF_UNSPEC}
  772.   PF_UNIX      = AF_UNIX;
  773.   {$EXTERNALSYM PF_UNIX}
  774.   PF_INET      = AF_INET;
  775.   {$EXTERNALSYM PF_INET}
  776.   PF_IMPLINK   = AF_IMPLINK;
  777.   {$EXTERNALSYM PF_IMPLINK}
  778.   PF_PUP       = AF_PUP;
  779.   {$EXTERNALSYM PF_PUP}
  780.   PF_CHAOS     = AF_CHAOS;
  781.   {$EXTERNALSYM PF_CHAOS}
  782.   PF_NS        = AF_NS;
  783.   {$EXTERNALSYM PF_NS}
  784.   PF_IPX       = AF_IPX;
  785.   {$EXTERNALSYM PF_IPX}
  786.   PF_ISO       = AF_ISO;
  787.   {$EXTERNALSYM PF_ISO}
  788.   PF_OSI       = AF_OSI;
  789.   {$EXTERNALSYM PF_OSI}
  790.   PF_ECMA      = AF_ECMA;
  791.   {$EXTERNALSYM PF_ECMA}
  792.   PF_DATAKIT   = AF_DATAKIT;
  793.   {$EXTERNALSYM PF_DATAKIT}
  794.   PF_CCITT     = AF_CCITT;
  795.   {$EXTERNALSYM PF_CCITT}
  796.   PF_SNA       = AF_SNA;
  797.   {$EXTERNALSYM PF_SNA}
  798.   PF_DECnet    = AF_DECnet;
  799.   {$EXTERNALSYM PF_DECnet}
  800.   PF_DLI       = AF_DLI;
  801.   {$EXTERNALSYM PF_DLI}
  802.   PF_LAT       = AF_LAT;
  803.   {$EXTERNALSYM PF_LAT}
  804.   PF_HYLINK    = AF_HYLINK;
  805.   {$EXTERNALSYM PF_HYLINK}
  806.   PF_APPLETALK = AF_APPLETALK;
  807.   {$EXTERNALSYM PF_APPLETALK}
  808.   PF_VOICEVIEW = AF_VOICEVIEW;
  809.   {$EXTERNALSYM PF_VOICEVIEW}
  810.   PF_FIREFOX   = AF_FIREFOX;
  811.   {$EXTERNALSYM PF_FIREFOX}
  812.   PF_UNKNOWN1  = AF_UNKNOWN1;
  813.   {$EXTERNALSYM PF_UNKNOWN1}
  814.   PF_BAN       = AF_BAN;
  815.   {$EXTERNALSYM PF_BAN}
  816.   PF_ATM       = AF_ATM;
  817.   {$EXTERNALSYM PF_ATM}
  818.   PF_INET6     = AF_INET6;
  819.   {$EXTERNALSYM PF_INET6}
  820.   PF_MAX = AF_MAX;
  821.   {$EXTERNALSYM PF_MAX}
  822. //
  823. // Structure used for manipulating linger option.
  824. //
  825. type
  826.   linger = record
  827.     l_onoff: u_short;                // option on/off
  828.     l_linger: u_short;               // linger time
  829.   end;
  830.   {$EXTERNALSYM linger}
  831.   TLinger = linger;
  832.   PLinger = ^linger;
  833. //
  834. // Level number for (get/set)sockopt() to apply to socket itself.
  835. //
  836. const
  837.   SOL_SOCKET = $ffff; // options for socket level
  838.   {$EXTERNALSYM SOL_SOCKET}
  839. //
  840. // Maximum queue length specifiable by listen.
  841. //
  842.   SOMAXCONN = $7fffffff;
  843.   {$EXTERNALSYM SOMAXCONN}
  844.   MSG_OOB       = $1; // process out-of-band data
  845.   {$EXTERNALSYM MSG_OOB}
  846.   MSG_PEEK      = $2; // peek at incoming message
  847.   {$EXTERNALSYM MSG_PEEK}
  848.   MSG_DONTROUTE = $4; // send without using routing tables
  849.   {$EXTERNALSYM MSG_DONTROUTE}
  850.   MSG_PARTIAL   = $8000; // partial send or recv for message xport
  851.   {$EXTERNALSYM MSG_PARTIAL}
  852. //
  853. // WinSock 2 extension -- new flags for WSASend(), WSASendTo(), WSARecv() and
  854. //                          WSARecvFrom()
  855. //
  856.   MSG_INTERRUPT = $10; // send/recv in the interrupt context
  857.   {$EXTERNALSYM MSG_INTERRUPT}
  858.   MSG_MAXIOVLEN = 16;
  859.   {$EXTERNALSYM MSG_MAXIOVLEN}
  860. //
  861. // Define constant based on rfc883, used by gethostbyxxxx() calls.
  862. //
  863.   MAXGETHOSTSTRUCT = 1024;
  864.   {$EXTERNALSYM MAXGETHOSTSTRUCT}
  865. //
  866. // WinSock 2 extension -- bit values and indices for FD_XXX network events
  867. //
  868.   FD_READ_BIT                     = 0;
  869.   {$EXTERNALSYM FD_READ_BIT}
  870.   FD_READ                         = (1 shl FD_READ_BIT);
  871.   {$EXTERNALSYM FD_READ}
  872.   FD_WRITE_BIT                    = 1;
  873.   {$EXTERNALSYM FD_WRITE_BIT}
  874.   FD_WRITE                        = (1 shl FD_WRITE_BIT);
  875.   {$EXTERNALSYM FD_WRITE}
  876.   FD_OOB_BIT                      = 2;
  877.   {$EXTERNALSYM FD_OOB_BIT}
  878.   FD_OOB                          = (1 shl FD_OOB_BIT);
  879.   {$EXTERNALSYM FD_OOB}
  880.   FD_ACCEPT_BIT                   = 3;
  881.   {$EXTERNALSYM FD_ACCEPT_BIT}
  882.   FD_ACCEPT                       = (1 shl FD_ACCEPT_BIT);
  883.   {$EXTERNALSYM FD_ACCEPT}
  884.   FD_CONNECT_BIT                  = 4;
  885.   {$EXTERNALSYM FD_CONNECT_BIT}
  886.   FD_CONNECT                      = (1 shl FD_CONNECT_BIT);
  887.   {$EXTERNALSYM FD_CONNECT}
  888.   FD_CLOSE_BIT                    = 5;
  889.   {$EXTERNALSYM FD_CLOSE_BIT}
  890.   FD_CLOSE                        = (1 shl FD_CLOSE_BIT);
  891.   {$EXTERNALSYM FD_CLOSE}
  892.   FD_QOS_BIT                      = 6;
  893.   {$EXTERNALSYM FD_QOS_BIT}
  894.   FD_QOS                          = (1 shl FD_QOS_BIT);
  895.   {$EXTERNALSYM FD_QOS}
  896.   FD_GROUP_QOS_BIT                = 7;
  897.   {$EXTERNALSYM FD_GROUP_QOS_BIT}
  898.   FD_GROUP_QOS                    = (1 shl FD_GROUP_QOS_BIT);
  899.   {$EXTERNALSYM FD_GROUP_QOS}
  900.   FD_ROUTING_INTERFACE_CHANGE_BIT = 8;
  901.   {$EXTERNALSYM FD_ROUTING_INTERFACE_CHANGE_BIT}
  902.   FD_ROUTING_INTERFACE_CHANGE     = (1 shl FD_ROUTING_INTERFACE_CHANGE_BIT);
  903.   {$EXTERNALSYM FD_ROUTING_INTERFACE_CHANGE}
  904.   FD_ADDRESS_LIST_CHANGE_BIT      = 9;
  905.   {$EXTERNALSYM FD_ADDRESS_LIST_CHANGE_BIT}
  906.   FD_ADDRESS_LIST_CHANGE          = (1 shl FD_ADDRESS_LIST_CHANGE_BIT);
  907.   {$EXTERNALSYM FD_ADDRESS_LIST_CHANGE}
  908.   FD_MAX_EVENTS                   = 10;
  909.   {$EXTERNALSYM FD_MAX_EVENTS}
  910.   FD_ALL_EVENTS                   = ((1 shl FD_MAX_EVENTS) - 1);
  911.   {$EXTERNALSYM FD_ALL_EVENTS}
  912. //
  913. // All Windows Sockets error constants are biased by WSABASEERR from
  914. // the "normal"
  915. //
  916.   WSABASEERR = 10000;
  917.   {$EXTERNALSYM WSABASEERR}
  918. //
  919. // Windows Sockets definitions of regular Microsoft C error constants
  920. //
  921.   WSAEINTR  = (WSABASEERR+4);
  922.   {$EXTERNALSYM WSAEINTR}
  923.   WSAEBADF  = (WSABASEERR+9);
  924.   {$EXTERNALSYM WSAEBADF}
  925.   WSAEACCES = (WSABASEERR+13);
  926.   {$EXTERNALSYM WSAEACCES}
  927.   WSAEFAULT = (WSABASEERR+14);
  928.   {$EXTERNALSYM WSAEFAULT}
  929.   WSAEINVAL = (WSABASEERR+22);
  930.   {$EXTERNALSYM WSAEINVAL}
  931.   WSAEMFILE = (WSABASEERR+24);
  932.   {$EXTERNALSYM WSAEMFILE}
  933. //
  934. // Windows Sockets definitions of regular Berkeley error constants
  935. //
  936.   WSAEWOULDBLOCK     = (WSABASEERR+35);
  937.   {$EXTERNALSYM WSAEWOULDBLOCK}
  938.   WSAEINPROGRESS     = (WSABASEERR+36);
  939.   {$EXTERNALSYM WSAEINPROGRESS}
  940.   WSAEALREADY        = (WSABASEERR+37);
  941.   {$EXTERNALSYM WSAEALREADY}
  942.   WSAENOTSOCK        = (WSABASEERR+38);
  943.   {$EXTERNALSYM WSAENOTSOCK}
  944.   WSAEDESTADDRREQ    = (WSABASEERR+39);
  945.   {$EXTERNALSYM WSAEDESTADDRREQ}
  946.   WSAEMSGSIZE        = (WSABASEERR+40);
  947.   {$EXTERNALSYM WSAEMSGSIZE}
  948.   WSAEPROTOTYPE      = (WSABASEERR+41);
  949.   {$EXTERNALSYM WSAEPROTOTYPE}
  950.   WSAENOPROTOOPT     = (WSABASEERR+42);
  951.   {$EXTERNALSYM WSAENOPROTOOPT}
  952.   WSAEPROTONOSUPPORT = (WSABASEERR+43);
  953.   {$EXTERNALSYM WSAEPROTONOSUPPORT}
  954.   WSAESOCKTNOSUPPORT = (WSABASEERR+44);
  955.   {$EXTERNALSYM WSAESOCKTNOSUPPORT}
  956.   WSAEOPNOTSUPP      = (WSABASEERR+45);
  957.   {$EXTERNALSYM WSAEOPNOTSUPP}
  958.   WSAEPFNOSUPPORT    = (WSABASEERR+46);
  959.   {$EXTERNALSYM WSAEPFNOSUPPORT}
  960.   WSAEAFNOSUPPORT    = (WSABASEERR+47);
  961.   {$EXTERNALSYM WSAEAFNOSUPPORT}
  962.   WSAEADDRINUSE      = (WSABASEERR+48);
  963.   {$EXTERNALSYM WSAEADDRINUSE}
  964.   WSAEADDRNOTAVAIL   = (WSABASEERR+49);
  965.   {$EXTERNALSYM WSAEADDRNOTAVAIL}
  966.   WSAENETDOWN        = (WSABASEERR+50);
  967.   {$EXTERNALSYM WSAENETDOWN}
  968.   WSAENETUNREACH     = (WSABASEERR+51);
  969.   {$EXTERNALSYM WSAENETUNREACH}
  970.   WSAENETRESET       = (WSABASEERR+52);
  971.   {$EXTERNALSYM WSAENETRESET}
  972.   WSAECONNABORTED    = (WSABASEERR+53);
  973.   {$EXTERNALSYM WSAECONNABORTED}
  974.   WSAECONNRESET      = (WSABASEERR+54);
  975.   {$EXTERNALSYM WSAECONNRESET}
  976.   WSAENOBUFS         = (WSABASEERR+55);
  977.   {$EXTERNALSYM WSAENOBUFS}
  978.   WSAEISCONN         = (WSABASEERR+56);
  979.   {$EXTERNALSYM WSAEISCONN}
  980.   WSAENOTCONN        = (WSABASEERR+57);
  981.   {$EXTERNALSYM WSAENOTCONN}
  982.   WSAESHUTDOWN       = (WSABASEERR+58);
  983.   {$EXTERNALSYM WSAESHUTDOWN}
  984.   WSAETOOMANYREFS    = (WSABASEERR+59);
  985.   {$EXTERNALSYM WSAETOOMANYREFS}
  986.   WSAETIMEDOUT       = (WSABASEERR+60);
  987.   {$EXTERNALSYM WSAETIMEDOUT}
  988.   WSAECONNREFUSED    = (WSABASEERR+61);
  989.   {$EXTERNALSYM WSAECONNREFUSED}
  990.   WSAELOOP           = (WSABASEERR+62);
  991.   {$EXTERNALSYM WSAELOOP}
  992.   WSAENAMETOOLONG    = (WSABASEERR+63);
  993.   {$EXTERNALSYM WSAENAMETOOLONG}
  994.   WSAEHOSTDOWN       = (WSABASEERR+64);
  995.   {$EXTERNALSYM WSAEHOSTDOWN}
  996.   WSAEHOSTUNREACH    = (WSABASEERR+65);
  997.   {$EXTERNALSYM WSAEHOSTUNREACH}
  998.   WSAENOTEMPTY       = (WSABASEERR+66);
  999.   {$EXTERNALSYM WSAENOTEMPTY}
  1000.   WSAEPROCLIM        = (WSABASEERR+67);
  1001.   {$EXTERNALSYM WSAEPROCLIM}
  1002.   WSAEUSERS          = (WSABASEERR+68);
  1003.   {$EXTERNALSYM WSAEUSERS}
  1004.   WSAEDQUOT          = (WSABASEERR+69);
  1005.   {$EXTERNALSYM WSAEDQUOT}
  1006.   WSAESTALE          = (WSABASEERR+70);
  1007.   {$EXTERNALSYM WSAESTALE}
  1008.   WSAEREMOTE         = (WSABASEERR+71);
  1009.   {$EXTERNALSYM WSAEREMOTE}
  1010. //
  1011. // Extended Windows Sockets error constant definitions
  1012. //
  1013.   WSASYSNOTREADY         = (WSABASEERR+91);
  1014.   {$EXTERNALSYM WSASYSNOTREADY}
  1015.   WSAVERNOTSUPPORTED     = (WSABASEERR+92);
  1016.   {$EXTERNALSYM WSAVERNOTSUPPORTED}
  1017.   WSANOTINITIALISED      = (WSABASEERR+93);
  1018.   {$EXTERNALSYM WSANOTINITIALISED}
  1019.   WSAEDISCON             = (WSABASEERR+101);
  1020.   {$EXTERNALSYM WSAEDISCON}
  1021.   WSAENOMORE             = (WSABASEERR+102);
  1022.   {$EXTERNALSYM WSAENOMORE}
  1023.   WSAECANCELLED          = (WSABASEERR+103);
  1024.   {$EXTERNALSYM WSAECANCELLED}
  1025.   WSAEINVALIDPROCTABLE   = (WSABASEERR+104);
  1026.   {$EXTERNALSYM WSAEINVALIDPROCTABLE}
  1027.   WSAEINVALIDPROVIDER    = (WSABASEERR+105);
  1028.   {$EXTERNALSYM WSAEINVALIDPROVIDER}
  1029.   WSAEPROVIDERFAILEDINIT = (WSABASEERR+106);
  1030.   {$EXTERNALSYM WSAEPROVIDERFAILEDINIT}
  1031.   WSASYSCALLFAILURE      = (WSABASEERR+107);
  1032.   {$EXTERNALSYM WSASYSCALLFAILURE}
  1033.   WSASERVICE_NOT_FOUND   = (WSABASEERR+108);
  1034.   {$EXTERNALSYM WSASERVICE_NOT_FOUND}
  1035.   WSATYPE_NOT_FOUND      = (WSABASEERR+109);
  1036.   {$EXTERNALSYM WSATYPE_NOT_FOUND}
  1037.   WSA_E_NO_MORE          = (WSABASEERR+110);
  1038.   {$EXTERNALSYM WSA_E_NO_MORE}
  1039.   WSA_E_CANCELLED        = (WSABASEERR+111);
  1040.   {$EXTERNALSYM WSA_E_CANCELLED}
  1041.   WSAEREFUSED            = (WSABASEERR+112);
  1042.   {$EXTERNALSYM WSAEREFUSED}
  1043. //
  1044. // Error return codes from gethostbyname() and gethostbyaddr()
  1045. // (when using the resolver). Note that these errors are
  1046. // retrieved via WSAGetLastError() and must therefore follow
  1047. // the rules for avoiding clashes with error numbers from
  1048. // specific implementations or language run-time systems.
  1049. // For this reason the codes are based at WSABASEERR+1001.
  1050. // Note also that [WSA]NO_ADDRESS is defined only for
  1051. // compatibility purposes.
  1052. //
  1053. // Authoritative Answer: Host not found
  1054.   WSAHOST_NOT_FOUND = (WSABASEERR+1001);
  1055.   {$EXTERNALSYM WSAHOST_NOT_FOUND}
  1056. // Non-Authoritative: Host not found, or SERVERFAIL
  1057.   WSATRY_AGAIN = (WSABASEERR+1002);
  1058.   {$EXTERNALSYM WSATRY_AGAIN}
  1059. // Non-recoverable errors, FORMERR, REFUSED, NOTIMP
  1060.   WSANO_RECOVERY = (WSABASEERR+1003);
  1061.   {$EXTERNALSYM WSANO_RECOVERY}
  1062. // Valid name, no data record of requested type
  1063.   WSANO_DATA = (WSABASEERR+1004);
  1064.   {$EXTERNALSYM WSANO_DATA}
  1065. //
  1066. // Define QOS related error return codes
  1067. //
  1068. //
  1069.   WSA_QOS_RECEIVERS          = (WSABASEERR + 1005); // at least one Reserve has arrived
  1070.   {$EXTERNALSYM WSA_QOS_RECEIVERS}
  1071.   WSA_QOS_SENDERS            = (WSABASEERR + 1006); // at least one Path has arrived
  1072.   {$EXTERNALSYM WSA_QOS_SENDERS}
  1073.   WSA_QOS_NO_SENDERS         = (WSABASEERR + 1007); // there are no senders
  1074.   {$EXTERNALSYM WSA_QOS_NO_SENDERS}
  1075.   WSA_QOS_NO_RECEIVERS       = (WSABASEERR + 1008); // there are no receivers
  1076.   {$EXTERNALSYM WSA_QOS_NO_RECEIVERS}
  1077.   WSA_QOS_REQUEST_CONFIRMED  = (WSABASEERR + 1009); // Reserve has been confirmed
  1078.   {$EXTERNALSYM WSA_QOS_REQUEST_CONFIRMED}
  1079.   WSA_QOS_ADMISSION_FAILURE  = (WSABASEERR + 1010); // error due to lack of resources
  1080.   {$EXTERNALSYM WSA_QOS_ADMISSION_FAILURE}
  1081.   WSA_QOS_POLICY_FAILURE     = (WSABASEERR + 1011); // rejected for administrative reasons - bad credentials
  1082.   {$EXTERNALSYM WSA_QOS_POLICY_FAILURE}
  1083.   WSA_QOS_BAD_STYLE          = (WSABASEERR + 1012); // unknown or conflicting style
  1084.   {$EXTERNALSYM WSA_QOS_BAD_STYLE}
  1085.   WSA_QOS_BAD_OBJECT         = (WSABASEERR + 1013); // problem with some part of the filterspec or providerspecific buffer in general
  1086.   {$EXTERNALSYM WSA_QOS_BAD_OBJECT}
  1087.   WSA_QOS_TRAFFIC_CTRL_ERROR = (WSABASEERR + 1014); // problem with some part of the flowspec
  1088.   {$EXTERNALSYM WSA_QOS_TRAFFIC_CTRL_ERROR}
  1089.   WSA_QOS_GENERIC_ERROR      = (WSABASEERR + 1015); // general error
  1090.   {$EXTERNALSYM WSA_QOS_GENERIC_ERROR}
  1091.   WSA_QOS_ESERVICETYPE       = (WSABASEERR + 1016); // invalid service type in flowspec
  1092.   {$EXTERNALSYM WSA_QOS_ESERVICETYPE}
  1093.   WSA_QOS_EFLOWSPEC          = (WSABASEERR + 1017); // invalid flowspec
  1094.   {$EXTERNALSYM WSA_QOS_EFLOWSPEC}
  1095.   WSA_QOS_EPROVSPECBUF       = (WSABASEERR + 1018); // invalid provider specific buffer
  1096.   {$EXTERNALSYM WSA_QOS_EPROVSPECBUF}
  1097.   WSA_QOS_EFILTERSTYLE       = (WSABASEERR + 1019); // invalid filter style
  1098.   {$EXTERNALSYM WSA_QOS_EFILTERSTYLE}
  1099.   WSA_QOS_EFILTERTYPE        = (WSABASEERR + 1020); // invalid filter type
  1100.   {$EXTERNALSYM WSA_QOS_EFILTERTYPE}
  1101.   WSA_QOS_EFILTERCOUNT       = (WSABASEERR + 1021); // incorrect number of filters
  1102.   {$EXTERNALSYM WSA_QOS_EFILTERCOUNT}
  1103.   WSA_QOS_EOBJLENGTH         = (WSABASEERR + 1022); // invalid object length
  1104.   {$EXTERNALSYM WSA_QOS_EOBJLENGTH}
  1105.   WSA_QOS_EFLOWCOUNT         = (WSABASEERR + 1023); // incorrect number of flows
  1106.   {$EXTERNALSYM WSA_QOS_EFLOWCOUNT}
  1107.   WSA_QOS_EUNKOWNPSOBJ       = (WSABASEERR + 1024); // unknown object in provider specific buffer
  1108.   {$EXTERNALSYM WSA_QOS_EUNKOWNPSOBJ}
  1109.   WSA_QOS_EPOLICYOBJ         = (WSABASEERR + 1025); // invalid policy object in provider specific buffer
  1110.   {$EXTERNALSYM WSA_QOS_EPOLICYOBJ}
  1111.   WSA_QOS_EFLOWDESC          = (WSABASEERR + 1026); // invalid flow descriptor in the list
  1112.   {$EXTERNALSYM WSA_QOS_EFLOWDESC}
  1113.   WSA_QOS_EPSFLOWSPEC        = (WSABASEERR + 1027); // inconsistent flow spec in provider specific buffer
  1114.   {$EXTERNALSYM WSA_QOS_EPSFLOWSPEC}
  1115.   WSA_QOS_EPSFILTERSPEC      = (WSABASEERR + 1028); // invalid filter spec in provider specific buffer
  1116.   {$EXTERNALSYM WSA_QOS_EPSFILTERSPEC}
  1117.   WSA_QOS_ESDMODEOBJ         = (WSABASEERR + 1029); // invalid shape discard mode object in provider specific buffer
  1118.   {$EXTERNALSYM WSA_QOS_ESDMODEOBJ}
  1119.   WSA_QOS_ESHAPERATEOBJ      = (WSABASEERR + 1030); // invalid shaping rate object in provider specific buffer
  1120.   {$EXTERNALSYM WSA_QOS_ESHAPERATEOBJ}
  1121.   WSA_QOS_RESERVED_PETYPE    = (WSABASEERR + 1031); // reserved policy element in provider specific buffer
  1122.   {$EXTERNALSYM WSA_QOS_RESERVED_PETYPE}
  1123. //
  1124. // Compatibility macros.
  1125. //
  1126. function h_errno: Integer;
  1127. {$EXTERNALSYM h_errno}
  1128. const
  1129.   HOST_NOT_FOUND = WSAHOST_NOT_FOUND;
  1130.   {$EXTERNALSYM HOST_NOT_FOUND}
  1131.   TRY_AGAIN      = WSATRY_AGAIN;
  1132.   {$EXTERNALSYM TRY_AGAIN}
  1133.   NO_RECOVERY    = WSANO_RECOVERY;
  1134.   {$EXTERNALSYM NO_RECOVERY}
  1135.   NO_DATA        = WSANO_DATA;
  1136.   {$EXTERNALSYM NO_DATA}
  1137. // no address, look for MX record
  1138.   WSANO_ADDRESS = WSANO_DATA;
  1139.   {$EXTERNALSYM WSANO_ADDRESS}
  1140.   NO_ADDRESS    = WSANO_ADDRESS;
  1141.   {$EXTERNALSYM NO_ADDRESS}
  1142. //
  1143. // Windows Sockets errors redefined as regular Berkeley error constants.
  1144. // These are commented out in Windows NT to avoid conflicts with errno.h.
  1145. // Use the WSA constants instead.
  1146. //
  1147. {$IFDEF FALSE}
  1148. const
  1149.   EWOULDBLOCK     = WSAEWOULDBLOCK;
  1150.   {$EXTERNALSYM EWOULDBLOCK}
  1151.   EINPROGRESS     = WSAEINPROGRESS;
  1152.   {$EXTERNALSYM EINPROGRESS}
  1153.   EALREADY        = WSAEALREADY;
  1154.   {$EXTERNALSYM EALREADY}
  1155.   ENOTSOCK        = WSAENOTSOCK;
  1156.   {$EXTERNALSYM ENOTSOCK}
  1157.   EDESTADDRREQ    = WSAEDESTADDRREQ;
  1158.   {$EXTERNALSYM EDESTADDRREQ}
  1159.   EMSGSIZE        = WSAEMSGSIZE;
  1160.   {$EXTERNALSYM EMSGSIZE}
  1161.   EPROTOTYPE      = WSAEPROTOTYPE;
  1162.   {$EXTERNALSYM EPROTOTYPE}
  1163.   ENOPROTOOPT     = WSAENOPROTOOPT;
  1164.   {$EXTERNALSYM ENOPROTOOPT}
  1165.   EPROTONOSUPPORT = WSAEPROTONOSUPPORT;
  1166.   {$EXTERNALSYM EPROTONOSUPPORT}
  1167.   ESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT;
  1168.   {$EXTERNALSYM ESOCKTNOSUPPORT}
  1169.   EOPNOTSUPP      = WSAEOPNOTSUPP;
  1170.   {$EXTERNALSYM EOPNOTSUPP}
  1171.   EPFNOSUPPORT    = WSAEPFNOSUPPORT;
  1172.   {$EXTERNALSYM EPFNOSUPPORT}
  1173.   EAFNOSUPPORT    = WSAEAFNOSUPPORT;
  1174.   {$EXTERNALSYM EAFNOSUPPORT}
  1175.   EADDRINUSE      = WSAEADDRINUSE;
  1176.   {$EXTERNALSYM EADDRINUSE}
  1177.   EADDRNOTAVAIL   = WSAEADDRNOTAVAIL;
  1178.   {$EXTERNALSYM EADDRNOTAVAIL}
  1179.   ENETDOWN        = WSAENETDOWN;
  1180.   {$EXTERNALSYM ENETDOWN}
  1181.   ENETUNREACH     = WSAENETUNREACH;
  1182.   {$EXTERNALSYM ENETUNREACH}
  1183.   ENETRESET       = WSAENETRESET;
  1184.   {$EXTERNALSYM ENETRESET}
  1185.   ECONNABORTED    = WSAECONNABORTED;
  1186.   {$EXTERNALSYM ECONNABORTED}
  1187.   ECONNRESET      = WSAECONNRESET;
  1188.   {$EXTERNALSYM ECONNRESET}
  1189.   ENOBUFS         = WSAENOBUFS;
  1190.   {$EXTERNALSYM ENOBUFS}
  1191.   EISCONN         = WSAEISCONN;
  1192.   {$EXTERNALSYM EISCONN}
  1193.   ENOTCONN        = WSAENOTCONN;
  1194.   {$EXTERNALSYM ENOTCONN}
  1195.   ESHUTDOWN       = WSAESHUTDOWN;
  1196.   {$EXTERNALSYM ESHUTDOWN}
  1197.   ETOOMANYREFS    = WSAETOOMANYREFS;
  1198.   {$EXTERNALSYM ETOOMANYREFS}
  1199.   ETIMEDOUT       = WSAETIMEDOUT;
  1200.   {$EXTERNALSYM ETIMEDOUT}
  1201.   ECONNREFUSED    = WSAECONNREFUSED;
  1202.   {$EXTERNALSYM ECONNREFUSED}
  1203.   ELOOP           = WSAELOOP;
  1204.   {$EXTERNALSYM ELOOP}
  1205.   ENAMETOOLONG    = WSAENAMETOOLONG;
  1206.   {$EXTERNALSYM ENAMETOOLONG}
  1207.   EHOSTDOWN       = WSAEHOSTDOWN;
  1208.   {$EXTERNALSYM EHOSTDOWN}
  1209.   EHOSTUNREACH    = WSAEHOSTUNREACH;
  1210.   {$EXTERNALSYM EHOSTUNREACH}
  1211.   ENOTEMPTY       = WSAENOTEMPTY;
  1212.   {$EXTERNALSYM ENOTEMPTY}
  1213.   EPROCLIM        = WSAEPROCLIM;
  1214.   {$EXTERNALSYM EPROCLIM}
  1215.   EUSERS          = WSAEUSERS;
  1216.   {$EXTERNALSYM EUSERS}
  1217.   EDQUOT          = WSAEDQUOT;
  1218.   {$EXTERNALSYM EDQUOT}
  1219.   ESTALE          = WSAESTALE;
  1220.   {$EXTERNALSYM ESTALE}
  1221.   EREMOTE         = WSAEREMOTE;
  1222.   {$EXTERNALSYM EREMOTE}
  1223. {$ENDIF}
  1224. //
  1225. // WinSock 2 extension -- new error codes and type definition
  1226. //
  1227. type
  1228.   WSAEVENT = HANDLE;
  1229.   {$EXTERNALSYM WSAEVENT}
  1230.   LPWSAEVENT = LPHANDLE;
  1231.   {$EXTERNALSYM LPWSAEVENT}
  1232.   WSAOVERLAPPED = OVERLAPPED;
  1233.   {$EXTERNALSYM WSAOVERLAPPED}
  1234.   LPWSAOVERLAPPED = ^OVERLAPPED;
  1235.   {$EXTERNALSYM LPWSAOVERLAPPED}
  1236.   TWsaEvent = WSAEVENT;
  1237.   PWsaEvent = LPWSAEVENT;
  1238.   TWsaOverlapped = WSAOVERLAPPED;
  1239.   PWsaOverlapped = LPWSAOVERLAPPED;
  1240. const
  1241.   WSA_IO_PENDING        = (ERROR_IO_PENDING);
  1242.   {$EXTERNALSYM WSA_IO_PENDING}
  1243.   WSA_IO_INCOMPLETE     = (ERROR_IO_INCOMPLETE);
  1244.   {$EXTERNALSYM WSA_IO_INCOMPLETE}
  1245.   WSA_INVALID_HANDLE    = (ERROR_INVALID_HANDLE);
  1246.   {$EXTERNALSYM WSA_INVALID_HANDLE}
  1247.   WSA_INVALID_PARAMETER = (ERROR_INVALID_PARAMETER);
  1248.   {$EXTERNALSYM WSA_INVALID_PARAMETER}
  1249.   WSA_NOT_ENOUGH_MEMORY = (ERROR_NOT_ENOUGH_MEMORY);
  1250.   {$EXTERNALSYM WSA_NOT_ENOUGH_MEMORY}
  1251.   WSA_OPERATION_ABORTED = (ERROR_OPERATION_ABORTED);
  1252.   {$EXTERNALSYM WSA_OPERATION_ABORTED}
  1253.   WSA_INVALID_EVENT       = WSAEVENT(nil);
  1254.   {$EXTERNALSYM WSA_INVALID_EVENT}
  1255.   WSA_MAXIMUM_WAIT_EVENTS = (MAXIMUM_WAIT_OBJECTS);
  1256.   {$EXTERNALSYM WSA_MAXIMUM_WAIT_EVENTS}
  1257.   WSA_WAIT_FAILED         = (WAIT_FAILED);
  1258.   {$EXTERNALSYM WSA_WAIT_FAILED}
  1259.   WSA_WAIT_EVENT_0        = (WAIT_OBJECT_0);
  1260.   {$EXTERNALSYM WSA_WAIT_EVENT_0}
  1261.   WSA_WAIT_IO_COMPLETION  = (WAIT_IO_COMPLETION);
  1262.   {$EXTERNALSYM WSA_WAIT_IO_COMPLETION}
  1263.   WSA_WAIT_TIMEOUT        = (WAIT_TIMEOUT);
  1264.   {$EXTERNALSYM WSA_WAIT_TIMEOUT}
  1265.   WSA_INFINITE            = (INFINITE);
  1266.   {$EXTERNALSYM WSA_INFINITE}
  1267. //
  1268. // WinSock 2 extension -- WSABUF and QOS struct, include qos.h
  1269. // to pull in FLOWSPEC and related definitions
  1270. //
  1271. type
  1272.   _WSABUF = record
  1273.     len: u_long;     // the length of the buffer
  1274.     buf: PChar;      // the pointer to the buffer
  1275.   end;
  1276.   {$EXTERNALSYM _WSABUF}
  1277.   WSABUF = _WSABUF;
  1278.   {$EXTERNALSYM WSABUF}
  1279.   LPWSABUF = ^_WSABUF;
  1280.   {$EXTERNALSYM LPWSABUF}
  1281.   TWsaBuf = WSABUF;
  1282.   PWsaBuf = LPWSABUF;
  1283.   _QualityOfService = record
  1284.     SendingFlowspec: FLOWSPEC;       // the flow spec for data sending
  1285.     ReceivingFlowspec: FLOWSPEC;     // the flow spec for data receiving
  1286.     ProviderSpecific: WSABUF;        // additional provider specific stuff
  1287.   end;
  1288.   {$EXTERNALSYM _QualityOfService}
  1289.   QOS = _QualityOfService;
  1290.   {$EXTERNALSYM QOS}
  1291.   LPQOS = ^_QualityOfService;
  1292.   {$EXTERNALSYM LPQOS}
  1293.   TQOS = QOS;
  1294.   PQOS = LPQOS;
  1295. //
  1296. // WinSock 2 extension -- manifest constants for return values of the condition function
  1297. //
  1298. const
  1299.   CF_ACCEPT = $0000;
  1300.   {$EXTERNALSYM CF_ACCEPT}
  1301.   CF_REJECT = $0001;
  1302.   {$EXTERNALSYM CF_REJECT}
  1303.   CF_DEFER  = $0002;
  1304.   {$EXTERNALSYM CF_DEFER}
  1305. //
  1306. // WinSock 2 extension -- manifest constants for shutdown()
  1307. //
  1308.   SD_RECEIVE = $00;
  1309.   {$EXTERNALSYM SD_RECEIVE}
  1310.   SD_SEND    = $01;
  1311.   {$EXTERNALSYM SD_SEND}
  1312.   SD_BOTH    = $02;
  1313.   {$EXTERNALSYM SD_BOTH}
  1314. //
  1315. // WinSock 2 extension -- data type and manifest constants for socket groups
  1316. //
  1317. type
  1318.   GROUP = Cardinal;
  1319.   {$EXTERNALSYM GROUP}
  1320.   TGroup = GROUP;
  1321.   PGroup = ^GROUP;
  1322. const
  1323.   SG_UNCONSTRAINED_GROUP = $01;
  1324.   {$EXTERNALSYM SG_UNCONSTRAINED_GROUP}
  1325.   SG_CONSTRAINED_GROUP   = $02;
  1326.   {$EXTERNALSYM SG_CONSTRAINED_GROUP}
  1327. //
  1328. // WinSock 2 extension -- data type for WSAEnumNetworkEvents()
  1329. //
  1330. type
  1331.   _WSANETWORKEVENTS = record
  1332.     lNetworkEvents: Longint;
  1333.     iErrorCode: array [0..FD_MAX_EVENTS - 1] of Integer;
  1334.   end;
  1335.   {$EXTERNALSYM _WSANETWORKEVENTS}
  1336.   WSANETWORKEVENTS = _WSANETWORKEVENTS;
  1337.   {$EXTERNALSYM WSANETWORKEVENTS}
  1338.   LPWSANETWORKEVENTS = ^WSANETWORKEVENTS;
  1339.   {$EXTERNALSYM LPWSANETWORKEVENTS}
  1340.   TWsaNetworkEvents = WSANETWORKEVENTS;
  1341.   PWsaNetworkEvents = LPWSANETWORKEVENTS;
  1342. //
  1343. // WinSock 2 extension -- WSAPROTOCOL_INFO structure and associated
  1344. // manifest constants
  1345. //
  1346. const
  1347.   MAX_PROTOCOL_CHAIN = 7;
  1348.   {$EXTERNALSYM MAX_PROTOCOL_CHAIN}
  1349.   BASE_PROTOCOL    = 1;
  1350.   {$EXTERNALSYM BASE_PROTOCOL}
  1351.   LAYERED_PROTOCOL = 0;
  1352.   {$EXTERNALSYM LAYERED_PROTOCOL}
  1353. type
  1354.   _WSAPROTOCOLCHAIN = record
  1355.     ChainLen: Integer;                            // the length of the chain,
  1356.                                                   // length = 0 means layered protocol,
  1357.                                                   // length = 1 means base protocol,
  1358.                                                   // length > 1 means protocol chain
  1359.     ChainEntries: array [0..MAX_PROTOCOL_CHAIN - 1] of DWORD; // a list of dwCatalogEntryIds
  1360.   end;
  1361.   {$EXTERNALSYM _WSAPROTOCOLCHAIN}
  1362.   WSAPROTOCOLCHAIN = _WSAPROTOCOLCHAIN;
  1363.   {$EXTERNALSYM WSAPROTOCOLCHAIN}
  1364.   LPWSAPROTOCOLCHAIN = ^WSAPROTOCOLCHAIN;
  1365.   {$EXTERNALSYM LPWSAPROTOCOLCHAIN}
  1366.   TWsaProtocolChain = WSAPROTOCOLCHAIN;
  1367.   PWsaProtocolChain = LPWSAPROTOCOLCHAIN;
  1368. const
  1369.   WSAPROTOCOL_LEN = 255;
  1370.   {$EXTERNALSYM WSAPROTOCOL_LEN}
  1371. type
  1372.   _WSAPROTOCOL_INFOA = record
  1373.     dwServiceFlags1: DWORD;
  1374.     dwServiceFlags2: DWORD;
  1375.     dwServiceFlags3: DWORD;
  1376.     dwServiceFlags4: DWORD;
  1377.     dwProviderFlags: DWORD;
  1378.     ProviderId: TGUID;
  1379.     dwCatalogEntryId: DWORD;
  1380.     ProtocolChain: WSAPROTOCOLCHAIN;
  1381.     iVersion: Integer;
  1382.     iAddressFamily: Integer;
  1383.     iMaxSockAddr: Integer;
  1384.     iMinSockAddr: Integer;
  1385.     iSocketType: Integer;
  1386.     iProtocol: Integer;
  1387.     iProtocolMaxOffset: Integer;
  1388.     iNetworkByteOrder: Integer;
  1389.     iSecurityScheme: Integer;
  1390.     dwMessageSize: DWORD;
  1391.     dwProviderReserved: DWORD;
  1392.     szProtocol: array [0..WSAPROTOCOL_LEN] of Char;
  1393.   end;
  1394.   {$EXTERNALSYM _WSAPROTOCOL_INFOA}
  1395.   WSAPROTOCOL_INFOA = _WSAPROTOCOL_INFOA;
  1396.   {$EXTERNALSYM WSAPROTOCOL_INFOA}
  1397.   LPWSAPROTOCOL_INFOA = ^WSAPROTOCOL_INFOA;
  1398.   {$EXTERNALSYM LPWSAPROTOCOL_INFOA}
  1399.   TWsaProtocolInfoA = WSAPROTOCOL_INFOA;
  1400.   PWsaProtocolInfoA = LPWSAPROTOCOL_INFOA;
  1401.   _WSAPROTOCOL_INFOW = record
  1402.     dwServiceFlags1: DWORD;
  1403.     dwServiceFlags2: DWORD;
  1404.     dwServiceFlags3: DWORD;
  1405.     dwServiceFlags4: DWORD;
  1406.     dwProviderFlags: DWORD;
  1407.     ProviderId: TGUID;
  1408.     dwCatalogEntryId: DWORD;
  1409.     ProtocolChain: WSAPROTOCOLCHAIN;
  1410.     iVersion: Integer;
  1411.     iAddressFamily: Integer;
  1412.     iMaxSockAddr: Integer;
  1413.     iMinSockAddr: Integer;
  1414.     iSocketType: Integer;
  1415.     iProtocol: Integer;
  1416.     iProtocolMaxOffset: Integer;
  1417.     iNetworkByteOrder: Integer;
  1418.     iSecurityScheme: Integer;
  1419.     dwMessageSize: DWORD;
  1420.     dwProviderReserved: DWORD;
  1421.     szProtocol: array [0..WSAPROTOCOL_LEN] of WideChar;
  1422.   end;
  1423.   {$EXTERNALSYM _WSAPROTOCOL_INFOW}
  1424.   WSAPROTOCOL_INFOW = _WSAPROTOCOL_INFOW;
  1425.   {$EXTERNALSYM WSAPROTOCOL_INFOW}
  1426.   LPWSAPROTOCOL_INFOW = ^WSAPROTOCOL_INFOW;
  1427.   {$EXTERNALSYM LPWSAPROTOCOL_INFOW}
  1428.   TWsaProtocolInfoW = WSAPROTOCOL_INFOW;
  1429.   PWsaProtocolInfoW = LPWSAPROTOCOL_INFOW;
  1430. {$IFDEF UNICODE}
  1431.   WSAPROTOCOL_INFO = WSAPROTOCOL_INFOW;
  1432.   {$EXTERNALSYM WSAPROTOCOL_INFO}
  1433.   LPWSAPROTOCOL_INFO = LPWSAPROTOCOL_INFOW;
  1434.   {$EXTERNALSYM LPWSAPROTOCOL_INFO}
  1435.   TWsaProtocolInfo = TWsaProtocolInfoW;
  1436.   PWsaProtocolInfo = PWsaProtocolInfoW;
  1437. {$ELSE}
  1438.   WSAPROTOCOL_INFO = WSAPROTOCOL_INFOA;
  1439.   {$EXTERNALSYM WSAPROTOCOL_INFO}
  1440.   LPWSAPROTOCOL_INFO = LPWSAPROTOCOL_INFOA;
  1441.   {$EXTERNALSYM LPWSAPROTOCOL_INFO}
  1442.   TWsaProtocolInfo = TWsaProtocolInfoA;
  1443.   PWsaProtocolInfo = PWsaProtocolInfoA;
  1444. {$ENDIF}
  1445. // Flag bit definitions for dwProviderFlags
  1446. const
  1447.   PFL_MULTIPLE_PROTO_ENTRIES  = $00000001;
  1448.   {$EXTERNALSYM PFL_MULTIPLE_PROTO_ENTRIES}
  1449.   PFL_RECOMMENDED_PROTO_ENTRY = $00000002;
  1450.   {$EXTERNALSYM PFL_RECOMMENDED_PROTO_ENTRY}
  1451.   PFL_HIDDEN                  = $00000004;
  1452.   {$EXTERNALSYM PFL_HIDDEN}
  1453.   PFL_MATCHES_PROTOCOL_ZERO   = $00000008;
  1454.   {$EXTERNALSYM PFL_MATCHES_PROTOCOL_ZERO}
  1455. // Flag bit definitions for dwServiceFlags1
  1456.   XP1_CONNECTIONLESS           = $00000001;
  1457.   {$EXTERNALSYM XP1_CONNECTIONLESS}
  1458.   XP1_GUARANTEED_DELIVERY      = $00000002;
  1459.   {$EXTERNALSYM XP1_GUARANTEED_DELIVERY}
  1460.   XP1_GUARANTEED_ORDER         = $00000004;
  1461.   {$EXTERNALSYM XP1_GUARANTEED_ORDER}
  1462.   XP1_MESSAGE_ORIENTED         = $00000008;
  1463.   {$EXTERNALSYM XP1_MESSAGE_ORIENTED}
  1464.   XP1_PSEUDO_STREAM            = $00000010;
  1465.   {$EXTERNALSYM XP1_PSEUDO_STREAM}
  1466.   XP1_GRACEFUL_CLOSE           = $00000020;
  1467.   {$EXTERNALSYM XP1_GRACEFUL_CLOSE}
  1468.   XP1_EXPEDITED_DATA           = $00000040;
  1469.   {$EXTERNALSYM XP1_EXPEDITED_DATA}
  1470.   XP1_CONNECT_DATA             = $00000080;
  1471.   {$EXTERNALSYM XP1_CONNECT_DATA}
  1472.   XP1_DISCONNECT_DATA          = $00000100;
  1473.   {$EXTERNALSYM XP1_DISCONNECT_DATA}
  1474.   XP1_SUPPORT_BROADCAST        = $00000200;
  1475.   {$EXTERNALSYM XP1_SUPPORT_BROADCAST}
  1476.   XP1_SUPPORT_MULTIPOINT       = $00000400;
  1477.   {$EXTERNALSYM XP1_SUPPORT_MULTIPOINT}
  1478.   XP1_MULTIPOINT_CONTROL_PLANE = $00000800;
  1479.   {$EXTERNALSYM XP1_MULTIPOINT_CONTROL_PLANE}
  1480.   XP1_MULTIPOINT_DATA_PLANE    = $00001000;
  1481.   {$EXTERNALSYM XP1_MULTIPOINT_DATA_PLANE}
  1482.   XP1_QOS_SUPPORTED            = $00002000;
  1483.   {$EXTERNALSYM XP1_QOS_SUPPORTED}
  1484.   XP1_INTERRUPT                = $00004000;
  1485.   {$EXTERNALSYM XP1_INTERRUPT}
  1486.   XP1_UNI_SEND                 = $00008000;
  1487.   {$EXTERNALSYM XP1_UNI_SEND}
  1488.   XP1_UNI_RECV                 = $00010000;
  1489.   {$EXTERNALSYM XP1_UNI_RECV}
  1490.   XP1_IFS_HANDLES              = $00020000;
  1491.   {$EXTERNALSYM XP1_IFS_HANDLES}
  1492.   XP1_PARTIAL_MESSAGE          = $00040000;
  1493.   {$EXTERNALSYM XP1_PARTIAL_MESSAGE}
  1494.   BIGENDIAN    = $0000;
  1495.   {$EXTERNALSYM BIGENDIAN}
  1496.   LITTLEENDIAN = $0001;
  1497.   {$EXTERNALSYM LITTLEENDIAN}
  1498.   SECURITY_PROTOCOL_NONE = $0000;
  1499.   {$EXTERNALSYM SECURITY_PROTOCOL_NONE}
  1500. //
  1501. // WinSock 2 extension -- manifest constants for WSAJoinLeaf()
  1502. //
  1503.   JL_SENDER_ONLY   = $01;
  1504.   {$EXTERNALSYM JL_SENDER_ONLY}
  1505.   JL_RECEIVER_ONLY = $02;
  1506.   {$EXTERNALSYM JL_RECEIVER_ONLY}
  1507.   JL_BOTH          = $04;
  1508.   {$EXTERNALSYM JL_BOTH}
  1509. //
  1510. // WinSock 2 extension -- manifest constants for WSASocket()
  1511. //
  1512.   WSA_FLAG_OVERLAPPED        = $01;
  1513.   {$EXTERNALSYM WSA_FLAG_OVERLAPPED}
  1514.   WSA_FLAG_MULTIPOINT_C_ROOT = $02;
  1515.   {$EXTERNALSYM WSA_FLAG_MULTIPOINT_C_ROOT}
  1516.   WSA_FLAG_MULTIPOINT_C_LEAF = $04;
  1517.   {$EXTERNALSYM WSA_FLAG_MULTIPOINT_C_LEAF}
  1518.   WSA_FLAG_MULTIPOINT_D_ROOT = $08;
  1519.   {$EXTERNALSYM WSA_FLAG_MULTIPOINT_D_ROOT}
  1520.   WSA_FLAG_MULTIPOINT_D_LEAF = $10;
  1521.   {$EXTERNALSYM WSA_FLAG_MULTIPOINT_D_LEAF}
  1522. //
  1523. // WinSock 2 extension -- manifest constants for WSAIoctl()
  1524. //
  1525.   IOC_UNIX     = $00000000;
  1526.   {$EXTERNALSYM IOC_UNIX}
  1527.   IOC_WS2      = $08000000;
  1528.   {$EXTERNALSYM IOC_WS2}
  1529.   IOC_PROTOCOL = $10000000;
  1530.   {$EXTERNALSYM IOC_PROTOCOL}
  1531.   IOC_VENDOR   = $18000000;
  1532.   {$EXTERNALSYM IOC_VENDOR}
  1533. function _WSAIO(x, y: DWORD): DWORD;
  1534. {$EXTERNALSYM _WSAIO}
  1535. function _WSAIOR(x, y: DWORD): DWORD;
  1536. {$EXTERNALSYM _WSAIOR}
  1537. function _WSAIOW(x, y: DWORD): DWORD;
  1538. {$EXTERNALSYM _WSAIOW}
  1539. function _WSAIORW(x, y: DWORD): DWORD;
  1540. {$EXTERNALSYM _WSAIORW}
  1541. const
  1542.   SIO_ASSOCIATE_HANDLE          = IOC_INOUT or IOC_WS2 or 1;
  1543.   {$EXTERNALSYM SIO_ASSOCIATE_HANDLE}
  1544.   SIO_ENABLE_CIRCULAR_QUEUEING  = IOC_VOID or IOC_WS2 or 2;
  1545.   {$EXTERNALSYM SIO_ENABLE_CIRCULAR_QUEUEING}
  1546.   SIO_FIND_ROUTE                = IOC_OUT or IOC_WS2 or 3;
  1547.   {$EXTERNALSYM SIO_FIND_ROUTE}
  1548.   SIO_FLUSH                     = IOC_VOID or IOC_WS2 or 4;
  1549.   {$EXTERNALSYM SIO_FLUSH}
  1550.   SIO_GET_BROADCAST_ADDRESS     = IOC_OUT or IOC_WS2 or 5;
  1551.   {$EXTERNALSYM SIO_GET_BROADCAST_ADDRESS}
  1552.   SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT or IOC_WS2 or 6;
  1553.   {$EXTERNALSYM SIO_GET_EXTENSION_FUNCTION_POINTER}
  1554.   SIO_GET_QOS                   = IOC_INOUT or IOC_WS2 or 7;
  1555.   {$EXTERNALSYM SIO_GET_QOS}
  1556.   SIO_GET_GROUP_QOS             = IOC_INOUT or IOC_WS2 or 8;
  1557.   {$EXTERNALSYM SIO_GET_GROUP_QOS}
  1558.   SIO_MULTIPOINT_LOOPBACK       = IOC_INOUT or IOC_WS2 or 9;
  1559.   {$EXTERNALSYM SIO_MULTIPOINT_LOOPBACK}
  1560.   SIO_MULTICAST_SCOPE           = IOC_INOUT or IOC_WS2 or 10;
  1561.   {$EXTERNALSYM SIO_MULTICAST_SCOPE}
  1562.   SIO_SET_QOS                   = IOC_INOUT or IOC_WS2 or 11;
  1563.   {$EXTERNALSYM SIO_SET_QOS}
  1564.   SIO_SET_GROUP_QOS             = IOC_INOUT or IOC_WS2 or 12;
  1565.   {$EXTERNALSYM SIO_SET_GROUP_QOS}
  1566.   SIO_TRANSLATE_HANDLE          = IOC_INOUT or IOC_WS2 or 13;
  1567.   {$EXTERNALSYM SIO_TRANSLATE_HANDLE}
  1568.   SIO_ROUTING_INTERFACE_QUERY   = IOC_INOUT or IOC_WS2 or 20;
  1569.   {$EXTERNALSYM SIO_ROUTING_INTERFACE_QUERY}
  1570.   SIO_ROUTING_INTERFACE_CHANGE  = IOC_INOUT or IOC_WS2 or 21;
  1571.   {$EXTERNALSYM SIO_ROUTING_INTERFACE_CHANGE}
  1572.   SIO_ADDRESS_LIST_QUERY        = IOC_OUT or IOC_WS2 or 22;
  1573.   {$EXTERNALSYM SIO_ADDRESS_LIST_QUERY}
  1574.   SIO_ADDRESS_LIST_CHANGE       = IOC_VOID or IOC_WS2 or 23;
  1575.   {$EXTERNALSYM SIO_ADDRESS_LIST_CHANGE}
  1576.   SIO_QUERY_TARGET_PNP_HANDLE   = IOC_OUT or IOC_WS2 or 24;
  1577.   {$EXTERNALSYM SIO_QUERY_TARGET_PNP_HANDLE}
  1578.   SIO_ADDRESS_LIST_SORT         = IOC_INOUT or IOC_WS2 or 25;
  1579.   {$EXTERNALSYM SIO_ADDRESS_LIST_SORT}
  1580. //
  1581. // WinSock 2 extensions -- data types for the condition function in
  1582. // WSAAccept() and overlapped I/O completion routine.
  1583. //
  1584. type
  1585.   LPCONDITIONPROC = function (lpCallerId, lpCallerData: LPWSABUF; lpSQOS, lpGQOS: LPQOS; lpCalleeId, lpCalleeData: LPWSABUF;
  1586.     g: PGROUP; dwCallbackData: DWORD_PTR): Integer; stdcall;
  1587.   {$EXTERNALSYM LPCONDITIONPROC}
  1588.   LPWSAOVERLAPPED_COMPLETION_ROUTINE = procedure (dwError, cbTransferred: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: DWORD); stdcall;
  1589.   {$EXTERNALSYM LPWSAOVERLAPPED_COMPLETION_ROUTINE}
  1590. //
  1591. // WinSock 2 extension -- manifest constants and associated structures
  1592. // for WSANSPIoctl()
  1593. //
  1594. const
  1595.   SIO_NSP_NOTIFY_CHANGE       = IOC_IN or IOC_WS2 or 25;
  1596.   {$EXTERNALSYM SIO_NSP_NOTIFY_CHANGE}
  1597. type
  1598.   _WSACOMPLETIONTYPE = (
  1599.     NSP_NOTIFY_IMMEDIATELY,
  1600.     NSP_NOTIFY_HWND,
  1601.     NSP_NOTIFY_EVENT,
  1602.     NSP_NOTIFY_PORT,
  1603.     NSP_NOTIFY_APC);
  1604.   {$EXTERNALSYM _WSACOMPLETIONTYPE}
  1605.   WSACOMPLETIONTYPE = _WSACOMPLETIONTYPE;
  1606.   {$EXTERNALSYM WSACOMPLETIONTYPE}
  1607.   PWSACOMPLETIONTYPE = ^WSACOMPLETIONTYPE;
  1608.   {$EXTERNALSYM PWSACOMPLETIONTYPE}
  1609.   LPWSACOMPLETIONTYPE = ^WSACOMPLETIONTYPE;
  1610.   {$EXTERNALSYM LPWSACOMPLETIONTYPE}
  1611.   TWsaCompletionType = WSACOMPLETIONTYPE;
  1612.   _WSACOMPLETION = record
  1613.     Type_: WSACOMPLETIONTYPE;
  1614.     case Integer of // Parameters
  1615.       0: ( // WindowMessage
  1616.         hWnd: HWND;
  1617.         uMsg: UINT;
  1618.         context: WPARAM);
  1619.       (* TODO
  1620.       1: ( // Event
  1621.         lpOverlapped: LPWSAOVERLAPPED);
  1622.       2: ( // Apc
  1623.         lpOverlapped: LPWSAOVERLAPPED;
  1624.         lpfnCompletionProc: LPWSAOVERLAPPED_COMPLETION_ROUTINE);
  1625.       *)
  1626.       3: ( // Port
  1627.         lpOverlapped: LPWSAOVERLAPPED;
  1628.         hPort: HANDLE;
  1629.         Key: ULONG_PTR);
  1630.   end;
  1631.   {$EXTERNALSYM _WSACOMPLETION}
  1632.   WSACOMPLETION = _WSACOMPLETION;
  1633.   {$EXTERNALSYM WSACOMPLETION}
  1634.   PWSACOMPLETION = ^WSACOMPLETION;
  1635.   {$EXTERNALSYM PWSACOMPLETION}
  1636.   LPWSACOMPLETION = ^WSACOMPLETION;
  1637.   {$EXTERNALSYM LPWSACOMPLETION}
  1638.   TWsaCompletion = WSACOMPLETION;
  1639. //
  1640. // WinSock 2 extension -- manifest constants for SIO_TRANSLATE_HANDLE ioctl
  1641. //
  1642. const
  1643.   TH_NETDEV = $00000001;
  1644.   {$EXTERNALSYM TH_NETDEV}
  1645.   TH_TAPI   = $00000002;
  1646.   {$EXTERNALSYM TH_TAPI}
  1647. //
  1648. // Microsoft Windows Extended data types required for the functions to
  1649. // convert   back  and  forth  between  binary  and  string  forms  of
  1650. // addresses.
  1651. //
  1652. type
  1653.   LPSOCKADDR = ^sockaddr;
  1654.   {$EXTERNALSYM LPSOCKADDR}
  1655.   PSOCKADDR_STORAGE = ^sockaddr_storage;
  1656.   {$EXTERNALSYM PSOCKADDR_STORAGE}
  1657.   LPSOCKADDR_STORAGE = ^sockaddr_storage;
  1658.   {$EXTERNALSYM LPSOCKADDR_STORAGE}
  1659. //
  1660. // Manifest constants and type definitions related to name resolution and
  1661. // registration (RNR) API
  1662. //
  1663.   _BLOB = record
  1664.     cbSize: ULONG;
  1665.     pBlobData: LPBYTE;
  1666.   end;
  1667.   {$EXTERNALSYM _BLOB}
  1668.   BLOB = _BLOB;
  1669.   {$EXTERNALSYM BLOB}
  1670.   LPBLOB = ^BLOB;
  1671.   {$EXTERNALSYM LPBLOB}
  1672.   TBlob = BLOB;
  1673.   PBlob = LPBLOB;
  1674. //
  1675. // Service Install Flags
  1676. //
  1677. const
  1678.   SERVICE_MULTIPLE = ($00000001);
  1679.   {$EXTERNALSYM SERVICE_MULTIPLE}
  1680. //
  1681. //& Name Spaces
  1682. //
  1683.   NS_ALL = (0);
  1684.   {$EXTERNALSYM NS_ALL}
  1685.   NS_SAP         = (1);
  1686.   {$EXTERNALSYM NS_SAP}
  1687.   NS_NDS         = (2);
  1688.   {$EXTERNALSYM NS_NDS}
  1689.   NS_PEER_BROWSE = (3);
  1690.   {$EXTERNALSYM NS_PEER_BROWSE}
  1691.   NS_SLP         = (5);
  1692.   {$EXTERNALSYM NS_SLP}
  1693.   NS_DHCP        = (6);
  1694.   {$EXTERNALSYM NS_DHCP}
  1695.   NS_TCPIP_LOCAL = (10);
  1696.   {$EXTERNALSYM NS_TCPIP_LOCAL}
  1697.   NS_TCPIP_HOSTS = (11);
  1698.   {$EXTERNALSYM NS_TCPIP_HOSTS}
  1699.   NS_DNS         = (12);
  1700.   {$EXTERNALSYM NS_DNS}
  1701.   NS_NETBT       = (13);
  1702.   {$EXTERNALSYM NS_NETBT}
  1703.   NS_WINS        = (14);
  1704.   {$EXTERNALSYM NS_WINS}
  1705.   NS_NLA         = (15);    // Network Location Awareness
  1706.   {$EXTERNALSYM NS_NLA}
  1707.   NS_NBP = (20);
  1708.   {$EXTERNALSYM NS_NBP}
  1709.   NS_MS   = (30);
  1710.   {$EXTERNALSYM NS_MS}
  1711.   NS_STDA = (31);
  1712.   {$EXTERNALSYM NS_STDA}
  1713.   NS_NTDS = (32);
  1714.   {$EXTERNALSYM NS_NTDS}
  1715.   NS_X500    = (40);
  1716.   {$EXTERNALSYM NS_X500}
  1717.   NS_NIS     = (41);
  1718.   {$EXTERNALSYM NS_NIS}
  1719.   NS_NISPLUS = (42);
  1720.   {$EXTERNALSYM NS_NISPLUS}
  1721.   NS_WRQ = (50);
  1722.   {$EXTERNALSYM NS_WRQ}
  1723.   NS_NETDES = (60); // Network Designers Limited
  1724.   {$EXTERNALSYM NS_NETDES}
  1725. //
  1726. // Resolution flags for WSAGetAddressByName().
  1727. // Note these are also used by the 1.1 API GetAddressByName, so
  1728. // leave them around.
  1729. //
  1730.   RES_UNUSED_1    = ($00000001);
  1731.   {$EXTERNALSYM RES_UNUSED_1}
  1732.   RES_FLUSH_CACHE = ($00000002);
  1733.   {$EXTERNALSYM RES_FLUSH_CACHE}
  1734.   RES_SERVICE = ($00000004);
  1735.   {$EXTERNALSYM RES_SERVICE}
  1736. //
  1737. // Well known value names for Service Types
  1738. //
  1739.   SERVICE_TYPE_VALUE_IPXPORTA  = 'IpxSocket';
  1740.   {$EXTERNALSYM SERVICE_TYPE_VALUE_IPXPORTA}
  1741.   SERVICE_TYPE_VALUE_IPXPORTW  = WideString('IpxSocket');
  1742.   {$EXTERNALSYM SERVICE_TYPE_VALUE_IPXPORTW}
  1743.   SERVICE_TYPE_VALUE_SAPIDA    = 'SapId';
  1744.   {$EXTERNALSYM SERVICE_TYPE_VALUE_SAPIDA}
  1745.   SERVICE_TYPE_VALUE_SAPIDW    = WideString('SapId');
  1746.   {$EXTERNALSYM SERVICE_TYPE_VALUE_SAPIDW}
  1747.   SERVICE_TYPE_VALUE_TCPPORTA  = 'TcpPort';
  1748.   {$EXTERNALSYM SERVICE_TYPE_VALUE_TCPPORTA}
  1749.   SERVICE_TYPE_VALUE_TCPPORTW  = WideString('TcpPort');
  1750.   {$EXTERNALSYM SERVICE_TYPE_VALUE_TCPPORTW}
  1751.   SERVICE_TYPE_VALUE_UDPPORTA  = 'UdpPort';
  1752.   {$EXTERNALSYM SERVICE_TYPE_VALUE_UDPPORTA}
  1753.   SERVICE_TYPE_VALUE_UDPPORTW  = WideString('UdpPort');
  1754.   {$EXTERNALSYM SERVICE_TYPE_VALUE_UDPPORTW}
  1755.   SERVICE_TYPE_VALUE_OBJECTIDA = 'ObjectId';
  1756.   {$EXTERNALSYM SERVICE_TYPE_VALUE_OBJECTIDA}
  1757.   SERVICE_TYPE_VALUE_OBJECTIDW = WideString('ObjectId');
  1758.   {$EXTERNALSYM SERVICE_TYPE_VALUE_OBJECTIDW}
  1759. {$IFDEF UNICODE}
  1760.   SERVICE_TYPE_VALUE_SAPID    = SERVICE_TYPE_VALUE_SAPIDW;
  1761.   {$EXTERNALSYM SERVICE_TYPE_VALUE_SAPID}
  1762.   SERVICE_TYPE_VALUE_TCPPORT  = SERVICE_TYPE_VALUE_TCPPORTW;
  1763.   {$EXTERNALSYM SERVICE_TYPE_VALUE_TCPPORT}
  1764.   SERVICE_TYPE_VALUE_UDPPORT  = SERVICE_TYPE_VALUE_UDPPORTW;
  1765.   {$EXTERNALSYM SERVICE_TYPE_VALUE_UDPPORT}
  1766.   SERVICE_TYPE_VALUE_OBJECTID = SERVICE_TYPE_VALUE_OBJECTIDW;
  1767.   {$EXTERNALSYM SERVICE_TYPE_VALUE_OBJECTID}
  1768. {$ELSE}
  1769.   SERVICE_TYPE_VALUE_SAPID    = SERVICE_TYPE_VALUE_SAPIDA;
  1770.   {$EXTERNALSYM SERVICE_TYPE_VALUE_SAPID}
  1771.   SERVICE_TYPE_VALUE_TCPPORT  = SERVICE_TYPE_VALUE_TCPPORTA;
  1772.   {$EXTERNALSYM SERVICE_TYPE_VALUE_TCPPORT}
  1773.   SERVICE_TYPE_VALUE_UDPPORT  = SERVICE_TYPE_VALUE_UDPPORTA;
  1774.   {$EXTERNALSYM SERVICE_TYPE_VALUE_UDPPORT}
  1775.   SERVICE_TYPE_VALUE_OBJECTID = SERVICE_TYPE_VALUE_OBJECTIDA;
  1776.   {$EXTERNALSYM SERVICE_TYPE_VALUE_OBJECTID}
  1777. {$ENDIF}
  1778. //
  1779. // SockAddr Information
  1780. //
  1781. type
  1782.   LPSOCKET_ADDRESS = ^SOCKET_ADDRESS;
  1783.   {$EXTERNALSYM LPSOCKET_ADDRESS}
  1784.   PSOCKET_ADDRESS = ^SOCKET_ADDRESS;
  1785.   {$EXTERNALSYM PSOCKET_ADDRESS}
  1786.   _SOCKET_ADDRESS = record
  1787.     lpSockaddr: LPSOCKADDR;
  1788.     iSockaddrLength: Integer;
  1789.   end;
  1790.   {$EXTERNALSYM _SOCKET_ADDRESS}
  1791.   SOCKET_ADDRESS = _SOCKET_ADDRESS;
  1792.   {$EXTERNALSYM SOCKET_ADDRESS}
  1793.   TSocketAddress = SOCKET_ADDRESS;
  1794.   PSocketAddress = PSOCKET_ADDRESS;
  1795. //
  1796. // CSAddr Information
  1797. //
  1798.   LPCSADDR_INFO = ^CSADDR_INFO;
  1799.   {$EXTERNALSYM LPCSADDR_INFO}
  1800.   PCSADDR_INFO = ^CSADDR_INFO;
  1801.   {$EXTERNALSYM PCSADDR_INFO}
  1802.   _CSADDR_INFO = record
  1803.     LocalAddr: SOCKET_ADDRESS;
  1804.     RemoteAddr: SOCKET_ADDRESS;
  1805.     iSocketType: Integer;
  1806.     iProtocol: Integer;
  1807.   end;
  1808.   {$EXTERNALSYM _CSADDR_INFO}
  1809.   CSADDR_INFO = _CSADDR_INFO;
  1810.   {$EXTERNALSYM CSADDR_INFO}
  1811.   TCsAddrInfo = CSADDR_INFO;
  1812.   PCsAddrInfo = PCSADDR_INFO;
  1813. //
  1814. // Address list returned via SIO_ADDRESS_LIST_QUERY
  1815. //
  1816.   LPSOCKET_ADDRESS_LIST = ^SOCKET_ADDRESS_LIST;
  1817.   {$EXTERNALSYM LPSOCKET_ADDRESS_LIST}
  1818.   _SOCKET_ADDRESS_LIST = record
  1819.     iAddressCount: Integer;
  1820.     Address: array [0..0] of SOCKET_ADDRESS;
  1821.   end;
  1822.   {$EXTERNALSYM _SOCKET_ADDRESS_LIST}
  1823.   SOCKET_ADDRESS_LIST = _SOCKET_ADDRESS_LIST;
  1824.   {$EXTERNALSYM SOCKET_ADDRESS_LIST}
  1825.   TSocketAddressList = SOCKET_ADDRESS_LIST;
  1826.   PSocketAddressList = LPSOCKET_ADDRESS_LIST;
  1827. //
  1828. //  Address Family/Protocol Tuples
  1829. //
  1830.   LPAFPROTOCOLS = ^AFPROTOCOLS;
  1831.   {$EXTERNALSYM LPAFPROTOCOLS}
  1832.   PAFPROTOCOLS = ^AFPROTOCOLS;
  1833.   {$EXTERNALSYM PAFPROTOCOLS}
  1834.   _AFPROTOCOLS = record
  1835.     iAddressFamily: Integer;
  1836.     iProtocol: Integer;
  1837.   end;
  1838.   {$EXTERNALSYM _AFPROTOCOLS}
  1839.   AFPROTOCOLS = _AFPROTOCOLS;
  1840.   {$EXTERNALSYM AFPROTOCOLS}
  1841.   TAfProtocols = AFPROTOCOLS;
  1842. //
  1843. // Client Query API Typedefs
  1844. //
  1845. //
  1846. // The comparators
  1847. //
  1848.   _WSAEcomparator = (COMP_EQUAL, COMP_NOTLESS);
  1849.   {$EXTERNALSYM _WSAEcomparator}
  1850.   WSAECOMPARATOR = _WSAEcomparator;
  1851.   {$EXTERNALSYM WSAECOMPARATOR}
  1852.   PWSAECOMPARATOR = ^WSAECOMPARATOR;
  1853.   {$EXTERNALSYM PWSAECOMPARATOR}
  1854.   LPWSAECOMPARATOR = ^WSAECOMPARATOR;
  1855.   {$EXTERNALSYM LPWSAECOMPARATOR}
  1856.   LPWSAVERSION = ^WSAVERSION;
  1857.   {$EXTERNALSYM LPWSAVersion}
  1858.   PWSAVERSION = ^WSAVERSION;
  1859.   {$EXTERNALSYM PWSAVersion}
  1860.   _WSAVersion = record
  1861.     dwVersion: DWORD;
  1862.     ecHow: WSAECOMPARATOR;
  1863.   end;
  1864.   {$EXTERNALSYM _WSAVersion}
  1865.   WSAVERSION = _WSAVersion;
  1866.   {$EXTERNALSYM WSAVERSION}
  1867.   TWsaVersion = WSAVERSION;
  1868.   _WSAQuerySetA = record
  1869.     dwSize: DWORD;
  1870.     lpszServiceInstanceName: LPSTR;
  1871.     lpServiceClassId: PGUID;
  1872.     lpVersion: LPWSAVERSION;
  1873.     lpszComment: LPSTR;
  1874.     dwNameSpace: DWORD;
  1875.     lpNSProviderId: PGUID;
  1876.     lpszContext: LPSTR;
  1877.     dwNumberOfProtocols: DWORD;
  1878.     lpafpProtocols: LPAFPROTOCOLS;
  1879.     lpszQueryString: LPSTR;
  1880.     dwNumberOfCsAddrs: DWORD;
  1881.     lpcsaBuffer: LPCSADDR_INFO;
  1882.     dwOutputFlags: DWORD;
  1883.     lpBlob: LPBLOB;
  1884.   end;
  1885.   {$EXTERNALSYM _WSAQuerySetA}
  1886.   WSAQUERYSETA = _WSAQuerySetA;
  1887.   {$EXTERNALSYM WSAQUERYSETA}
  1888.   PWSAQUERYSETA = ^WSAQUERYSETA;
  1889.   {$EXTERNALSYM PWSAQUERYSETA}
  1890.   LPWSAQUERYSETA = ^WSAQUERYSETA;
  1891.   {$EXTERNALSYM LPWSAQUERYSETA}
  1892.   TWsaQuerySetA = WSAQUERYSETA;
  1893.   _WSAQuerySetW = record
  1894.     dwSize: DWORD;
  1895.     lpszServiceInstanceName: LPWSTR;
  1896.     lpServiceClassId: PGUID;
  1897.     lpVersion: LPWSAVERSION;
  1898.     lpszComment: LPWSTR;
  1899.     dwNameSpace: DWORD;
  1900.     lpNSProviderId: PGUID;
  1901.     lpszContext: LPWSTR;
  1902.     dwNumberOfProtocols: DWORD;
  1903.     lpafpProtocols: LPAFPROTOCOLS;
  1904.     lpszQueryString: LPWSTR;
  1905.     dwNumberOfCsAddrs: DWORD;
  1906.     lpcsaBuffer: LPCSADDR_INFO;
  1907.     dwOutputFlags: DWORD;
  1908.     lpBlob: LPBLOB;
  1909.   end;
  1910.   {$EXTERNALSYM _WSAQuerySetW}
  1911.   WSAQUERYSETW = _WSAQuerySetW;
  1912.   {$EXTERNALSYM WSAQUERYSETW}
  1913.   PWSAQUERYSETW = ^WSAQUERYSETW;
  1914.   {$EXTERNALSYM PWSAQUERYSETW}
  1915.   LPWSAQUERYSETW = ^WSAQUERYSETW;
  1916.   {$EXTERNALSYM LPWSAQUERYSETW}
  1917.   TWsaQuerySetW = WSAQUERYSETW;
  1918. {$IFDEF UNICODE}
  1919.   WSAQUERYSET = WSAQUERYSETW;
  1920.   {$EXTERNALSYM WSAQUERYSET}
  1921.   PWSAQUERYSET = PWSAQUERYSETW;
  1922.   {$EXTERNALSYM PWSAQUERYSET}
  1923.   LPWSAQUERYSET = LPWSAQUERYSETW;
  1924.   {$EXTERNALSYM LPWSAQUERYSET}
  1925.   TWsaQuerySet = TWsaQuerySetW;
  1926. {$ELSE}
  1927.   WSAQUERYSET = WSAQUERYSETA;
  1928.   {$EXTERNALSYM WSAQUERYSET}
  1929.   PWSAQUERYSET = PWSAQUERYSETA;
  1930.   {$EXTERNALSYM PWSAQUERYSET}
  1931.   LPWSAQUERYSET = LPWSAQUERYSETA;
  1932.   {$EXTERNALSYM LPWSAQUERYSET}
  1933.   TWsaQuerySet = TWsaQuerySetA;
  1934. {$ENDIF}
  1935. const
  1936.   LUP_DEEP                = $0001;
  1937.   {$EXTERNALSYM LUP_DEEP}
  1938.   LUP_CONTAINERS          = $0002;
  1939.   {$EXTERNALSYM LUP_CONTAINERS}
  1940.   LUP_NOCONTAINERS        = $0004;
  1941.   {$EXTERNALSYM LUP_NOCONTAINERS}
  1942.   LUP_NEAREST             = $0008;
  1943.   {$EXTERNALSYM LUP_NEAREST}
  1944.   LUP_RETURN_NAME         = $0010;
  1945.   {$EXTERNALSYM LUP_RETURN_NAME}
  1946.   LUP_RETURN_TYPE         = $0020;
  1947.   {$EXTERNALSYM LUP_RETURN_TYPE}
  1948.   LUP_RETURN_VERSION      = $0040;
  1949.   {$EXTERNALSYM LUP_RETURN_VERSION}
  1950.   LUP_RETURN_COMMENT      = $0080;
  1951.   {$EXTERNALSYM LUP_RETURN_COMMENT}
  1952.   LUP_RETURN_ADDR         = $0100;
  1953.   {$EXTERNALSYM LUP_RETURN_ADDR}
  1954.   LUP_RETURN_BLOB         = $0200;
  1955.   {$EXTERNALSYM LUP_RETURN_BLOB}
  1956.   LUP_RETURN_ALIASES      = $0400;
  1957.   {$EXTERNALSYM LUP_RETURN_ALIASES}
  1958.   LUP_RETURN_QUERY_STRING = $0800;
  1959.   {$EXTERNALSYM LUP_RETURN_QUERY_STRING}
  1960.   LUP_RETURN_ALL          = $0FF0;
  1961.   {$EXTERNALSYM LUP_RETURN_ALL}
  1962.   LUP_RES_SERVICE         = $8000;
  1963.   {$EXTERNALSYM LUP_RES_SERVICE}
  1964.   LUP_FLUSHCACHE    = $1000;
  1965.   {$EXTERNALSYM LUP_FLUSHCACHE}
  1966.   LUP_FLUSHPREVIOUS = $2000;
  1967.   {$EXTERNALSYM LUP_FLUSHPREVIOUS}
  1968. //
  1969. // Return flags
  1970. //
  1971.   RESULT_IS_ALIAS = $0001;
  1972.   {$EXTERNALSYM RESULT_IS_ALIAS}
  1973.   RESULT_IS_ADDED   = $0010;
  1974.   {$EXTERNALSYM RESULT_IS_ADDED}
  1975.   RESULT_IS_CHANGED = $0020;
  1976.   {$EXTERNALSYM RESULT_IS_CHANGED}
  1977.   RESULT_IS_DELETED = $0040;
  1978.   {$EXTERNALSYM RESULT_IS_DELETED}
  1979. //
  1980. // Service Address Registration and Deregistration Data Types.
  1981. //
  1982. type
  1983.   _WSAESETSERVICEOP = (RNRSERVICE_REGISTER, RNRSERVICE_DEREGISTER, RNRSERVICE_DELETE);
  1984.   {$EXTERNALSYM _WSAESETSERVICEOP}
  1985.   WSAESETSERVICEOP = _WSAESETSERVICEOP;
  1986.   {$EXTERNALSYM WSAESETSERVICEOP}
  1987.   PWSAESETSERVICEOP = ^WSAESETSERVICEOP;
  1988.   {$EXTERNALSYM PWSAESETSERVICEOP}
  1989.   LPWSAESETSERVICEOP = ^WSAESETSERVICEOP;
  1990.   {$EXTERNALSYM LPWSAESETSERVICEOP}
  1991. //
  1992. // Service Installation/Removal Data Types.
  1993. //
  1994.   _WSANSClassInfoA = record
  1995.     lpszName: LPSTR;
  1996.     dwNameSpace: DWORD;
  1997.     dwValueType: DWORD;
  1998.     dwValueSize: DWORD;
  1999.     lpValue: LPVOID;
  2000.   end;
  2001.   {$EXTERNALSYM _WSANSClassInfoA}
  2002.   WSANSCLASSINFOA = _WSANSClassInfoA;
  2003.   {$EXTERNALSYM WSANSCLASSINFOA}
  2004.   PWSANSCLASSINFOA = ^WSANSCLASSINFOA;
  2005.   {$EXTERNALSYM PWSANSCLASSINFOA}
  2006.   LPWSANSCLASSINFOA = ^WSANSCLASSINFOA;
  2007.   {$EXTERNALSYM LPWSANSCLASSINFOA}
  2008.   TWsaNsClassInfoA = WSANSCLASSINFOA;
  2009.   _WSANSClassInfoW = record
  2010.     lpszName: LPWSTR;
  2011.     dwNameSpace: DWORD;
  2012.     dwValueType: DWORD;
  2013.     dwValueSize: DWORD;
  2014.     lpValue: LPVOID;
  2015.   end;
  2016.   {$EXTERNALSYM _WSANSClassInfoW}
  2017.   WSANSCLASSINFOW = _WSANSClassInfoW;
  2018.   {$EXTERNALSYM WSANSCLASSINFOW}
  2019.   PWSANSCLASSINFOW = ^WSANSCLASSINFOW;
  2020.   {$EXTERNALSYM PWSANSCLASSINFOW}
  2021.   LPWSANSCLASSINFOW = ^WSANSCLASSINFOW;
  2022.   {$EXTERNALSYM LPWSANSCLASSINFOW}
  2023.   TWsaNsClassInfoW = WSANSCLASSINFOW;
  2024. {$IFDEF UNICODE}
  2025.   WSANSCLASSINFO = WSANSCLASSINFOW;
  2026.   {$EXTERNALSYM WSANSCLASSINFO}
  2027.   PWSANSCLASSINFO = PWSANSCLASSINFOW;
  2028.   {$EXTERNALSYM PWSANSCLASSINFO}
  2029.   LPWSANSCLASSINFO = LPWSANSCLASSINFOW;
  2030.   {$EXTERNALSYM LPWSANSCLASSINFO}
  2031.   TWsaNsClassInfo = TWsaNsClassInfoW;
  2032. {$ELSE}
  2033.   WSANSCLASSINFO = WSANSCLASSINFOA;
  2034.   {$EXTERNALSYM WSANSCLASSINFO}
  2035.   PWSANSCLASSINFO = PWSANSCLASSINFOA;
  2036.   {$EXTERNALSYM PWSANSCLASSINFO}
  2037.   LPWSANSCLASSINFO = LPWSANSCLASSINFOA;
  2038.   {$EXTERNALSYM LPWSANSCLASSINFO}
  2039.   TWsaNsClassInfo = TWsaNsClassInfoA;
  2040. {$ENDIF}
  2041.   _WSAServiceClassInfoA = record
  2042.     lpServiceClassId: PGUID;
  2043.     lpszServiceClassName: LPSTR;
  2044.     dwCount: DWORD;
  2045.     lpClassInfos: LPWSANSCLASSINFOA;
  2046.   end;
  2047.   {$EXTERNALSYM _WSAServiceClassInfoA}
  2048.   WSASERVICECLASSINFOA = _WSAServiceClassInfoA;
  2049.   {$EXTERNALSYM WSASERVICECLASSINFOA}
  2050.   PWSASERVICECLASSINFOA = ^WSASERVICECLASSINFOA;
  2051.   {$EXTERNALSYM PWSASERVICECLASSINFOA}
  2052.   LPWSASERVICECLASSINFOA = ^WSASERVICECLASSINFOA;
  2053.   {$EXTERNALSYM LPWSASERVICECLASSINFOA}
  2054.   TWsaServiceClassInfoA = WSASERVICECLASSINFOA;
  2055.   _WSAServiceClassInfoW = record
  2056.     lpServiceClassId: PGUID;
  2057.     lpszServiceClassName: LPWSTR;
  2058.     dwCount: DWORD;
  2059.     lpClassInfos: LPWSANSCLASSINFOW;
  2060.   end;
  2061.   {$EXTERNALSYM _WSAServiceClassInfoW}
  2062.   WSASERVICECLASSINFOW = _WSAServiceClassInfoW;
  2063.   {$EXTERNALSYM WSASERVICECLASSINFOW}
  2064.   PWSASERVICECLASSINFOW = ^WSASERVICECLASSINFOW;
  2065.   {$EXTERNALSYM PWSASERVICECLASSINFOW}
  2066.   LPWSASERVICECLASSINFOW = ^WSASERVICECLASSINFOW;
  2067.   {$EXTERNALSYM LPWSASERVICECLASSINFOW}
  2068.   TWsaServiceClassInfoW = WSASERVICECLASSINFOW;
  2069. {$IFDEF UNICODE}
  2070.   WSASERVICECLASSINFO = WSASERVICECLASSINFOW;
  2071.   {$EXTERNALSYM WSASERVICECLASSINFO}
  2072.   PWSASERVICECLASSINFO = PWSASERVICECLASSINFOW;
  2073.   {$EXTERNALSYM PWSASERVICECLASSINFO}
  2074.   LPWSASERVICECLASSINFO = LPWSASERVICECLASSINFOW;
  2075.   {$EXTERNALSYM LPWSASERVICECLASSINFO}
  2076.   TWsaServiceClassInfo = TWsaServiceClassInfoW;
  2077. {$ELSE}
  2078.   WSASERVICECLASSINFO = WSASERVICECLASSINFOA;
  2079.   {$EXTERNALSYM WSASERVICECLASSINFO}
  2080.   PWSASERVICECLASSINFO = PWSASERVICECLASSINFOA;
  2081.   {$EXTERNALSYM PWSASERVICECLASSINFO}
  2082.   LPWSASERVICECLASSINFO = LPWSASERVICECLASSINFOA;
  2083.   {$EXTERNALSYM LPWSASERVICECLASSINFO}
  2084.   TWsaServiceClassInfo = TWsaServiceClassInfoA;
  2085. {$ENDIF}
  2086.   LPWSANAMESPACE_INFOA = ^WSANAMESPACE_INFOA;
  2087.   {$EXTERNALSYM LPWSANAMESPACE_INFOA}
  2088.   PWSANAMESPACE_INFOA = ^WSANAMESPACE_INFOA;
  2089.   {$EXTERNALSYM PWSANAMESPACE_INFOA}
  2090.   _WSANAMESPACE_INFOA = record
  2091.     NSProviderId: TGUID;
  2092.     dwNameSpace: DWORD;
  2093.     fActive: BOOL;
  2094.     dwVersion: DWORD;
  2095.     lpszIdentifier: LPSTR;
  2096.   end;
  2097.   {$EXTERNALSYM _WSANAMESPACE_INFOA}
  2098.   WSANAMESPACE_INFOA = _WSANAMESPACE_INFOA;
  2099.   {$EXTERNALSYM WSANAMESPACE_INFOA}
  2100.   TWsaNameSpaceInfoA = WSANAMESPACE_INFOA;
  2101.   PWsaNameSpaceInfoA = LPWSANAMESPACE_INFOA;
  2102.   LPWSANAMESPACE_INFOW = ^WSANAMESPACE_INFOW;
  2103.   {$EXTERNALSYM LPWSANAMESPACE_INFOW}
  2104.   PWSANAMESPACE_INFOW = ^WSANAMESPACE_INFOW;
  2105.   {$EXTERNALSYM PWSANAMESPACE_INFOW}
  2106.   _WSANAMESPACE_INFOW = record
  2107.     NSProviderId: TGUID;
  2108.     dwNameSpace: DWORD;
  2109.     fActive: BOOL;
  2110.     dwVersion: DWORD;
  2111.     lpszIdentifier: LPWSTR;
  2112.   end;
  2113.   {$EXTERNALSYM _WSANAMESPACE_INFOW}
  2114.   WSANAMESPACE_INFOW = _WSANAMESPACE_INFOW;
  2115.   {$EXTERNALSYM WSANAMESPACE_INFOW}
  2116.   TWsaNameSpaceInfoW = WSANAMESPACE_INFOW;
  2117.   PWsaNameSpaceInfoW = PWSANAMESPACE_INFOW;
  2118. {$IFDEF UNICODE}
  2119.   WSANAMESPACE_INFO = WSANAMESPACE_INFOW;
  2120.   {$EXTERNALSYM WSANAMESPACE_INFO}
  2121.   PWSANAMESPACE_INFO = PWSANAMESPACE_INFOW;
  2122.   {$EXTERNALSYM PWSANAMESPACE_INFO}
  2123.   LPWSANAMESPACE_INFO = LPWSANAMESPACE_INFOW;
  2124.   {$EXTERNALSYM LPWSANAMESPACE_INFO}
  2125.   TWsaNameSpaceInfo = TWsaNameSpaceInfoW;
  2126.   PWsaNameSpaceInfo = PWsaNameSpaceInfoW;
  2127. {$ELSE}
  2128.   WSANAMESPACE_INFO = WSANAMESPACE_INFOA;
  2129.   {$EXTERNALSYM WSANAMESPACE_INFO}
  2130.   PWSANAMESPACE_INFO = PWSANAMESPACE_INFOA;
  2131.   {$EXTERNALSYM PWSANAMESPACE_INFO}
  2132.   LPWSANAMESPACE_INFO = LPWSANAMESPACE_INFOA;
  2133.   {$EXTERNALSYM LPWSANAMESPACE_INFO}
  2134.   TWsaNameSpaceInfo = TWsaNameSpaceInfoA;
  2135.   PWsaNameSpaceInfo = PWsaNameSpaceInfoA;
  2136. {$ENDIF}
  2137. // Socket function prototypes
  2138. function accept(s: TSocket; addr: PSockAddr; addrlen: PINT): TSocket; stdcall;
  2139. {$EXTERNALSYM accept}
  2140. function bind(s: TSocket; name: PSockAddr; namelen: Integer): Integer; stdcall;
  2141. {$EXTERNALSYM bind}
  2142. function closesocket(s: TSocket): Integer; stdcall;
  2143. {$EXTERNALSYM closesocket}
  2144. function connect(s: TSocket; name: PSockAddr; namelen: Integer): Integer; stdcall;
  2145. {$EXTERNALSYM connect}
  2146. function ioctlsocket(s: TSocket; cmd: Longint; var argp: u_long): Integer; stdcall;
  2147. {$EXTERNALSYM ioctlsocket}
  2148. function getpeername(s: TSocket; name: PSockAddr; var namelen: Integer): Integer; stdcall;
  2149. {$EXTERNALSYM getpeername}
  2150. function getsockname(s: TSocket; name: PSockAddr; var namelen: Integer): Integer; stdcall;
  2151. {$EXTERNALSYM getsockname}
  2152. function getsockopt(s: TSocket; level, optname: Integer; optval: PChar; var optlen: Integer): Integer; stdcall;
  2153. {$EXTERNALSYM getsockopt}
  2154. function htonl(hostlong: u_long): u_long; stdcall;
  2155. {$EXTERNALSYM htonl}
  2156. function htons(hostshort: u_short): u_short; stdcall;
  2157. {$EXTERNALSYM htons}
  2158. function inet_addr(cp: PChar): u_long; stdcall;
  2159. {$EXTERNALSYM inet_addr}
  2160. function inet_ntoa(inaddr: in_addr): PChar; stdcall;
  2161. {$EXTERNALSYM inet_ntoa}
  2162. function listen(s: TSocket; backlog: Integer): Integer; stdcall;
  2163. {$EXTERNALSYM listen}
  2164. function ntohl(netlong: u_long): u_long; stdcall;
  2165. {$EXTERNALSYM ntohl}
  2166. function ntohs(netshort: u_short): u_short; stdcall;
  2167. {$EXTERNALSYM ntohs}
  2168. function recv(s: TSocket; var buf; len, flags: Integer): Integer; stdcall;
  2169. {$EXTERNALSYM recv}
  2170. function recvfrom(s: TSocket; var buf; len, flags: Integer; from: PSockAddr; var fromlen: Integer): Integer; stdcall;
  2171. {$EXTERNALSYM recvfrom}
  2172. function select(nfds: Integer; readfds, writefds, exceptfds: PFdSet; timeout: PTimeVal): Integer; stdcall;
  2173. {$EXTERNALSYM select}
  2174. function send(s: TSocket; var buf; len, flags: Integer): Integer; stdcall;
  2175. {$EXTERNALSYM send}
  2176. function sendto(s: TSocket; var buf; len, flags: Integer; toaddr: PSockAddr; tolen: Integer): Integer; stdcall;
  2177. {$EXTERNALSYM sendto}
  2178. function setsockopt(s: TSocket; level, optname: Integer; optval: PChar; optlen: Integer): Integer; stdcall;
  2179. {$EXTERNALSYM setsockopt}
  2180. function shutdown(s: TSocket; how: Integer): Integer; stdcall;
  2181. {$EXTERNALSYM shutdown}
  2182. function socket(af, type_, protocol: Integer): TSocket; stdcall;
  2183. {$EXTERNALSYM socket}
  2184. // Database function prototypes
  2185. function gethostbyaddr(addr: PChar; len, type_: Integer): PHostEnt; stdcall;
  2186. {$EXTERNALSYM gethostbyaddr}
  2187. function gethostbyname(name: PChar): PHostEnt; stdcall;
  2188. {$EXTERNALSYM gethostbyname}
  2189. function gethostname(name: PChar; namelen: Integer): Integer; stdcall;
  2190. {$EXTERNALSYM gethostname}
  2191. function getservbyport(port: Integer; proto: PChar): PServEnt; stdcall;
  2192. {$EXTERNALSYM getservbyport}
  2193. function getservbyname(name, proto: PChar): PServEnt; stdcall;
  2194. {$EXTERNALSYM getservbyname}
  2195. function getprotobynumber(number: Integer): PProtoEnt; stdcall;
  2196. {$EXTERNALSYM getprotobynumber}
  2197. function getprotobyname(name: PChar): PProtoEnt; stdcall;
  2198. {$EXTERNALSYM getprotobyname}
  2199. // Microsoft Windows Extension function prototypes
  2200. function WSAStartup(wVersionRequired: WORD; var lpWSAData: TWSAData): Integer; stdcall;
  2201. {$EXTERNALSYM WSAStartup}
  2202. function WSACleanup: Integer; stdcall;
  2203. {$EXTERNALSYM WSACleanup}
  2204. procedure WSASetLastError(iError: Integer); stdcall;
  2205. {$EXTERNALSYM WSASetLastError}
  2206. function WSAGetLastError: Integer; stdcall;
  2207. {$EXTERNALSYM WSAGetLastError}
  2208. function WSAIsBlocking: BOOL; stdcall;
  2209. {$EXTERNALSYM WSAIsBlocking}
  2210. function WSAUnhookBlockingHook: Integer; stdcall;
  2211. {$EXTERNALSYM WSAUnhookBlockingHook}
  2212. function WSASetBlockingHook(lpBlockFunc: FARPROC): FARPROC; stdcall;
  2213. {$EXTERNALSYM WSASetBlockingHook}
  2214. function WSACancelBlockingCall: Integer; stdcall;
  2215. {$EXTERNALSYM WSACancelBlockingCall}
  2216. function WSAAsyncGetServByName(hWnd: HWND; wMsg: u_int; name, proto, buf: PChar;
  2217.   buflen: Integer): HANDLE; stdcall;
  2218. {$EXTERNALSYM WSAAsyncGetServByName}
  2219. function WSAAsyncGetServByPort(hWnd: HWND; wMsg: u_int; port: Integer;
  2220.   proto, buf: PChar; buflen: Integer): HANDLE; stdcall;
  2221. {$EXTERNALSYM WSAAsyncGetServByPort}
  2222. function WSAAsyncGetProtoByName(hWnd: HWND; wMsg: u_int; name, buf: PChar;
  2223.   buflen: Integer): HANDLE; stdcall;
  2224. {$EXTERNALSYM WSAAsyncGetProtoByName}
  2225. function WSAAsyncGetProtoByNumber(hWnd: HWND; wMsg: u_int; number: Integer;
  2226.   buf: PChar; buflen: Integer): HANDLE; stdcall;
  2227. {$EXTERNALSYM WSAAsyncGetProtoByNumber}
  2228. function WSAAsyncGetHostByName(hWnd: HWND; wMsg: u_int; name, buf: PChar;
  2229.   buflen: Integer): HANDLE; stdcall;
  2230. {$EXTERNALSYM WSAAsyncGetHostByName}
  2231. function WSAAsyncGetHostByAddr(hWnd: HWND; wMsg: u_int; addr: PChar;
  2232.   len, type_: Integer; buf: PChar; buflen: Integer): HANDLE; stdcall;
  2233. {$EXTERNALSYM WSAAsyncGetHostByAddr}
  2234. function WSACancelAsyncRequest(hAsyncTaskHandle: HANDLE): Integer; stdcall;
  2235. {$EXTERNALSYM WSACancelAsyncRequest}
  2236. function WSAAsyncSelect(s: TSocket; hWnd: HWND; wMsg: u_int; lEvent: Longint): Integer; stdcall;
  2237. {$EXTERNALSYM WSAAsyncSelect}
  2238. // WinSock 2 API new function prototypes
  2239. function WSAAccept(s: TSocket; addr: PSockAddr; addrlen: PINT;
  2240.   lpfnCondition: LPCONDITIONPROC; dwCallbackData: DWORD): TSocket; stdcall;
  2241. {$EXTERNALSYM WSAAccept}
  2242. function WSACloseEvent(hEvent: WSAEVENT): BOOL; stdcall;
  2243. {$EXTERNALSYM WSACloseEvent}
  2244. function WSAConnect(s: TSocket; name: PSockAddr; namelen: Integer; lpCallerData: LPWSABUF;
  2245.   lpCalleeData: LPWSABUF; lpSQOS: LPQOS; lpGQOS: LPQOS): Integer; stdcall;
  2246. {$EXTERNALSYM WSAConnect}
  2247. function WSACreateEvent: WSAEVENT; stdcall;
  2248. {$EXTERNALSYM WSACreateEvent}
  2249. function WSADuplicateSocketA(s: TSocket; dwProcessId: DWORD; lpProtocolInfo: LPWSAPROTOCOL_INFOA): Integer; stdcall;
  2250. {$EXTERNALSYM WSADuplicateSocketA}
  2251. function WSADuplicateSocketW(s: TSocket; dwProcessId: DWORD; lpProtocolInfo: LPWSAPROTOCOL_INFOW): Integer; stdcall;
  2252. {$EXTERNALSYM WSADuplicateSocketW}
  2253. {$IFDEF UNICODE}
  2254. function WSADuplicateSocket(s: TSocket; dwProcessId: DWORD; lpProtocolInfo: LPWSAPROTOCOL_INFOW): Integer; stdcall;
  2255. {$EXTERNALSYM WSADuplicateSocket}
  2256. {$ELSE}
  2257. function WSADuplicateSocket(s: TSocket; dwProcessId: DWORD; lpProtocolInfo: LPWSAPROTOCOL_INFOA): Integer; stdcall;
  2258. {$EXTERNALSYM WSADuplicateSocket}
  2259. {$ENDIF}
  2260. function WSAEnumNetworkEvents(s: TSocket; hEventObject: WSAEVENT; lpNetworkEvents: LPWSANETWORKEVENTS): Integer; stdcall;
  2261. {$EXTERNALSYM WSAEnumNetworkEvents}
  2262. function WSAEnumProtocolsA(lpiProtocols: PINT; lpProtocolBuffer: LPWSAPROTOCOL_INFOA;
  2263.   var lpdwBufferLength: DWORD): Integer; stdcall;
  2264. {$EXTERNALSYM WSAEnumProtocolsA}
  2265. function WSAEnumProtocolsW(lpiProtocols: PINT; lpProtocolBuffer: LPWSAPROTOCOL_INFOW;
  2266.   var lpdwBufferLength: DWORD): Integer; stdcall;
  2267. {$EXTERNALSYM WSAEnumProtocolsW}
  2268. {$IFDEF UNICODE}
  2269. function WSAEnumProtocols(lpiProtocols: PINT; lpProtocolBuffer: LPWSAPROTOCOL_INFOW;
  2270.   var lpdwBufferLength: DWORD): Integer; stdcall;
  2271. {$EXTERNALSYM WSAEnumProtocols}
  2272. {$ELSE}
  2273. function WSAEnumProtocols(lpiProtocols: PINT; lpProtocolBuffer: LPWSAPROTOCOL_INFOA;
  2274.   var lpdwBufferLength: DWORD): Integer; stdcall;
  2275. {$EXTERNALSYM WSAEnumProtocols}
  2276. {$ENDIF}
  2277. function WSAEventSelect(s: TSocket; hEventObject: WSAEVENT; lNetworkEvents: Longint): Integer; stdcall;
  2278. {$EXTERNALSYM WSAEventSelect}
  2279. function WSAGetOverlappedResult(s: TSocket; lpOverlapped: LPWSAOVERLAPPED;
  2280.   var lpcbTransfer: DWORD; fWait: BOOL; var lpdwFlags: DWORD): BOOL; stdcall; // Thanks Kai Henningsen for var on lpdwFlags
  2281. {$EXTERNALSYM WSAGetOverlappedResult}
  2282. function WSAGetQOSByName(s: TSocket; var lpQOSName: WSABUF; lpQOS: LPQOS): BOOL; stdcall;