9019 lines
326 KiB
Plaintext
9019 lines
326 KiB
Plaintext
{
|
|
$Project$
|
|
$Workfile$
|
|
$Revision$
|
|
$DateUTC$
|
|
$Id$
|
|
|
|
This file is part of the Indy (Internet Direct) project, and is offered
|
|
under the dual-licensing agreement described on the Indy website.
|
|
(http://www.indyproject.org/)
|
|
|
|
Copyright:
|
|
(c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
|
|
}
|
|
{
|
|
$Log$
|
|
}
|
|
{
|
|
Log: 56400: IdWinsock2.pas
|
|
|
|
Rev 1.0 2004.02.03 3:14:50 PM czhower
|
|
Move and updates
|
|
|
|
|
|
Rev 1.15 1/3/2004 12:41:48 AM BGooijen
|
|
Fixed WSAEnumProtocols
|
|
|
|
|
|
Rev 1.14 10/15/2003 1:20:48 PM DSiders
|
|
Added localization comments.
|
|
|
|
|
|
Rev 1.13 2003.10.01 11:16:38 AM czhower
|
|
.Net
|
|
|
|
|
|
Rev 1.12 9/24/2003 09:18:24 AM JPMugaas
|
|
Fixed an AV that happened when a stack call was made.
|
|
|
|
|
|
Rev 1.11 24/9/2003 3:11:34 PM SGrobety
|
|
First wave of fixes for compiling in dotnet. Still not functional, needed to
|
|
unlock to fix critical failure in Delphi code
|
|
|
|
|
|
Rev 1.10 9/22/2003 11:20:14 PM EHill
|
|
Removed assembly code and replaced with defined API stubs.
|
|
|
|
|
|
Rev 1.9 7/7/2003 12:55:10 PM BGooijen
|
|
Fixed ServiceQueryTransmitFile, and made it public
|
|
|
|
|
|
Rev 1.8 2003.05.09 10:59:30 PM czhower
|
|
|
|
|
|
Rev 1.7 4/19/2003 10:28:24 PM BGooijen
|
|
some functions were linked to the wrong dll
|
|
|
|
|
|
Rev 1.6 4/19/2003 11:14:40 AM JPMugaas
|
|
Made some tentitive wrapper functions for some things that should be called
|
|
from the Service Provider. Fixed WSARecvMsg.
|
|
|
|
|
|
Rev 1.5 4/19/2003 02:29:26 AM JPMugaas
|
|
Added TransmitPackets API function call. Note that this is only supported in
|
|
Windows XP or later.
|
|
|
|
|
|
Rev 1.4 4/19/2003 12:22:58 AM BGooijen
|
|
fixed: ConnectEx DisconnectEx WSARecvMsg
|
|
|
|
|
|
Rev 1.3 4/18/2003 12:00:58 AM JPMugaas
|
|
added
|
|
ConnectEx
|
|
DisconnectEx
|
|
WSARecvMsg
|
|
|
|
Changed header procedure type names to be consistant with the old
|
|
IdWinsock.pas in Indy 8.0 and with the rest of the unit.
|
|
|
|
|
|
Rev 1.2 3/22/2003 10:01:26 PM JPMugaas
|
|
WSACreateEvent couldn't load because of a space.
|
|
|
|
|
|
Rev 1.1 3/22/2003 09:46:54 PM JPMugaas
|
|
It turns out that we really do not need the TGUID defination in the header at
|
|
all. It's defined in D4, D5, D6, and D7.
|
|
|
|
|
|
Rev 1.0 11/13/2002 09:02:54 AM JPMugaas
|
|
}
|
|
//-------------------------------------------------------------
|
|
//
|
|
// Borland Delphi Runtime Library
|
|
// <API> interface unit
|
|
//
|
|
// Portions created by Microsoft are
|
|
// Copyright (C) 1995-1999 Microsoft Corporation.
|
|
// All Rights Reserved.
|
|
//
|
|
// The original file is: Winsock2.h from CBuilder5 distribution.
|
|
// The original Pascal code is: winsock2.pas, released 03 Mar 2001.
|
|
// The initial developer of the Pascal code is Alex Konshin
|
|
// (alexk@mtgroup.ru).
|
|
//-------------------------------------------------------------
|
|
|
|
|
|
{ Winsock2.h -- definitions to be used with the WinSock 2 DLL and WinSock 2 applications.
|
|
This header file corresponds to version 2.2.x of the WinSock API specification.
|
|
This file includes parts which are Copyright (c) 1982-1986 Regents
|
|
of the University of California. All rights reserved.
|
|
The Berkeley Software License Agreement specifies the terms and
|
|
conditions for redistribution. }
|
|
|
|
// Note that the original unit is copyrighted by the original author and I did obtain his
|
|
// permission to port and use this as part of Indy - J. Peter Mugaas
|
|
|
|
// 2002-01-28 - Hadi Hariri. Fixes for C++ Builder. Thanks to Chuck Smith.
|
|
// 2001 - Oct -25 J. Peter Mugaas
|
|
// Made adjustments for Indy usage by
|
|
// 1) including removing Trace logging
|
|
// 2) renaming and consolidating some .INC files as appropriate
|
|
// 3) modifying the unit to follow Indy conventions
|
|
// 4) Adding TransmitFile support for the HTTP Server
|
|
// 5) Removing all static loading code that was IFDEF'ed. {Do not Localize}
|
|
// 2001 - Mar - 1 Alex Konshin
|
|
// Revision 3
|
|
// converted by Alex Konshin, mailto:alexk@mtgroup.ru
|
|
// revision 3, March,1 2001
|
|
|
|
|
|
unit IdWinsock2;
|
|
|
|
interface
|
|
|
|
{$I IdCompilerDefines.inc}
|
|
|
|
{
|
|
Important!!!
|
|
|
|
With the ARM architecture, you may get an EBusError exception sating that
|
|
data is misaligned. Sometimes, that architecture does not have the ability to
|
|
read misaligned data. On an i386 and x86_64 architecure, you can do this but it
|
|
is inefficient. For the ARM chip architecture, we have to make sure our records
|
|
are aligned on a 4 byte boundery. See:
|
|
|
|
http://wiki.lazarus.freepascal.org/Windows_CE_Development_Notes
|
|
|
|
This is not necessary and can cause problems
|
|
when using the standard Win32 API (win32 and win64) where records are packed
|
|
instead of aligned.
|
|
|
|
To deal with this, I use the FPC predefined FPC_REQUIRES_PROPER_ALIGNMENT.
|
|
|
|
}
|
|
|
|
{$RANGECHECKS OFF}
|
|
{$IFDEF FPC}
|
|
{$IFDEF WIN32}
|
|
{$ALIGN OFF}
|
|
{$ELSE}
|
|
//It turns out that Win64 and WinCE require record alignment
|
|
{$PACKRECORDS C}
|
|
{$ENDIF}
|
|
{$ELSE}
|
|
{$IFDEF WIN64}
|
|
{$ALIGN ON}
|
|
{$MINENUMSIZE 4}
|
|
{$ELSE}
|
|
{$MINENUMSIZE 4}
|
|
{$IFDEF REQUIRES_PROPER_ALIGNMENT}
|
|
{$ALIGN ON}
|
|
{$ELSE}
|
|
{$ALIGN OFF}
|
|
{$WRITEABLECONST OFF}
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
uses
|
|
IdException, IdGlobal, SysUtils, Windows;
|
|
|
|
type
|
|
EIdWinsockStubError = class(EIdException)
|
|
protected
|
|
FWin32Error : DWORD;
|
|
FWin32ErrorMessage : String;
|
|
FTitle : String;
|
|
public
|
|
constructor Build(AWin32Error: DWORD; const ATitle: String; AArgs: array of const);
|
|
property Win32Error : DWORD read FWin32Error;
|
|
property Win32ErrorMessage : String read FWin32ErrorMessage;
|
|
property Title : String read FTitle;
|
|
end;
|
|
|
|
const
|
|
{$IFDEF WINCE}
|
|
WINSOCK2_DLL = 'ws2.dll'; {Do not Localize}
|
|
{$ELSE}
|
|
WINSOCK2_DLL = 'WS2_32.DLL'; {Do not Localize}
|
|
MSWSOCK_DLL = 'MSWSOCK.DLL'; {Do not Localize}
|
|
{$ENDIF}
|
|
{$EXTERNALSYM WINSOCK_VERSION}
|
|
WINSOCK_VERSION = $0202;
|
|
|
|
{$DEFINE WS2_DLL_FUNC_VARS}
|
|
{$DEFINE INCL_WINSOCK_API_PROTOTYPES}
|
|
{$DEFINE INCL_WINSOCK_API_TYPEDEFS}
|
|
|
|
type
|
|
{$EXTERNALSYM u_char}
|
|
u_char = Byte;
|
|
{$EXTERNALSYM u_short}
|
|
u_short = Word;
|
|
{$EXTERNALSYM u_int}
|
|
u_int = DWord; //Integer;
|
|
{$EXTERNALSYM u_long}
|
|
u_long = DWORD;
|
|
// The new type to be used in all instances which refer to sockets.
|
|
{$EXTERNALSYM TSocket}
|
|
TSocket = PtrUInt;
|
|
{$EXTERNALSYM WSAEVENT}
|
|
WSAEVENT = THandle;
|
|
{$NODEFINE PWSAEVENT}
|
|
PWSAEVENT = ^WSAEVENT;
|
|
{$EXTERNALSYM LPWSAEVENT}
|
|
LPWSAEVENT = PWSAEVENT;
|
|
|
|
// Must define the following types because the older versions of Delphi do not support them
|
|
|
|
{$IFNDEF HAS_ULONG_PTR}
|
|
{$EXTERNALSYM ULONG_PTR}
|
|
ULONG_PTR = PtrUInt;
|
|
{$ENDIF}
|
|
|
|
{$IFNDEF HAS_DWORD_PTR}
|
|
{$EXTERNALSYM DWORD_PTR}
|
|
DWORD_PTR = PtrUInt;
|
|
{$ENDIF}
|
|
|
|
{$IFNDEF HAS_USHORT}
|
|
{$EXTERNALSYM USHORT}
|
|
USHORT = UInt16;
|
|
{$ENDIF}
|
|
|
|
{$IFNDEF HAS_PVOID}
|
|
{$EXTERNALSYM PVOID}
|
|
PVOID = Pointer;
|
|
{$ENDIF}
|
|
|
|
{$IFNDEF HAS_ULONG64}
|
|
{$EXTERNALSYM ULONG64}
|
|
ULONG64 = UInt64;
|
|
{$ENDIF}
|
|
|
|
{$IFNDEF HAS_LONG}
|
|
{$EXTERNALSYM LONG}
|
|
LONG = Longint;
|
|
{$ENDIF}
|
|
|
|
{$IFNDEF HAS_ULONGLONG}
|
|
{$EXTERNALSYM ULONGLONG}
|
|
ULONGLONG = UInt64;
|
|
{$ENDIF}
|
|
|
|
const
|
|
{$EXTERNALSYM FD_SETSIZE}
|
|
FD_SETSIZE = 64;
|
|
|
|
// the following emits are a workaround to the name conflicts
|
|
// with the winsock2 header files
|
|
(*$HPPEMIT '#include <winsock2.h>'*)
|
|
(*$HPPEMIT '#include <ws2tcpip.h>'*)
|
|
(*$HPPEMIT '#include <wsipx.h>'*)
|
|
(*$HPPEMIT '// workaround for a bug in wsnwlink.h where a couple of commented lines are not terminated property'*)
|
|
(*$HPPEMIT '#pragma option push -C-'*)
|
|
(*$HPPEMIT '#include <wsnwlink.h>'*)
|
|
(*$HPPEMIT '#pragma option pop'*)
|
|
(*$HPPEMIT '#include <wsnetbs.h>'*)
|
|
(*$HPPEMIT '#include <ws2atm.h>'*)
|
|
(*$HPPEMIT '#include <mswsock.h>'*)
|
|
(*$HPPEMIT ''*)
|
|
(*$HPPEMIT 'namespace Idwinsock2'*)
|
|
(*$HPPEMIT '{'*)
|
|
(*$HPPEMIT ' typedef fd_set *PFDSet;'*) // due to name conflict with procedure FD_SET
|
|
(*$HPPEMIT ' typedef fd_set TFDSet;'*) // due to name conflict with procedure FD_SET
|
|
(*$HPPEMIT '}'*)
|
|
(*$HPPEMIT ''*)
|
|
|
|
type
|
|
{$NODEFINE PFDSet}
|
|
PFDSet = ^TFDSet;
|
|
{$NODEFINE TFDSet}
|
|
TFDSet = record
|
|
fd_count: u_int;
|
|
fd_array: array[0..FD_SETSIZE-1] of TSocket;
|
|
end;
|
|
|
|
{$EXTERNALSYM timeval}
|
|
timeval = record
|
|
tv_sec: Longint;
|
|
tv_usec: Longint;
|
|
end;
|
|
{$NODEFINE TTimeVal}
|
|
TTimeVal = timeval;
|
|
{$NODEFINE PTimeVal}
|
|
PTimeVal = ^TTimeVal;
|
|
|
|
const
|
|
{$EXTERNALSYM IOCPARM_MASK}
|
|
IOCPARM_MASK = $7F;
|
|
{$EXTERNALSYM IOC_VOID}
|
|
IOC_VOID = $20000000;
|
|
{$EXTERNALSYM IOC_OUT}
|
|
IOC_OUT = $40000000;
|
|
{$EXTERNALSYM IOC_IN}
|
|
IOC_IN = $80000000;
|
|
{$EXTERNALSYM IOC_INOUT}
|
|
IOC_INOUT = (IOC_IN or IOC_OUT);
|
|
|
|
// get # bytes to read
|
|
{$EXTERNALSYM FIONREAD}
|
|
FIONREAD = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 127; {Do not Localize}
|
|
// set/clear non-blocking i/o
|
|
{$EXTERNALSYM FIONBIO}
|
|
FIONBIO = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 126; {Do not Localize}
|
|
// set/clear async i/o
|
|
{$EXTERNALSYM FIOASYNC}
|
|
FIOASYNC = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 125; {Do not Localize}
|
|
|
|
// Socket I/O Controls
|
|
|
|
// set high watermark
|
|
{$EXTERNALSYM SIOCSHIWAT}
|
|
SIOCSHIWAT = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 0; {Do not Localize}
|
|
// get high watermark
|
|
{$EXTERNALSYM SIOCGHIWAT}
|
|
SIOCGHIWAT = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 1; {Do not Localize}
|
|
// set low watermark
|
|
{$EXTERNALSYM SIOCSLOWAT}
|
|
SIOCSLOWAT = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 2; {Do not Localize}
|
|
// get low watermark
|
|
{$EXTERNALSYM SIOCGLOWAT}
|
|
SIOCGLOWAT = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 3; {Do not Localize}
|
|
// at oob mark?
|
|
{$EXTERNALSYM SIOCATMARK}
|
|
SIOCATMARK = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 7; {Do not Localize}
|
|
|
|
|
|
// Structures returned by network data base library, taken from the
|
|
// BSD file netdb.h. All addresses are supplied in host order, and
|
|
// returned in network order (suitable for use in system calls).
|
|
type
|
|
{$EXTERNALSYM hostent}
|
|
hostent = record
|
|
h_name: PAnsiChar; // official name of host
|
|
h_aliases: ^PAnsiChar; // alias list
|
|
h_addrtype: short; // host address type
|
|
h_length: short; // length of address
|
|
case Byte of
|
|
0: (h_address_list: ^PAnsiChar);
|
|
1: (h_addr: PAnsiChar); // address, for backward compat
|
|
end;
|
|
{$NODEFINE THostEnt}
|
|
THostEnt = hostent;
|
|
{$NODEFINE PHostEnt}
|
|
PHostEnt = ^THostEnt;
|
|
|
|
// It is assumed here that a network number
|
|
// fits in 32 bits.
|
|
{$EXTERNALSYM netent}
|
|
netent = record
|
|
n_name: PAnsiChar; // official name of net
|
|
n_aliases: ^PAnsiChar; // alias list
|
|
n_addrtype: short; // net address type
|
|
n_net: u_long; // network #
|
|
end;
|
|
{$NODEFINE TNetEnt}
|
|
TNetEnt = netent;
|
|
{$NODEFINE PNetEnt}
|
|
PNetEnt = ^TNetEnt;
|
|
|
|
{$EXTERNALSYM servent}
|
|
servent = record
|
|
s_name: PAnsiChar; // official service name
|
|
s_aliases: ^PAnsiChar; // alias list
|
|
{$IFDEF _WIN64}
|
|
s_proto: PAnsiChar; // protocol to use
|
|
s_port: short; // port #
|
|
{$ELSE}
|
|
s_port: short; // port #
|
|
s_proto: PAnsiChar; // protocol to use
|
|
{$ENDIF}
|
|
end;
|
|
{$NODEFINE TServEnt}
|
|
TServEnt = servent;
|
|
{$NODEFINE PServEnt}
|
|
PServEnt = ^TServEnt;
|
|
|
|
{$EXTERNALSYM protoent}
|
|
protoent = record
|
|
p_name: PAnsiChar; // official protocol name
|
|
p_aliases: ^PAnsiChar; // alias list
|
|
p_proto: short; // protocol #
|
|
end;
|
|
{$NODEFINE TProtoEnt}
|
|
TProtoEnt = protoent;
|
|
{$NODEFINE PProtoEnt}
|
|
PProtoEnt = ^TProtoEnt;
|
|
{$EXTERNALSYM NL_ADDRESS_TYPE}
|
|
NL_ADDRESS_TYPE = (
|
|
NlatUnspecified,
|
|
NlatUnicast,
|
|
NlatAnycast,
|
|
NlatMulticast,
|
|
NlatBroadcast,
|
|
NlatInvalid);
|
|
// Constants and structures defined by the internet system,
|
|
// Per RFC 790, September 1981, taken from the BSD file netinet/in.h.
|
|
const
|
|
|
|
// Protocols
|
|
{$EXTERNALSYM IPPROTO_IP}
|
|
IPPROTO_IP = 0; // dummy for IP
|
|
{$EXTERNALSYM IPPROTO_ICMP}
|
|
IPPROTO_ICMP = 1; // control message protocol
|
|
{$EXTERNALSYM IPPROTO_IGMP}
|
|
IPPROTO_IGMP = 2; // group management protocol
|
|
{$EXTERNALSYM IPPROTO_GGP}
|
|
IPPROTO_GGP = 3; // gateway^2 (deprecated)
|
|
{$EXTERNALSYM IPPROTO_TCP}
|
|
IPPROTO_TCP = 6; // TCP
|
|
{$EXTERNALSYM IPPROTO_PUP}
|
|
IPPROTO_PUP = 12; // pup
|
|
{$EXTERNALSYM IPPROTO_UDP}
|
|
IPPROTO_UDP = 17; // UDP - user datagram protocol
|
|
{$EXTERNALSYM IPPROTO_IDP}
|
|
IPPROTO_IDP = 22; // xns idp
|
|
{$EXTERNALSYM IPPROTO_ND}
|
|
IPPROTO_ND = 77; // UNOFFICIAL net disk proto
|
|
|
|
{$EXTERNALSYM IPPROTO_IPV6}
|
|
IPPROTO_IPV6 = 41; // IPv6
|
|
{$EXTERNALSYM IPPROTO_ICLFXBM}
|
|
IPPROTO_ICLFXBM = 78;
|
|
|
|
{$EXTERNALSYM IPPROTO_ICMPV6}
|
|
IPPROTO_ICMPV6 = 58; // control message protocol
|
|
|
|
{$EXTERNALSYM IPPROTO_RAW}
|
|
IPPROTO_RAW = 255; // raw IP packet
|
|
{$EXTERNALSYM IPPROTO_MAX}
|
|
IPPROTO_MAX = 256;
|
|
|
|
// Port/socket numbers: network standard functions
|
|
{$EXTERNALSYM IPPORT_ECHO}
|
|
IPPORT_ECHO = 7;
|
|
{$EXTERNALSYM IPPORT_DISCARD}
|
|
IPPORT_DISCARD = 9;
|
|
{$EXTERNALSYM IPPORT_SYSTAT}
|
|
IPPORT_SYSTAT = 11;
|
|
{$EXTERNALSYM IPPORT_DAYTIME}
|
|
IPPORT_DAYTIME = 13;
|
|
{$EXTERNALSYM IPPORT_NETSTAT}
|
|
IPPORT_NETSTAT = 15;
|
|
{$EXTERNALSYM IPPORT_FTP}
|
|
IPPORT_FTP = 21;
|
|
{$EXTERNALSYM IPPORT_TELNET}
|
|
IPPORT_TELNET = 23;
|
|
{$EXTERNALSYM IPPORT_SMTP}
|
|
IPPORT_SMTP = 25;
|
|
{$EXTERNALSYM IPPORT_TIMESERVER}
|
|
IPPORT_TIMESERVER = 37;
|
|
{$EXTERNALSYM IPPORT_NAMESERVER}
|
|
IPPORT_NAMESERVER = 42;
|
|
{$EXTERNALSYM IPPORT_WHOIS}
|
|
IPPORT_WHOIS = 43;
|
|
{$EXTERNALSYM IPPORT_MTP}
|
|
IPPORT_MTP = 57;
|
|
|
|
// Port/socket numbers: host specific functions
|
|
{$EXTERNALSYM IPPORT_TFTP}
|
|
IPPORT_TFTP = 69;
|
|
{$EXTERNALSYM IPPORT_RJE}
|
|
IPPORT_RJE = 77;
|
|
{$EXTERNALSYM IPPORT_FINGER}
|
|
IPPORT_FINGER = 79;
|
|
{$EXTERNALSYM ipport_ttylink}
|
|
IPPORT_TTYLINK = 87;
|
|
{$EXTERNALSYM IPPORT_SUPDUP}
|
|
IPPORT_SUPDUP = 95;
|
|
|
|
// UNIX TCP sockets
|
|
{$EXTERNALSYM IPPORT_EXECSERVER}
|
|
IPPORT_EXECSERVER = 512;
|
|
{$EXTERNALSYM IPPORT_LOGINSERVER}
|
|
IPPORT_LOGINSERVER = 513;
|
|
{$EXTERNALSYM IPPORT_CMDSERVER}
|
|
IPPORT_CMDSERVER = 514;
|
|
{$EXTERNALSYM IPPORT_EFSSERVER}
|
|
IPPORT_EFSSERVER = 520;
|
|
|
|
// UNIX UDP sockets
|
|
{$EXTERNALSYM IPPORT_BIFFUDP}
|
|
IPPORT_BIFFUDP = 512;
|
|
{$EXTERNALSYM IPPORT_WHOSERVER}
|
|
IPPORT_WHOSERVER = 513;
|
|
{$EXTERNALSYM IPPORT_ROUTESERVER}
|
|
IPPORT_ROUTESERVER = 520;
|
|
|
|
// Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root).
|
|
{$EXTERNALSYM IPPORT_RESERVED}
|
|
IPPORT_RESERVED = 1024;
|
|
|
|
{$EXTERNALSYM IPPORT_REGISTERED_MIN}
|
|
IPPORT_REGISTERED_MIN = IPPORT_RESERVED;
|
|
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM IPPORT_REGISTERED_MAX}
|
|
IPPORT_REGISTERED_MAX = $bfff;
|
|
{$EXTERNALSYM IPPORT_DYNAMIC_MIN}
|
|
IPPORT_DYNAMIC_MIN = $c000;
|
|
{$EXTERNALSYM IPPORT_DYNAMIC_MAX}
|
|
IPPORT_DYNAMIC_MAX = $ffff;
|
|
{$ENDIF}
|
|
|
|
// Link numbers
|
|
{$EXTERNALSYM IMPLINK_IP}
|
|
IMPLINK_IP = 155;
|
|
{$EXTERNALSYM IMPLINK_LOWEXPER}
|
|
IMPLINK_LOWEXPER = 156;
|
|
{$EXTERNALSYM IMPLINK_HIGHEXPER}
|
|
IMPLINK_HIGHEXPER = 158;
|
|
|
|
{$EXTERNALSYM TF_DISCONNECT}
|
|
TF_DISCONNECT = $01;
|
|
{$EXTERNALSYM TF_REUSE_SOCKET}
|
|
TF_REUSE_SOCKET = $02;
|
|
{$EXTERNALSYM TF_WRITE_BEHIND}
|
|
TF_WRITE_BEHIND = $04;
|
|
{$EXTERNALSYM TF_USE_DEFAULT_WORKER}
|
|
TF_USE_DEFAULT_WORKER = $00;
|
|
{$EXTERNALSYM TF_USE_SYSTEM_THREAD}
|
|
TF_USE_SYSTEM_THREAD = $10;
|
|
{$EXTERNALSYM TF_USE_KERNEL_APC}
|
|
TF_USE_KERNEL_APC = $20;
|
|
|
|
// This is used instead of -1, since the TSocket type is unsigned.
|
|
{$EXTERNALSYM INVALID_SOCKET}
|
|
INVALID_SOCKET = TSocket(not(0));
|
|
{$EXTERNALSYM SOCKET_ERROR}
|
|
SOCKET_ERROR = -1;
|
|
|
|
// The following may be used in place of the address family, socket type, or
|
|
// protocol in a call to WSASocket to indicate that the corresponding value
|
|
// should be taken from the supplied WSAPROTOCOL_INFO structure instead of the
|
|
// parameter itself.
|
|
{$EXTERNALSYM FROM_PROTOCOL_INFO}
|
|
FROM_PROTOCOL_INFO = -1;
|
|
|
|
|
|
// Types
|
|
{$EXTERNALSYM SOCK_STREAM}
|
|
SOCK_STREAM = 1; { stream socket }
|
|
{$EXTERNALSYM SOCK_DGRAM}
|
|
SOCK_DGRAM = 2; { datagram socket }
|
|
{$EXTERNALSYM SOCK_RAW}
|
|
SOCK_RAW = 3; { raw-protocol interface }
|
|
{$EXTERNALSYM SOCK_RDM}
|
|
SOCK_RDM = 4; { reliably-delivered message }
|
|
{$EXTERNALSYM SOCK_SEQPACKET}
|
|
SOCK_SEQPACKET = 5; { sequenced packet stream }
|
|
|
|
// option flags per-socket.
|
|
{$EXTERNALSYM SO_DEBUG}
|
|
SO_DEBUG = $0001; // turn on debugging info recording
|
|
{$EXTERNALSYM SO_ACCEPTCONN}
|
|
SO_ACCEPTCONN = $0002; // socket has had listen()
|
|
{$EXTERNALSYM SO_REUSEADDR}
|
|
SO_REUSEADDR = $0004; // allow local address reuse
|
|
{$EXTERNALSYM SO_KEEPALIVE}
|
|
SO_KEEPALIVE = $0008; // keep connections alive
|
|
{$EXTERNALSYM SO_DONTROUTE}
|
|
SO_DONTROUTE = $0010; // just use interface addresses
|
|
{$EXTERNALSYM SO_BROADCAST}
|
|
SO_BROADCAST = $0020; // permit sending of broadcast msgs
|
|
{$EXTERNALSYM SO_USELOOPBACK}
|
|
SO_USELOOPBACK = $0040; // bypass hardware when possible
|
|
{$EXTERNALSYM SO_LINGER}
|
|
SO_LINGER = $0080; // linger on close if data present
|
|
{$EXTERNALSYM SO_OOBINLINE}
|
|
SO_OOBINLINE = $0100; // leave received OOB data in line
|
|
|
|
{$EXTERNALSYM SO_DONTLINGER}
|
|
SO_DONTLINGER = not SO_LINGER;
|
|
{$EXTERNALSYM SO_EXCLUSIVEADDRUSE}
|
|
SO_EXCLUSIVEADDRUSE = not SO_REUSEADDR; // disallow local address reuse
|
|
|
|
// additional options.
|
|
|
|
{$EXTERNALSYM SO_SNDBUF}
|
|
SO_SNDBUF = $1001; // send buffer size
|
|
{$EXTERNALSYM SO_RCVBUF}
|
|
SO_RCVBUF = $1002; // receive buffer size
|
|
{$EXTERNALSYM SO_SNDLOWAT}
|
|
SO_SNDLOWAT = $1003; // send low-water mark
|
|
{$EXTERNALSYM SO_RCVLOWAT}
|
|
SO_RCVLOWAT = $1004; // receive low-water mark
|
|
{$EXTERNALSYM SO_SNDTIMEO}
|
|
SO_SNDTIMEO = $1005; // send timeout
|
|
{$EXTERNALSYM SO_RCVTIMEO}
|
|
SO_RCVTIMEO = $1006; // receive timeout
|
|
{$EXTERNALSYM SO_ERROR}
|
|
SO_ERROR = $1007; // get error status and clear
|
|
{$EXTERNALSYM SO_TYPE}
|
|
SO_TYPE = $1008; // get socket type
|
|
|
|
// options for connect and disconnect data and options.
|
|
// used only by non-tcp/ip transports such as DECNet, OSI TP4, etc.
|
|
{$EXTERNALSYM SO_CONNDATA}
|
|
SO_CONNDATA = $7000;
|
|
{$EXTERNALSYM SO_CONNOPT}
|
|
SO_CONNOPT = $7001;
|
|
{$EXTERNALSYM SO_DISCDATA}
|
|
SO_DISCDATA = $7002;
|
|
{$EXTERNALSYM SO_DISCOPT}
|
|
SO_DISCOPT = $7003;
|
|
{$EXTERNALSYM SO_CONNDATALEN}
|
|
SO_CONNDATALEN = $7004;
|
|
{$EXTERNALSYM SO_CONNOPTLEN}
|
|
SO_CONNOPTLEN = $7005;
|
|
{$EXTERNALSYM SO_DISCDATALEN}
|
|
SO_DISCDATALEN = $7006;
|
|
{$EXTERNALSYM SO_DISCOPTLEN}
|
|
SO_DISCOPTLEN = $7007;
|
|
|
|
// option for opening sockets for synchronous access.
|
|
{$EXTERNALSYM SO_OPENTYPE}
|
|
SO_OPENTYPE = $7008;
|
|
{$EXTERNALSYM SO_SYNCHRONOUS_ALERT}
|
|
SO_SYNCHRONOUS_ALERT = $10;
|
|
{$EXTERNALSYM SO_SYNCHRONOUS_NONALERT}
|
|
SO_SYNCHRONOUS_NONALERT = $20;
|
|
|
|
// other nt-specific options.
|
|
{$EXTERNALSYM SO_MAXDG}
|
|
SO_MAXDG = $7009;
|
|
{$EXTERNALSYM SO_MAXPATHDG}
|
|
SO_MAXPATHDG = $700A;
|
|
{$EXTERNALSYM SO_UPDATE_ACCEPT_CONTEXT}
|
|
SO_UPDATE_ACCEPT_CONTEXT = $700B;
|
|
{$EXTERNALSYM SO_CONNECT_TIME}
|
|
SO_CONNECT_TIME = $700C;
|
|
{$EXTERNALSYM SO_UPDATE_CONNECT_CONTEXT}
|
|
SO_UPDATE_CONNECT_CONTEXT = $7010;
|
|
|
|
// tcp options.
|
|
{$EXTERNALSYM TCP_NODELAY}
|
|
TCP_NODELAY = $0001;
|
|
{$EXTERNALSYM TCP_BSDURGENT}
|
|
TCP_BSDURGENT = $7000;
|
|
|
|
// winsock 2 extension -- new options
|
|
{$EXTERNALSYM SO_GROUP_ID}
|
|
SO_GROUP_ID = $2001; // ID of a socket group
|
|
{$EXTERNALSYM SO_GROUP_PRIORITY}
|
|
SO_GROUP_PRIORITY = $2002; // the relative priority within a group
|
|
{$EXTERNALSYM SO_MAX_MSG_SIZE}
|
|
SO_MAX_MSG_SIZE = $2003; // maximum message size
|
|
{$EXTERNALSYM SO_PROTOCOL_INFOA}
|
|
SO_PROTOCOL_INFOA = $2004; // WSAPROTOCOL_INFOA structure
|
|
{$EXTERNALSYM SO_PROTOCOL_INFOW}
|
|
SO_PROTOCOL_INFOW = $2005; // WSAPROTOCOL_INFOW structure
|
|
{$EXTERNALSYM SO_PROTOCOL_INFO}
|
|
{$IFDEF UNICODE}
|
|
SO_PROTOCOL_INFO = SO_PROTOCOL_INFOW;
|
|
{$ELSE}
|
|
SO_PROTOCOL_INFO = SO_PROTOCOL_INFOA;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM PVD_CONFIG}
|
|
PVD_CONFIG = $3001; // configuration info for service provider
|
|
{$EXTERNALSYM SO_CONDITIONAL_ACCEPT}
|
|
SO_CONDITIONAL_ACCEPT = $3002; // enable true conditional accept:
|
|
// connection is not ack-ed to the
|
|
// other side until conditional
|
|
// function returns CF_ACCEPT
|
|
{$EXTERNALSYM SO_REUSE_UNICASTPORT}
|
|
SO_REUSE_UNICASTPORT = $3007; // defer ephemeral port allocation for
|
|
// outbound connections
|
|
{$EXTERNALSYM SO_REUSE_MULTICASTPORT}
|
|
SO_REUSE_MULTICASTPORT = $3008; // enable port reuse and disable unicast
|
|
//reception.
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM SO_RANDOMIZE_PORT}
|
|
SO_RANDOMIZE_PORT = $3005; // randomize assignment of wildcard ports
|
|
{$EXTERNALSYM SO_PORT_SCALABILITY}
|
|
SO_PORT_SCALABILITY = $3006; // enable port scalability
|
|
{$ENDIF}
|
|
// Address families.
|
|
{$EXTERNALSYM AF_UNSPEC}
|
|
AF_UNSPEC = 0; // unspecified
|
|
{$EXTERNALSYM AF_UNIX}
|
|
AF_UNIX = 1; // local to host (pipes, portals)
|
|
{$EXTERNALSYM AF_INET}
|
|
AF_INET = 2; // internetwork: UDP, TCP, etc.
|
|
{$EXTERNALSYM AF_IMPLINK}
|
|
AF_IMPLINK = 3; // arpanet imp addresses
|
|
{$EXTERNALSYM AF_PUP}
|
|
AF_PUP = 4; // pup protocols: e.g. BSP
|
|
{$EXTERNALSYM AF_CHAOS}
|
|
AF_CHAOS = 5; // mit CHAOS protocols
|
|
{$EXTERNALSYM AF_IPX}
|
|
AF_IPX = 6; // ipx and SPX
|
|
{$EXTERNALSYM AF_NS}
|
|
AF_NS = AF_IPX; // xerOX NS protocols
|
|
{$EXTERNALSYM AF_ISO}
|
|
AF_ISO = 7; // iso protocols
|
|
{$EXTERNALSYM AF_OSI}
|
|
AF_OSI = AF_ISO; // osi is ISO
|
|
{$EXTERNALSYM AF_ECMA}
|
|
AF_ECMA = 8; // european computer manufacturers
|
|
{$EXTERNALSYM AF_DATAKIT}
|
|
AF_DATAKIT = 9; // datakit protocols
|
|
{$EXTERNALSYM AF_CCITT}
|
|
AF_CCITT = 10; // cciTT protocols, X.25 etc
|
|
{$EXTERNALSYM AF_SNA}
|
|
AF_SNA = 11; // ibm SNA
|
|
{$EXTERNALSYM AF_DECNET}
|
|
AF_DECNET = 12; // decnet
|
|
{$EXTERNALSYM AF_DLI}
|
|
AF_DLI = 13; // direct data link interface
|
|
{$EXTERNALSYM AF_LAT}
|
|
AF_LAT = 14; // lat
|
|
{$EXTERNALSYM AF_HYLINK}
|
|
AF_HYLINK = 15; // nsc Hyperchannel
|
|
{$EXTERNALSYM AF_APPLETALK}
|
|
AF_APPLETALK = 16; // appleTalk
|
|
{$EXTERNALSYM AF_NETBIOS}
|
|
AF_NETBIOS = 17; // netBios-style addresses
|
|
{$EXTERNALSYM AF_VOICEVIEW}
|
|
AF_VOICEVIEW = 18; // voiceView
|
|
{$EXTERNALSYM AF_FIREFOX}
|
|
AF_FIREFOX = 19; // fireFox
|
|
{$EXTERNALSYM AF_UNKNOWN1}
|
|
AF_UNKNOWN1 = 20; // somebody is using this!
|
|
{$EXTERNALSYM AF_BAN}
|
|
AF_BAN = 21; // banyan
|
|
{$IFDEF WINCE}
|
|
{$EXTERNALSYM AF_IRDA}
|
|
AF_IRDA = 22; //* IrDA */
|
|
{$ELSE}
|
|
{$EXTERNALSYM AF_ATM}
|
|
AF_ATM = 22; // native ATM Services
|
|
{$ENDIF}
|
|
{$EXTERNALSYM AF_INET6}
|
|
AF_INET6 = 23; // internetwork Version 6
|
|
{$EXTERNALSYM AF_CLUSTER}
|
|
AF_CLUSTER = 24; // microsoft Wolfpack
|
|
{$EXTERNALSYM AF_12844}
|
|
AF_12844 = 25; // ieeE 1284.4 WG AF
|
|
{$IFDEF WINCE}
|
|
{$EXTERNALSYM AF_ATM}
|
|
AF_ATM = 26; //* Native ATM Services */
|
|
{$ELSE}
|
|
{$EXTERNALSYM AF_IRDA}
|
|
AF_IRDA = 26; // irdA
|
|
{$ENDIF}
|
|
{$EXTERNALSYM AF_NETDES}
|
|
AF_NETDES = 28; // network Designers OSI & gateway enabled protocols
|
|
{$EXTERNALSYM AF_TCNPROCESS}
|
|
AF_TCNPROCESS = 29;
|
|
{$EXTERNALSYM AF_TCNMESSAGE}
|
|
AF_TCNMESSAGE = 30;
|
|
{$EXTERNALSYM AF_ICLFXBM}
|
|
AF_ICLFXBM = 31;
|
|
|
|
{$EXTERNALSYM AF_HYPERV}
|
|
AF_HYPERV = 34;
|
|
{$EXTERNALSYM AF_MAX}
|
|
AF_MAX = 35; //was 32
|
|
|
|
// protocol families, same as address families for now.
|
|
|
|
{$EXTERNALSYM PF_UNSPEC}
|
|
PF_UNSPEC = AF_UNSPEC;
|
|
{$EXTERNALSYM PF_UNIX}
|
|
PF_UNIX = AF_UNIX;
|
|
{$EXTERNALSYM PF_INET}
|
|
PF_INET = AF_INET;
|
|
{$EXTERNALSYM PF_IMPLINK}
|
|
PF_IMPLINK = AF_IMPLINK;
|
|
{$EXTERNALSYM PF_PUP}
|
|
PF_PUP = AF_PUP;
|
|
{$EXTERNALSYM PF_CHAOS}
|
|
PF_CHAOS = AF_CHAOS;
|
|
{$EXTERNALSYM PF_NS}
|
|
PF_NS = AF_NS;
|
|
{$EXTERNALSYM PF_IPX}
|
|
PF_IPX = AF_IPX;
|
|
{$EXTERNALSYM PF_ISO}
|
|
PF_ISO = AF_ISO;
|
|
{$EXTERNALSYM PF_OSI}
|
|
PF_OSI = AF_OSI;
|
|
{$EXTERNALSYM PF_ECMA}
|
|
PF_ECMA = AF_ECMA;
|
|
{$EXTERNALSYM PF_DATAKIT}
|
|
PF_DATAKIT = AF_DATAKIT;
|
|
{$EXTERNALSYM PF_CCITT}
|
|
PF_CCITT = AF_CCITT;
|
|
{$EXTERNALSYM PF_SNA}
|
|
PF_SNA = AF_SNA;
|
|
{$EXTERNALSYM PF_DECNET}
|
|
PF_DECNET = AF_DECNET;
|
|
{$EXTERNALSYM PF_DLI}
|
|
PF_DLI = AF_DLI;
|
|
{$EXTERNALSYM PF_LAT}
|
|
PF_LAT = AF_LAT;
|
|
{$EXTERNALSYM PF_HYLINK}
|
|
PF_HYLINK = AF_HYLINK;
|
|
{$EXTERNALSYM PF_APPLETALK}
|
|
PF_APPLETALK = AF_APPLETALK;
|
|
{$EXTERNALSYM PF_VOICEVIEW}
|
|
PF_VOICEVIEW = AF_VOICEVIEW;
|
|
{$EXTERNALSYM PF_FIREFOX}
|
|
PF_FIREFOX = AF_FIREFOX;
|
|
{$EXTERNALSYM PF_UNKNOWN1}
|
|
PF_UNKNOWN1 = AF_UNKNOWN1;
|
|
{$EXTERNALSYM pf_ban}
|
|
PF_BAN = AF_BAN;
|
|
{$EXTERNALSYM PF_ATM}
|
|
PF_ATM = AF_ATM;
|
|
{$EXTERNALSYM PF_INET6}
|
|
PF_INET6 = AF_INET6;
|
|
|
|
{$EXTERNALSYM PF_MAX}
|
|
PF_MAX = AF_MAX;
|
|
|
|
{$EXTERNALSYM _SS_MAXSIZE}
|
|
_SS_MAXSIZE = 128;
|
|
{$EXTERNALSYM _SS_ALIGNSIZE}
|
|
_SS_ALIGNSIZE = SizeOf(Int64);
|
|
{$EXTERNALSYM _SS_PAD1SIZE}
|
|
_SS_PAD1SIZE = _SS_ALIGNSIZE - SizeOf(short);
|
|
{$EXTERNALSYM _SS_PAD2SIZE}
|
|
_SS_PAD2SIZE = _SS_MAXSIZE - (SizeOf(short) + _SS_PAD1SIZE + _SS_ALIGNSIZE);
|
|
|
|
type
|
|
{$NODEFINE SunB}
|
|
SunB = record
|
|
s_b1, s_b2, s_b3, s_b4: u_char;
|
|
end;
|
|
|
|
{$NODEFINE SunW}
|
|
SunW = record
|
|
s_w1, s_w2: u_short;
|
|
end;
|
|
|
|
{$EXTERNALSYM in_addr}
|
|
in_addr = record
|
|
case integer of
|
|
0: (S_un_b: SunB);
|
|
1: (S_un_w: SunW);
|
|
2: (S_addr: u_long);
|
|
end;
|
|
{$NODEFINE TInAddr}
|
|
TInAddr = in_addr;
|
|
{$NODEFINE PInAddr}
|
|
PInAddr = ^TInAddr;
|
|
|
|
// Structure used by kernel to store most addresses.
|
|
|
|
{$EXTERNALSYM sockaddr_in}
|
|
sockaddr_in = record
|
|
case Integer of
|
|
0: (sin_family : u_short;
|
|
sin_port : u_short;
|
|
sin_addr : TInAddr;
|
|
sin_zero : array[0..7] of AnsiChar);
|
|
1: (sa_family : u_short;
|
|
sa_data : array[0..13] of AnsiChar)
|
|
end;
|
|
{$NODEFINE TSockAddrIn}
|
|
TSockAddrIn = sockaddr_in;
|
|
{$NODEFINE PSockAddrIn}
|
|
PSockAddrIn = ^TSockAddrIn;
|
|
{$NODEFINE PSockAddr_In}
|
|
PSockAddr_In = PSockAddrIn;
|
|
{$NODEFINE TSockAddr}
|
|
TSockAddr = TSockAddrIn;
|
|
{$EXTERNALSYM SOCKADDR}
|
|
SOCKADDR = TSockAddr;
|
|
{$EXTERNALSYM PSOCKADDR}
|
|
PSOCKADDR = ^TSockAddr;
|
|
{$EXTERNALSYM LPSOCKADDR}
|
|
LPSOCKADDR = PSOCKADDR;
|
|
|
|
{$EXTERNALSYM SOCKADDR_STORAGE}
|
|
SOCKADDR_STORAGE = record
|
|
ss_family: short; // Address family.
|
|
__ss_pad1: array[0.._SS_PAD1SIZE-1] of AnsiChar; // 6 byte pad, this is to make
|
|
// implementation specific pad up to
|
|
// alignment field that follows explicit
|
|
// in the data structure.
|
|
__ss_align: Int64; // Field to force desired structure.
|
|
__ss_pad2: array[0.._SS_PAD2SIZE-1] of AnsiChar; // 112 byte pad to achieve desired size;
|
|
// _SS_MAXSIZE value minus size of
|
|
// ss_family, __ss_pad1, and
|
|
// __ss_align fields is 112.
|
|
end;
|
|
{$NODEFINE TSockAddrStorage}
|
|
TSockAddrStorage = SOCKADDR_STORAGE;
|
|
{$NODEFINE PSockAddrStorage}
|
|
PSockAddrStorage = ^TSockAddrStorage;
|
|
{$EXTERNALSYM PSOCKADDR_STORAGE}
|
|
PSOCKADDR_STORAGE = PSockAddrStorage;
|
|
{$EXTERNALSYM LPSOCKADDR_STORAGE}
|
|
LPSOCKADDR_STORAGE = PSOCKADDR_STORAGE;
|
|
|
|
// Structure used by kernel to pass protocol information in raw sockets.
|
|
{$EXTERNALSYM sockproto}
|
|
sockproto = record
|
|
sp_family : u_short;
|
|
sp_protocol : u_short;
|
|
end;
|
|
{$NODEFINE TSockProto}
|
|
TSockProto = sockproto;
|
|
{$NODEFINE PSockProto}
|
|
PSockProto = ^TSockProto;
|
|
|
|
// Structure used for manipulating linger option.
|
|
{$EXTERNALSYM linger}
|
|
linger = record
|
|
l_onoff: u_short;
|
|
l_linger: u_short;
|
|
end;
|
|
{$NODEFINE TLinger}
|
|
TLinger = linger;
|
|
{$EXTERNALSYM PLINGER}
|
|
PLINGER = ^TLinger;
|
|
{$EXTERNALSYM LPLINGER}
|
|
LPLINGER = PLINGER;
|
|
|
|
const
|
|
{$EXTERNALSYM INADDR_ANY}
|
|
INADDR_ANY = $00000000;
|
|
{$EXTERNALSYM INADDR_LOOPBACK}
|
|
INADDR_LOOPBACK = $7F000001;
|
|
{$EXTERNALSYM INADDR_BROADCAST}
|
|
INADDR_BROADCAST = $FFFFFFFF;
|
|
{$EXTERNALSYM INADDR_NONE}
|
|
INADDR_NONE = $FFFFFFFF;
|
|
|
|
{$EXTERNALSYM ADDR_ANY}
|
|
ADDR_ANY = INADDR_ANY;
|
|
|
|
{$EXTERNALSYM SOL_SOCKET}
|
|
SOL_SOCKET = $FFFF; // options for socket level
|
|
|
|
{$EXTERNALSYM MSG_OOB}
|
|
MSG_OOB = $1; // process out-of-band data
|
|
{$EXTERNALSYM MSG_PEEK}
|
|
MSG_PEEK = $2; // peek at incoming message
|
|
{$EXTERNALSYM MSG_DONTROUTE}
|
|
MSG_DONTROUTE = $4; // send without using routing tables
|
|
|
|
{$EXTERNALSYM MSG_PARTIAL}
|
|
MSG_PARTIAL = $8000; // partial send or recv for message xport
|
|
|
|
// WinSock 2 extension -- new flags for WSASend(), WSASendTo(), WSARecv() and WSARecvFrom()
|
|
{$EXTERNALSYM MSG_INTERRUPT}
|
|
MSG_INTERRUPT = $10; // send/recv in the interrupt context
|
|
{$EXTERNALSYM MSG_MAXIOVLEN}
|
|
MSG_MAXIOVLEN = 16;
|
|
|
|
// Define constant based on rfc883, used by gethostbyxxxx() calls.
|
|
|
|
{$EXTERNALSYM MAXGETHOSTSTRUCT}
|
|
MAXGETHOSTSTRUCT = 1024;
|
|
|
|
// Maximum queue length specifiable by listen.
|
|
{$EXTERNALSYM SOMAXCONN}
|
|
SOMAXCONN = $7FFFFFFF;
|
|
|
|
// WinSock 2 extension -- bit values and indices for FD_XXX network events
|
|
{$EXTERNALSYM FD_READ_BIT}
|
|
FD_READ_BIT = 0;
|
|
{$EXTERNALSYM FD_WRITE_BIT}
|
|
FD_WRITE_BIT = 1;
|
|
{$EXTERNALSYM FD_OOB_BIT}
|
|
FD_OOB_BIT = 2;
|
|
{$EXTERNALSYM FD_ACCEPT_BIT}
|
|
FD_ACCEPT_BIT = 3;
|
|
{$EXTERNALSYM FD_CONNECT_BIT}
|
|
FD_CONNECT_BIT = 4;
|
|
{$EXTERNALSYM FD_CLOSE_BIT}
|
|
FD_CLOSE_BIT = 5;
|
|
{$EXTERNALSYM fd_qos_bit}
|
|
FD_QOS_BIT = 6;
|
|
{$EXTERNALSYM FD_GROUP_QOS_BIT}
|
|
FD_GROUP_QOS_BIT = 7;
|
|
{$EXTERNALSYM FD_ROUTING_INTERFACE_CHANGE_BIT}
|
|
FD_ROUTING_INTERFACE_CHANGE_BIT = 8;
|
|
{$EXTERNALSYM FD_ADDRESS_LIST_CHANGE_BIT}
|
|
FD_ADDRESS_LIST_CHANGE_BIT = 9;
|
|
|
|
{$EXTERNALSYM FD_MAX_EVENTS}
|
|
FD_MAX_EVENTS = 10;
|
|
|
|
{$EXTERNALSYM FD_READ}
|
|
FD_READ = (1 shl FD_READ_BIT);
|
|
{$EXTERNALSYM FD_WRITE}
|
|
FD_WRITE = (1 shl FD_WRITE_BIT);
|
|
{$EXTERNALSYM FD_OOB}
|
|
FD_OOB = (1 shl FD_OOB_BIT);
|
|
{$EXTERNALSYM FD_ACCEPT}
|
|
FD_ACCEPT = (1 shl FD_ACCEPT_BIT);
|
|
{$EXTERNALSYM FD_CONNECT}
|
|
FD_CONNECT = (1 shl FD_CONNECT_BIT);
|
|
{$EXTERNALSYM FD_CLOSE}
|
|
FD_CLOSE = (1 shl FD_CLOSE_BIT);
|
|
{$EXTERNALSYM FD_QOS}
|
|
FD_QOS = (1 shl FD_QOS_BIT);
|
|
{$EXTERNALSYM FD_GROUP_QOS}
|
|
FD_GROUP_QOS = (1 shl FD_GROUP_QOS_BIT);
|
|
{$EXTERNALSYM FD_ROUTING_INTERFACE_CHANGE}
|
|
FD_ROUTING_INTERFACE_CHANGE = (1 shl FD_ROUTING_INTERFACE_CHANGE_BIT);
|
|
{$EXTERNALSYM FD_ADDRESS_LIST_CHANGE}
|
|
FD_ADDRESS_LIST_CHANGE = (1 shl FD_ADDRESS_LIST_CHANGE_BIT);
|
|
|
|
{$EXTERNALSYM FD_ALL_EVENTS}
|
|
FD_ALL_EVENTS = (1 shl FD_MAX_EVENTS) - 1;
|
|
|
|
// All Windows Sockets error constants are biased by WSABASEERR from the "normal"
|
|
|
|
{$EXTERNALSYM WSABASEERR}
|
|
WSABASEERR = 10000;
|
|
|
|
// Windows Sockets definitions of regular Microsoft C error constants
|
|
|
|
{$EXTERNALSYM WSAEINTR}
|
|
WSAEINTR = WSABASEERR+ 4;
|
|
{$EXTERNALSYM WSAEBADF}
|
|
WSAEBADF = WSABASEERR+ 9;
|
|
{$EXTERNALSYM WSAEACCES}
|
|
WSAEACCES = WSABASEERR+ 13;
|
|
{$EXTERNALSYM WSAEFAULT}
|
|
WSAEFAULT = WSABASEERR+ 14;
|
|
{$EXTERNALSYM WSAEINVAL}
|
|
WSAEINVAL = WSABASEERR+ 22;
|
|
{$EXTERNALSYM WSAEMFILE}
|
|
WSAEMFILE = WSABASEERR+ 24;
|
|
|
|
// Windows Sockets definitions of regular Berkeley error constants
|
|
|
|
{$EXTERNALSYM WSAEWOULDBLOCK}
|
|
WSAEWOULDBLOCK = WSABASEERR+ 35;
|
|
{$EXTERNALSYM WSAEINPROGRESS}
|
|
WSAEINPROGRESS = WSABASEERR+ 36;
|
|
{$EXTERNALSYM WSAEALREADY}
|
|
WSAEALREADY = WSABASEERR+ 37;
|
|
{$EXTERNALSYM WSAENOTSOCK}
|
|
WSAENOTSOCK = WSABASEERR+ 38;
|
|
{$EXTERNALSYM WSAEDESTADDRREQ}
|
|
WSAEDESTADDRREQ = WSABASEERR+ 39;
|
|
{$EXTERNALSYM WSAEMSGSIZE}
|
|
WSAEMSGSIZE = WSABASEERR+ 40;
|
|
{$EXTERNALSYM WSAEPROTOTYPE}
|
|
WSAEPROTOTYPE = WSABASEERR+ 41;
|
|
{$EXTERNALSYM WSAENOPROTOOPT}
|
|
WSAENOPROTOOPT = WSABASEERR+ 42;
|
|
{$EXTERNALSYM WSAEPROTONOSUPPORT}
|
|
WSAEPROTONOSUPPORT = WSABASEERR+ 43;
|
|
{$EXTERNALSYM WSAESOCKTNOSUPPORT}
|
|
WSAESOCKTNOSUPPORT = WSABASEERR+ 44;
|
|
{$EXTERNALSYM WSAEOPNOTSUPP}
|
|
WSAEOPNOTSUPP = WSABASEERR+ 45;
|
|
{$EXTERNALSYM WSAEPFNOSUPPORT}
|
|
WSAEPFNOSUPPORT = WSABASEERR+ 46;
|
|
{$EXTERNALSYM WSAEAFNOSUPPORT}
|
|
WSAEAFNOSUPPORT = WSABASEERR+ 47;
|
|
{$EXTERNALSYM WSAEADDRINUSE}
|
|
WSAEADDRINUSE = WSABASEERR+ 48;
|
|
{$EXTERNALSYM WSAEADDRNOTAVAIL}
|
|
WSAEADDRNOTAVAIL = WSABASEERR+ 49;
|
|
{$EXTERNALSYM WSAENETDOWN}
|
|
WSAENETDOWN = WSABASEERR+ 50;
|
|
{$EXTERNALSYM WSAENETUNREACH}
|
|
WSAENETUNREACH = WSABASEERR+ 51;
|
|
{$EXTERNALSYM WSAENETRESET}
|
|
WSAENETRESET = WSABASEERR+ 52;
|
|
{$EXTERNALSYM WSAECONNABORTED}
|
|
WSAECONNABORTED = WSABASEERR+ 53;
|
|
{$EXTERNALSYM WSAECONNRESET}
|
|
WSAECONNRESET = WSABASEERR+ 54;
|
|
{$EXTERNALSYM WSAENOBUFS}
|
|
WSAENOBUFS = WSABASEERR+ 55;
|
|
{$EXTERNALSYM WSAEISCONN}
|
|
WSAEISCONN = WSABASEERR+ 56;
|
|
{$EXTERNALSYM WSAENOTCONN}
|
|
WSAENOTCONN = WSABASEERR+ 57;
|
|
{$EXTERNALSYM WSAESHUTDOWN}
|
|
WSAESHUTDOWN = WSABASEERR+ 58;
|
|
{$EXTERNALSYM WSAETOOMANYREFS}
|
|
WSAETOOMANYREFS = WSABASEERR+ 59;
|
|
{$EXTERNALSYM WSAETIMEDOUT}
|
|
WSAETIMEDOUT = WSABASEERR+ 60;
|
|
{$EXTERNALSYM WSAECONNREFUSED}
|
|
WSAECONNREFUSED = WSABASEERR+ 61;
|
|
{$EXTERNALSYM WSAELOOP}
|
|
WSAELOOP = WSABASEERR+ 62;
|
|
{$EXTERNALSYM WSAENAMETOOLONG}
|
|
WSAENAMETOOLONG = WSABASEERR+ 63;
|
|
{$EXTERNALSYM WSAEHOSTDOWN}
|
|
WSAEHOSTDOWN = WSABASEERR+ 64;
|
|
{$EXTERNALSYM WSAEHOSTUNREACH}
|
|
WSAEHOSTUNREACH = WSABASEERR+ 65;
|
|
{$EXTERNALSYM wsaenotempty}
|
|
WSAENOTEMPTY = WSABASEERR+ 66;
|
|
{$EXTERNALSYM WSAEPROCLIM}
|
|
WSAEPROCLIM = WSABASEERR+ 67;
|
|
{$EXTERNALSYM WSAEUSERS}
|
|
WSAEUSERS = WSABASEERR+ 68;
|
|
{$EXTERNALSYM WSAEDQUOT}
|
|
WSAEDQUOT = WSABASEERR+ 69;
|
|
{$EXTERNALSYM WSAESTALE}
|
|
WSAESTALE = WSABASEERR+ 70;
|
|
{$EXTERNALSYM WSAEREMOTE}
|
|
WSAEREMOTE = WSABASEERR+ 71;
|
|
|
|
// Extended Windows Sockets error constant definitions
|
|
|
|
{$EXTERNALSYM WSASYSNOTREADY}
|
|
WSASYSNOTREADY = WSABASEERR+ 91;
|
|
{$EXTERNALSYM WSAVERNOTSUPPORTED}
|
|
WSAVERNOTSUPPORTED = WSABASEERR+ 92;
|
|
{$EXTERNALSYM WSANOTINITIALISED}
|
|
WSANOTINITIALISED = WSABASEERR+ 93;
|
|
{$EXTERNALSYM WSAEDISCON}
|
|
WSAEDISCON = WSABASEERR+101;
|
|
{$EXTERNALSYM WSAENOMORE}
|
|
WSAENOMORE = WSABASEERR+102;
|
|
{$EXTERNALSYM WSAECANCELLED}
|
|
WSAECANCELLED = WSABASEERR+103;
|
|
{$EXTERNALSYM WSAEINVALIDPROCTABLE}
|
|
WSAEINVALIDPROCTABLE = WSABASEERR+104;
|
|
{$EXTERNALSYM WSAEINVALIDPROVIDER}
|
|
WSAEINVALIDPROVIDER = WSABASEERR+105;
|
|
{$EXTERNALSYM WSAEPROVIDERFAILEDINIT}
|
|
WSAEPROVIDERFAILEDINIT = WSABASEERR+106;
|
|
{$EXTERNALSYM WSASYSCALLFAILURE}
|
|
WSASYSCALLFAILURE = WSABASEERR+107;
|
|
{$EXTERNALSYM WSASERVICE_NOT_FOUND}
|
|
WSASERVICE_NOT_FOUND = WSABASEERR+108;
|
|
{$EXTERNALSYM WSATYPE_NOT_FOUND}
|
|
WSATYPE_NOT_FOUND = WSABASEERR+109;
|
|
{$EXTERNALSYM WSA_E_NO_MORE}
|
|
WSA_E_NO_MORE = WSABASEERR+110;
|
|
{$EXTERNALSYM WSA_E_CANCELLED}
|
|
WSA_E_CANCELLED = WSABASEERR+111;
|
|
{$EXTERNALSYM WSAEREFUSED}
|
|
WSAEREFUSED = WSABASEERR+112;
|
|
|
|
{$IFDEF WINCE}
|
|
WSAEDUPLICATE_NAME = WSABASEERR+900;
|
|
{$ENDIF}
|
|
|
|
{ Error return codes from gethostbyname() and gethostbyaddr()
|
|
(when using the resolver). Note that these errors are
|
|
retrieved via WSAGetLastError() and must therefore follow
|
|
the rules for avoiding clashes with error numbers from
|
|
specific implementations or language run-time systems.
|
|
For this reason the codes are based at WSABASEERR+1001.
|
|
Note also that [WSA]NO_ADDRESS is defined only for
|
|
compatibility purposes. }
|
|
|
|
// Authoritative Answer: Host not found
|
|
{$EXTERNALSYM WSAHOST_NOT_FOUND}
|
|
WSAHOST_NOT_FOUND = WSABASEERR+1001;
|
|
{$EXTERNALSYM HOST_NOT_FOUND}
|
|
HOST_NOT_FOUND = WSAHOST_NOT_FOUND;
|
|
|
|
// Non-Authoritative: Host not found, or SERVERFAIL
|
|
{$EXTERNALSYM WSATRY_AGAIN}
|
|
WSATRY_AGAIN = WSABASEERR+1002;
|
|
{$EXTERNALSYM TRY_AGAIN}
|
|
TRY_AGAIN = WSATRY_AGAIN;
|
|
|
|
// Non recoverable errors, FORMERR, REFUSED, NOTIMP
|
|
{$EXTERNALSYM WSANO_RECOVERY}
|
|
WSANO_RECOVERY = WSABASEERR+1003;
|
|
{$EXTERNALSYM NO_RECOVERY}
|
|
NO_RECOVERY = WSANO_RECOVERY;
|
|
|
|
// Valid name, no data record of requested type
|
|
{$EXTERNALSYM WSANO_DATA}
|
|
WSANO_DATA = WSABASEERR+1004;
|
|
{$EXTERNALSYM NO_DATA}
|
|
NO_DATA = WSANO_DATA;
|
|
|
|
// no address, look for MX record
|
|
{$EXTERNALSYM WSANO_ADDRESS}
|
|
WSANO_ADDRESS = WSANO_DATA;
|
|
{$EXTERNALSYM NO_ADDRESS}
|
|
NO_ADDRESS = WSANO_ADDRESS;
|
|
|
|
// Define QOS related error return codes
|
|
|
|
{$EXTERNALSYM WSA_QOS_RECEIVERS}
|
|
WSA_QOS_RECEIVERS = WSABASEERR+1005; // at least one reserve has arrived
|
|
{$EXTERNALSYM WSA_QOS_SENDERS}
|
|
WSA_QOS_SENDERS = WSABASEERR+1006; // at least one path has arrived
|
|
{$EXTERNALSYM WSA_QOS_NO_SENDERS}
|
|
WSA_QOS_NO_SENDERS = WSABASEERR+1007; // there are no senders
|
|
{$EXTERNALSYM WSA_QOS_NO_RECEIVERS}
|
|
WSA_QOS_NO_RECEIVERS = WSABASEERR+1008; // there are no receivers
|
|
{$EXTERNALSYM WSA_QOS_REQUEST_CONFIRMED}
|
|
WSA_QOS_REQUEST_CONFIRMED = WSABASEERR+1009; // reserve has been confirmed
|
|
{$EXTERNALSYM WSA_QOS_ADMISSION_FAILURE}
|
|
WSA_QOS_ADMISSION_FAILURE = WSABASEERR+1010; // error due to lack of resources
|
|
{$EXTERNALSYM WSA_QOS_POLICY_FAILURE}
|
|
WSA_QOS_POLICY_FAILURE = WSABASEERR+1011; // rejected for administrative reasons - bad credentials
|
|
{$EXTERNALSYM WSA_QOS_BAD_STYLE}
|
|
WSA_QOS_BAD_STYLE = WSABASEERR+1012; // unknown or conflicting style
|
|
{$EXTERNALSYM WSA_QOS_BAD_OBJECT}
|
|
WSA_QOS_BAD_OBJECT = WSABASEERR+1013; // problem with some part of the filterspec or providerspecific buffer in general
|
|
{$EXTERNALSYM WSA_QOS_TRAFFIC_CTRL_ERROR}
|
|
WSA_QOS_TRAFFIC_CTRL_ERROR = WSABASEERR+1014; // problem with some part of the flowspec
|
|
{$EXTERNALSYM WSA_QOS_GENERIC_ERROR}
|
|
WSA_QOS_GENERIC_ERROR = WSABASEERR+1015; // general error
|
|
{$EXTERNALSYM WSA_QOS_ESERVICETYPE}
|
|
WSA_QOS_ESERVICETYPE = WSABASEERR+1016; // invalid service type in flowspec
|
|
{$EXTERNALSYM WSA_QOS_EFLOWSPEC}
|
|
WSA_QOS_EFLOWSPEC = WSABASEERR+1017; // invalid flowspec
|
|
{$EXTERNALSYM WSA_QOS_EPROVSPECBUF}
|
|
WSA_QOS_EPROVSPECBUF = WSABASEERR+1018; // invalid provider specific buffer
|
|
{$EXTERNALSYM WSA_QOS_EFILTERSTYLE}
|
|
WSA_QOS_EFILTERSTYLE = WSABASEERR+1019; // invalid filter style
|
|
{$EXTERNALSYM WSA_QOS_EFILTERTYPE}
|
|
WSA_QOS_EFILTERTYPE = WSABASEERR+1020; // invalid filter type
|
|
{$EXTERNALSYM WSA_QOS_EFILTERCOUNT}
|
|
WSA_QOS_EFILTERCOUNT = WSABASEERR+1021; // incorrect number of filters
|
|
{$EXTERNALSYM WSA_QOS_EOBJLENGTH}
|
|
WSA_QOS_EOBJLENGTH = WSABASEERR+1022; // invalid object length
|
|
{$EXTERNALSYM WSA_QOS_EFLOWCOUNT}
|
|
WSA_QOS_EFLOWCOUNT = WSABASEERR+1023; // incorrect number of flows
|
|
{$EXTERNALSYM WSA_QOS_EUNKOWNPSOBJ}
|
|
WSA_QOS_EUNKOWNPSOBJ = WSABASEERR+1024; // unknown object in provider specific buffer
|
|
{$EXTERNALSYM WSA_QOS_EPOLICYOBJ}
|
|
WSA_QOS_EPOLICYOBJ = WSABASEERR+1025; // invalid policy object in provider specific buffer
|
|
{$EXTERNALSYM WSA_QOS_EFLOWDESC}
|
|
WSA_QOS_EFLOWDESC = WSABASEERR+1026; // invalid flow descriptor in the list
|
|
{$EXTERNALSYM WSA_QOS_EPSFLOWSPEC}
|
|
WSA_QOS_EPSFLOWSPEC = WSABASEERR+1027; // inconsistent flow spec in provider specific buffer
|
|
{$EXTERNALSYM WSA_QOS_EPSFILTERSPEC}
|
|
WSA_QOS_EPSFILTERSPEC = WSABASEERR+1028; // invalid filter spec in provider specific buffer
|
|
{$EXTERNALSYM WSA_QOS_ESDMODEOBJ}
|
|
WSA_QOS_ESDMODEOBJ = WSABASEERR+1029; // invalid shape discard mode object in provider specific buffer
|
|
{$EXTERNALSYM WSA_QOS_ESHAPERATEOBJ}
|
|
WSA_QOS_ESHAPERATEOBJ = WSABASEERR+1030; // invalid shaping rate object in provider specific buffer
|
|
{$EXTERNALSYM WSA_QOS_RESERVED_PETYPE}
|
|
WSA_QOS_RESERVED_PETYPE = WSABASEERR+1031; // reserved policy element in provider specific buffer
|
|
|
|
|
|
{ WinSock 2 extension -- new error codes and type definition }
|
|
{$EXTERNALSYM WSA_IO_PENDING}
|
|
WSA_IO_PENDING = ERROR_IO_PENDING;
|
|
{$EXTERNALSYM WSA_IO_INCOMPLETE}
|
|
WSA_IO_INCOMPLETE = ERROR_IO_INCOMPLETE;
|
|
{$EXTERNALSYM WSA_INVALID_HANDLE}
|
|
WSA_INVALID_HANDLE = ERROR_INVALID_HANDLE;
|
|
{$EXTERNALSYM WSA_INVALID_PARAMETER}
|
|
WSA_INVALID_PARAMETER = ERROR_INVALID_PARAMETER;
|
|
{$EXTERNALSYM WSA_NOT_ENOUGH_MEMORY}
|
|
WSA_NOT_ENOUGH_MEMORY = ERROR_NOT_ENOUGH_MEMORY;
|
|
{$EXTERNALSYM WSA_OPERATION_ABORTED}
|
|
WSA_OPERATION_ABORTED = ERROR_OPERATION_ABORTED;
|
|
{$EXTERNALSYM WSA_INVALID_EVENT}
|
|
WSA_INVALID_EVENT = WSAEVENT(nil);
|
|
{$EXTERNALSYM WSA_MAXIMUM_WAIT_EVENTS}
|
|
WSA_MAXIMUM_WAIT_EVENTS = MAXIMUM_WAIT_OBJECTS;
|
|
{$EXTERNALSYM WSA_WAIT_FAILED}
|
|
WSA_WAIT_FAILED = $FFFFFFFF;
|
|
{$EXTERNALSYM WSA_WAIT_EVENT_0}
|
|
WSA_WAIT_EVENT_0 = WAIT_OBJECT_0;
|
|
{$EXTERNALSYM WSA_WAIT_IO_COMPLETION}
|
|
WSA_WAIT_IO_COMPLETION = WAIT_IO_COMPLETION;
|
|
{$EXTERNALSYM WSA_WAIT_TIMEOUT}
|
|
WSA_WAIT_TIMEOUT = WAIT_TIMEOUT;
|
|
{$EXTERNALSYM WSA_INFINITE}
|
|
WSA_INFINITE = INFINITE;
|
|
|
|
{ Windows Sockets errors redefined as regular Berkeley error constants.
|
|
These are commented out in Windows NT to avoid conflicts with errno.h.
|
|
Use the WSA constants instead. }
|
|
|
|
{$EXTERNALSYM EWOULDBLOCK}
|
|
EWOULDBLOCK = WSAEWOULDBLOCK;
|
|
{$EXTERNALSYM EINPROGRESS}
|
|
EINPROGRESS = WSAEINPROGRESS;
|
|
{$EXTERNALSYM EALREADY}
|
|
EALREADY = WSAEALREADY;
|
|
{$EXTERNALSYM ENOTSOCK}
|
|
ENOTSOCK = WSAENOTSOCK;
|
|
{$EXTERNALSYM EDESTADDRREQ}
|
|
EDESTADDRREQ = WSAEDESTADDRREQ;
|
|
{$EXTERNALSYM EMSGSIZE}
|
|
EMSGSIZE = WSAEMSGSIZE;
|
|
{$EXTERNALSYM EPROTOTYPE}
|
|
EPROTOTYPE = WSAEPROTOTYPE;
|
|
{$EXTERNALSYM ENOPROTOOPT}
|
|
ENOPROTOOPT = WSAENOPROTOOPT;
|
|
{$EXTERNALSYM EPROTONOSUPPORT}
|
|
EPROTONOSUPPORT = WSAEPROTONOSUPPORT;
|
|
{$EXTERNALSYM ESOCKTNOSUPPORT}
|
|
ESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT;
|
|
{$EXTERNALSYM EOPNOTSUPP}
|
|
EOPNOTSUPP = WSAEOPNOTSUPP;
|
|
{$EXTERNALSYM EPFNOSUPPORT}
|
|
EPFNOSUPPORT = WSAEPFNOSUPPORT;
|
|
{$EXTERNALSYM EAFNOSUPPORT}
|
|
EAFNOSUPPORT = WSAEAFNOSUPPORT;
|
|
{$EXTERNALSYM EADDRINUSE}
|
|
EADDRINUSE = WSAEADDRINUSE;
|
|
{$EXTERNALSYM EADDRNOTAVAIL}
|
|
EADDRNOTAVAIL = WSAEADDRNOTAVAIL;
|
|
{$EXTERNALSYM ENETDOWN}
|
|
ENETDOWN = WSAENETDOWN;
|
|
{$EXTERNALSYM ENETUNREACH}
|
|
ENETUNREACH = WSAENETUNREACH;
|
|
{$EXTERNALSYM ENETRESET}
|
|
ENETRESET = WSAENETRESET;
|
|
{$EXTERNALSYM ECONNABORTED}
|
|
ECONNABORTED = WSAECONNABORTED;
|
|
{$EXTERNALSYM ECONNRESET}
|
|
ECONNRESET = WSAECONNRESET;
|
|
{$EXTERNALSYM ENOBUFS}
|
|
ENOBUFS = WSAENOBUFS;
|
|
{$EXTERNALSYM EISCONN}
|
|
EISCONN = WSAEISCONN;
|
|
{$EXTERNALSYM ENOTCONN}
|
|
ENOTCONN = WSAENOTCONN;
|
|
{$EXTERNALSYM ESHUTDOWN}
|
|
ESHUTDOWN = WSAESHUTDOWN;
|
|
{$EXTERNALSYM ETOOMANYREFS}
|
|
ETOOMANYREFS = WSAETOOMANYREFS;
|
|
{$EXTERNALSYM ETIMEDOUT}
|
|
ETIMEDOUT = WSAETIMEDOUT;
|
|
{$EXTERNALSYM ECONNREFUSED}
|
|
ECONNREFUSED = WSAECONNREFUSED;
|
|
{$EXTERNALSYM ELOOP}
|
|
ELOOP = WSAELOOP;
|
|
{$EXTERNALSYM ENAMETOOLONG}
|
|
ENAMETOOLONG = WSAENAMETOOLONG;
|
|
{$EXTERNALSYM EHOSTDOWN}
|
|
EHOSTDOWN = WSAEHOSTDOWN;
|
|
{$EXTERNALSYM EHOSTUNREACH}
|
|
EHOSTUNREACH = WSAEHOSTUNREACH;
|
|
{$EXTERNALSYM ENOTEMPTY}
|
|
ENOTEMPTY = WSAENOTEMPTY;
|
|
{$EXTERNALSYM EPROCLIM}
|
|
EPROCLIM = WSAEPROCLIM;
|
|
{$EXTERNALSYM EUSERS}
|
|
EUSERS = WSAEUSERS;
|
|
{$EXTERNALSYM EDQUOT}
|
|
EDQUOT = WSAEDQUOT;
|
|
{$EXTERNALSYM ESTALE}
|
|
ESTALE = WSAESTALE;
|
|
{$EXTERNALSYM EREMOTE}
|
|
EREMOTE = WSAEREMOTE;
|
|
|
|
{$EXTERNALSYM WSADESCRIPTION_LEN}
|
|
WSADESCRIPTION_LEN = 256;
|
|
{$EXTERNALSYM WSASYS_STATUS_LEN}
|
|
WSASYS_STATUS_LEN = 128;
|
|
|
|
type
|
|
{$EXTERNALSYM WSADATA}
|
|
WSADATA = record
|
|
wVersion : Word;
|
|
wHighVersion : Word;
|
|
{$IFDEF _WIN64}
|
|
iMaxSockets : Word;
|
|
iMaxUdpDg : Word;
|
|
lpVendorInfo : PAnsiChar;
|
|
szDescription : array[0..WSADESCRIPTION_LEN] of AnsiChar;
|
|
szSystemStatus : array[0..WSASYS_STATUS_LEN] of AnsiChar;
|
|
{$ELSE}
|
|
szDescription : array[0..WSADESCRIPTION_LEN] of AnsiChar;
|
|
szSystemStatus : array[0..WSASYS_STATUS_LEN] of AnsiChar;
|
|
iMaxSockets : Word;
|
|
iMaxUdpDg : Word;
|
|
lpVendorInfo : PAnsiChar;
|
|
{$ENDIF}
|
|
end;
|
|
{$NODEFINE TWSAData}
|
|
TWSAData = WSADATA;
|
|
{$NODEFINE PWSAData}
|
|
PWSAData = ^TWSAData;
|
|
{$EXTERNALSYM LPWSADATA}
|
|
LPWSADATA = PWSAData;
|
|
|
|
{$EXTERNALSYM WSAOVERLAPPED}
|
|
WSAOVERLAPPED = TOverlapped;
|
|
{$NODEFINE TWSAOverlapped}
|
|
TWSAOverlapped = WSAOVERLAPPED;
|
|
{$NODEFINE PWSAOverlapped}
|
|
PWSAOverlapped = ^TWSAOverlapped;
|
|
{$EXTERNALSYM LPWSAOVERLAPPED}
|
|
LPWSAOVERLAPPED = PWSAOverlapped;
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM WSC_PROVIDER_INFO_TYPE}
|
|
{$EXTERNALSYM ProviderInfoLspCategories}
|
|
{$EXTERNALSYM ProviderInfoAudit}
|
|
WSC_PROVIDER_INFO_TYPE = (
|
|
ProviderInfoLspCategories,
|
|
ProviderInfoAudit);
|
|
{$ENDIF}
|
|
|
|
{ WinSock 2 extension -- WSABUF and QOS struct, include qos.h }
|
|
{ to pull in FLOWSPEC and related definitions }
|
|
|
|
{$EXTERNALSYM WSABUF}
|
|
WSABUF = record
|
|
len: u_long; { the length of the buffer }
|
|
buf: PAnsiChar; { the pointer to the buffer }
|
|
end;
|
|
{$NODEFINE TWSABuf}
|
|
TWSABuf = WSABUF;
|
|
{$NODEFINE PWSABuf}
|
|
PWSABuf = ^TWSABuf;
|
|
{$EXTERNALSYM LPWSABUF}
|
|
LPWSABUF = PWSABUF;
|
|
|
|
{$EXTERNALSYM SERVICETYPE}
|
|
SERVICETYPE = ULONG;
|
|
{$NODEFINE TServiceType}
|
|
TServiceType = SERVICETYPE;
|
|
|
|
{$EXTERNALSYM FLOWSPEC}
|
|
FLOWSPEC = record
|
|
TokenRate, // In Bytes/sec
|
|
TokenBucketSize, // In Bytes
|
|
PeakBandwidth, // In Bytes/sec
|
|
Latency, // In microseconds
|
|
DelayVariation : ULONG; // In microseconds
|
|
ServiceType : TServiceType;
|
|
MaxSduSize, MinimumPolicedSize : ULONG;// In Bytes
|
|
end;
|
|
{$NODEFINE TFlowSpec}
|
|
TFlowSpec = FLOWSPEC;
|
|
{$EXTERNALSYM PFLOWSPEC}
|
|
PFLOWSPEC = ^TFlowSpec;
|
|
{$EXTERNALSYM LPFLOWSPEC}
|
|
LPFLOWSPEC = PFLOWSPEC;
|
|
|
|
{$EXTERNALSYM QOS}
|
|
QOS = record
|
|
SendingFlowspec: TFlowSpec; { the flow spec for data sending }
|
|
ReceivingFlowspec: TFlowSpec; { the flow spec for data receiving }
|
|
ProviderSpecific: TWSABuf; { additional provider specific stuff }
|
|
end;
|
|
{$NODEFINE TQualityOfService}
|
|
TQualityOfService = QOS;
|
|
{$NODEFINE PQOS}
|
|
PQOS = ^QOS;
|
|
{$EXTERNALSYM LPQOS}
|
|
LPQOS = PQOS;
|
|
|
|
const
|
|
{$EXTERNALSYM SERVICETYPE_NOTRAFFIC}
|
|
SERVICETYPE_NOTRAFFIC = $00000000; // No data in this direction
|
|
{$EXTERNALSYM SERVICETYPE_BESTEFFORT}
|
|
SERVICETYPE_BESTEFFORT = $00000001; // Best Effort
|
|
{$EXTERNALSYM SERVICETYPE_CONTROLLEDLOAD}
|
|
SERVICETYPE_CONTROLLEDLOAD = $00000002; // Controlled Load
|
|
{$EXTERNALSYM SERVICETYPE_GUARANTEED}
|
|
SERVICETYPE_GUARANTEED = $00000003; // Guaranteed
|
|
{$EXTERNALSYM SERVICETYPE_NETWORK_UNAVAILABLE}
|
|
SERVICETYPE_NETWORK_UNAVAILABLE = $00000004; // Used to notify change to user
|
|
{$EXTERNALSYM SERVICETYPE_GENERAL_INFORMATION}
|
|
SERVICETYPE_GENERAL_INFORMATION = $00000005; // corresponds to "General Parameters" defined by IntServ
|
|
{$EXTERNALSYM SERVICETYPE_NOCHANGE}
|
|
SERVICETYPE_NOCHANGE = $00000006; // used to indicate that the flow spec contains no change from any previous one
|
|
// to turn on immediate traffic control, OR this flag with the ServiceType field in the FLOWSPEC
|
|
{$EXTERNALSYM SERVICE_IMMEDIATE_TRAFFIC_CONTROL}
|
|
SERVICE_IMMEDIATE_TRAFFIC_CONTROL = $80000000;
|
|
|
|
// WinSock 2 extension -- manifest constants for return values of the condition function
|
|
{$EXTERNALSYM CF_ACCEPT}
|
|
CF_ACCEPT = $0000;
|
|
{$EXTERNALSYM CF_REJECT}
|
|
CF_REJECT = $0001;
|
|
{$EXTERNALSYM CF_DEFER}
|
|
CF_DEFER = $0002;
|
|
|
|
// WinSock 2 extension -- manifest constants for shutdown()
|
|
{$EXTERNALSYM SD_RECEIVE}
|
|
SD_RECEIVE = $00;
|
|
{$EXTERNALSYM SD_SEND}
|
|
SD_SEND = $01;
|
|
{$EXTERNALSYM SD_BOTH}
|
|
SD_BOTH = $02;
|
|
|
|
// WinSock 2 extension -- data type and manifest constants for socket groups
|
|
{$EXTERNALSYM SG_UNCONSTRAINED_GROUP}
|
|
SG_UNCONSTRAINED_GROUP = $01;
|
|
{$EXTERNALSYM SG_CONSTRAINED_GROUP}
|
|
SG_CONSTRAINED_GROUP = $02;
|
|
|
|
type
|
|
{$EXTERNALSYM GROUP}
|
|
GROUP = DWORD;
|
|
{$EXTERNALSYM PGROUP}
|
|
PGROUP = ^GROUP;
|
|
|
|
// WinSock 2 extension -- data type for WSAEnumNetworkEvents()
|
|
{$EXTERNALSYM WSANETWORKEVENTS}
|
|
WSANETWORKEVENTS = record
|
|
lNetworkEvents: LongInt;
|
|
iErrorCode: Array[0..FD_MAX_EVENTS-1] of Integer;
|
|
end;
|
|
{$NODEFINE TWSANetworkEvents}
|
|
TWSANetworkEvents = WSANETWORKEVENTS;
|
|
{$NODEFINE PWSANetworkEvents}
|
|
PWSANetworkEvents = ^TWSANetworkEvents;
|
|
{$EXTERNALSYM LPWSANETWORKEVENTS}
|
|
LPWSANETWORKEVENTS = PWSANetworkEvents;
|
|
|
|
//TransmitFile types used for the TransmitFile API function in WinNT/2000/XP
|
|
//not sure why its defined in WinCE when TransmitFile is not available.
|
|
{$IFNDEF NO_REDECLARE}
|
|
{$EXTERNALSYM TRANSMIT_FILE_BUFFERS}
|
|
TRANSMIT_FILE_BUFFERS = record
|
|
Head: Pointer;
|
|
HeadLength: DWORD;
|
|
Tail: Pointer;
|
|
TailLength: DWORD;
|
|
end;
|
|
{$NODEFINE TTransmitFileBuffers}
|
|
TTransmitFileBuffers = TRANSMIT_FILE_BUFFERS;
|
|
{$NODEFINE PTransmitFileBuffers}
|
|
PTransmitFileBuffers = ^TTransmitFileBuffers;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM LPTRANSMIT_FILE_BUFFERS}
|
|
LPTRANSMIT_FILE_BUFFERS = PTransmitFileBuffers;
|
|
|
|
const
|
|
{$EXTERNALSYM TP_ELEMENT_MEMORY}
|
|
TP_ELEMENT_MEMORY = 1;
|
|
{$EXTERNALSYM TP_ELEMENT_FILE}
|
|
TP_ELEMENT_FILE = 2;
|
|
{$EXTERNALSYM TP_ELEMENT_EOP}
|
|
TP_ELEMENT_EOP = 4;
|
|
|
|
{$EXTERNALSYM TP_DISCONNECT}
|
|
TP_DISCONNECT = TF_DISCONNECT;
|
|
{$EXTERNALSYM TP_REUSE_SOCKET}
|
|
TP_REUSE_SOCKET = TF_REUSE_SOCKET;
|
|
{$EXTERNALSYM TP_USE_DEFAULT_WORKER}
|
|
TP_USE_DEFAULT_WORKER = TF_USE_DEFAULT_WORKER;
|
|
{$EXTERNALSYM TP_USE_SYSTEM_THREAD}
|
|
TP_USE_SYSTEM_THREAD = TF_USE_SYSTEM_THREAD;
|
|
{$EXTERNALSYM TP_USE_KERNEL_APC}
|
|
TP_USE_KERNEL_APC = TF_USE_KERNEL_APC;
|
|
|
|
type
|
|
{$EXTERNALSYM TRANSMIT_PACKETS_ELEMENT}
|
|
TRANSMIT_PACKETS_ELEMENT = record
|
|
dwElFlags: ULONG;
|
|
cLength: ULONG;
|
|
case Integer of
|
|
1: (nFileOffset: TLargeInteger;
|
|
hFile: THandle);
|
|
2: (pBuffer: Pointer);
|
|
end;
|
|
{$NODEFINE TTransmitPacketsElement}
|
|
TTransmitPacketsElement = TRANSMIT_PACKETS_ELEMENT;
|
|
{$NODEFINE PTransmitPacketsElement}
|
|
PTransmitPacketsElement = ^TTransmitPacketsElement;
|
|
{$NODEFINE LPTransmitPacketsElement}
|
|
LPTransmitPacketsElement = PTransmitPacketsElement;
|
|
|
|
{$EXTERNALSYM PTRANSMIT_PACKETS_ELEMENT}
|
|
PTRANSMIT_PACKETS_ELEMENT = ^TTransmitPacketsElement;
|
|
{$EXTERNALSYM LPTRANSMIT_PACKETS_ELEMENT}
|
|
LPTRANSMIT_PACKETS_ELEMENT = PTRANSMIT_PACKETS_ELEMENT;
|
|
|
|
// WinSock 2 extension -- WSAPROTOCOL_INFO structure
|
|
|
|
{$IFNDEF HAS_LPGUID}
|
|
type
|
|
{$IFNDEF HAS_PGUID}
|
|
{$NODEFINE PGUID}
|
|
PGUID = ^TGUID;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM LPGUID}
|
|
LPGUID = PGUID;
|
|
{$ENDIF}
|
|
|
|
// WinSock 2 extension -- WSAPROTOCOL_INFO manifest constants
|
|
|
|
const
|
|
{$EXTERNALSYM MAX_PROTOCOL_CHAIN}
|
|
MAX_PROTOCOL_CHAIN = 7;
|
|
{$EXTERNALSYM BASE_PROTOCOL}
|
|
BASE_PROTOCOL = 1;
|
|
{$EXTERNALSYM LAYERED_PROTOCOL}
|
|
LAYERED_PROTOCOL = 0;
|
|
{$EXTERNALSYM WSAPROTOCOL_LEN}
|
|
WSAPROTOCOL_LEN = 255;
|
|
|
|
type
|
|
{$EXTERNALSYM WSAPROTOCOLCHAIN}
|
|
WSAPROTOCOLCHAIN = record
|
|
ChainLen: Integer; // the length of the chain,
|
|
// length = 0 means layered protocol,
|
|
// length = 1 means base protocol,
|
|
// length > 1 means protocol chain
|
|
ChainEntries: Array[0..MAX_PROTOCOL_CHAIN-1] of DWORD; // a list of dwCatalogEntryIds
|
|
end;
|
|
{$NODEFINE TWSAProtocolChain}
|
|
TWSAProtocolChain = WSAPROTOCOLCHAIN;
|
|
{$EXTERNALSYM LPWSAPROTOCOLCHAIN}
|
|
LPWSAPROTOCOLCHAIN = ^TWSAProtocolChain;
|
|
|
|
type
|
|
{$EXTERNALSYM WSAPROTOCOL_INFOA}
|
|
WSAPROTOCOL_INFOA = record
|
|
dwServiceFlags1: DWORD;
|
|
dwServiceFlags2: DWORD;
|
|
dwServiceFlags3: DWORD;
|
|
dwServiceFlags4: DWORD;
|
|
dwProviderFlags: DWORD;
|
|
ProviderId: TGUID;
|
|
dwCatalogEntryId: DWORD;
|
|
ProtocolChain: TWSAProtocolChain;
|
|
iVersion: Integer;
|
|
iAddressFamily: Integer;
|
|
iMaxSockAddr: Integer;
|
|
iMinSockAddr: Integer;
|
|
iSocketType: Integer;
|
|
iProtocol: Integer;
|
|
iProtocolMaxOffset: Integer;
|
|
iNetworkByteOrder: Integer;
|
|
iSecurityScheme: Integer;
|
|
dwMessageSize: DWORD;
|
|
dwProviderReserved: DWORD;
|
|
szProtocol: Array[0..WSAPROTOCOL_LEN+1-1] of AnsiChar;
|
|
end;
|
|
{$NODEFINE TWSAProtocol_InfoA}
|
|
TWSAProtocol_InfoA = WSAPROTOCOL_INFOA;
|
|
{$NODEFINE PWSAProtocol_InfoA}
|
|
PWSAProtocol_InfoA = ^WSAPROTOCOL_INFOA;
|
|
{$EXTERNALSYM LPWSAPROTOCOL_INFOA}
|
|
LPWSAPROTOCOL_INFOA = PWSAProtocol_InfoA;
|
|
|
|
{$EXTERNALSYM WSAPROTOCOL_INFOW}
|
|
WSAPROTOCOL_INFOW = record
|
|
dwServiceFlags1: DWORD;
|
|
dwServiceFlags2: DWORD;
|
|
dwServiceFlags3: DWORD;
|
|
dwServiceFlags4: DWORD;
|
|
dwProviderFlags: DWORD;
|
|
ProviderId: TGUID;
|
|
dwCatalogEntryId: DWORD;
|
|
ProtocolChain: TWSAProtocolChain;
|
|
iVersion: Integer;
|
|
iAddressFamily: Integer;
|
|
iMaxSockAddr: Integer;
|
|
iMinSockAddr: Integer;
|
|
iSocketType: Integer;
|
|
iProtocol: Integer;
|
|
iProtocolMaxOffset: Integer;
|
|
iNetworkByteOrder: Integer;
|
|
iSecurityScheme: Integer;
|
|
dwMessageSize: DWORD;
|
|
dwProviderReserved: DWORD;
|
|
szProtocol: Array[0..WSAPROTOCOL_LEN+1-1] of WideChar;
|
|
end;
|
|
{$NODEFINE TWSAProtocol_InfoW}
|
|
TWSAProtocol_InfoW = WSAPROTOCOL_INFOW;
|
|
{$NODEFINE PWSAProtocol_InfoW}
|
|
PWSAProtocol_InfoW = ^TWSAProtocol_InfoW;
|
|
{$EXTERNALSYM LPWSAPROTOCOL_INFOW}
|
|
LPWSAPROTOCOL_INFOW = PWSAProtocol_InfoW;
|
|
|
|
{$EXTERNALSYM WSAPROTOCOL_INFO}
|
|
{$EXTERNALSYM LPWSAPROTOCOL_INFO}
|
|
{$NODEFINE TWSAProtocol_Info}
|
|
{$NODEFINE PWSAProtocol_Info}
|
|
{$IFDEF UNICODE}
|
|
WSAPROTOCOL_INFO = TWSAProtocol_InfoW;
|
|
TWSAProtocol_Info = TWSAProtocol_InfoW;
|
|
PWSAProtocol_Info = PWSAProtocol_InfoW;
|
|
LPWSAPROTOCOL_INFO = PWSAProtocol_InfoW;
|
|
{$ELSE}
|
|
WSAPROTOCOL_INFO = TWSAProtocol_InfoA;
|
|
TWSAProtocol_Info = TWSAProtocol_InfoA;
|
|
PWSAProtocol_Info = PWSAProtocol_InfoA;
|
|
LPWSAPROTOCOL_INFO = PWSAProtocol_InfoA;
|
|
{$ENDIF}
|
|
|
|
const
|
|
// flag bit definitions for dwProviderFlags
|
|
{$EXTERNALSYM PFL_MULTIPLE_PROTO_ENTRIES}
|
|
PFL_MULTIPLE_PROTO_ENTRIES = $00000001;
|
|
{$EXTERNALSYM PFL_RECOMMENTED_PROTO_ENTRY}
|
|
PFL_RECOMMENTED_PROTO_ENTRY = $00000002;
|
|
{$EXTERNALSYM PFL_HIDDEN}
|
|
PFL_HIDDEN = $00000004;
|
|
{$EXTERNALSYM PFL_MATCHES_PROTOCOL_ZERO}
|
|
PFL_MATCHES_PROTOCOL_ZERO = $00000008;
|
|
|
|
// flag bit definitions for dwServiceFlags1
|
|
{$EXTERNALSYM XP1_CONNECTIONLESS}
|
|
XP1_CONNECTIONLESS = $00000001;
|
|
{$EXTERNALSYM XP1_GUARANTEED_DELIVERY}
|
|
XP1_GUARANTEED_DELIVERY = $00000002;
|
|
{$EXTERNALSYM XP1_GUARANTEED_ORDER}
|
|
XP1_GUARANTEED_ORDER = $00000004;
|
|
{$EXTERNALSYM XP1_MESSAGE_ORIENTED}
|
|
XP1_MESSAGE_ORIENTED = $00000008;
|
|
{$EXTERNALSYM XP1_PSEUDO_STREAM}
|
|
XP1_PSEUDO_STREAM = $00000010;
|
|
{$EXTERNALSYM XP1_GRACEFUL_CLOSE}
|
|
XP1_GRACEFUL_CLOSE = $00000020;
|
|
{$EXTERNALSYM XP1_EXPEDITED_DATA}
|
|
XP1_EXPEDITED_DATA = $00000040;
|
|
{$EXTERNALSYM XP1_CONNECT_DATA}
|
|
XP1_CONNECT_DATA = $00000080;
|
|
{$EXTERNALSYM XP1_DISCONNECT_DATA}
|
|
XP1_DISCONNECT_DATA = $00000100;
|
|
{$EXTERNALSYM XP1_SUPPORT_BROADCAST}
|
|
XP1_SUPPORT_BROADCAST = $00000200;
|
|
{$EXTERNALSYM XP1_SUPPORT_MULTIPOINT}
|
|
XP1_SUPPORT_MULTIPOINT = $00000400;
|
|
{$EXTERNALSYM XP1_MULTIPOINT_CONTROL_PLANE}
|
|
XP1_MULTIPOINT_CONTROL_PLANE = $00000800;
|
|
{$EXTERNALSYM XP1_MULTIPOINT_DATA_PLANE}
|
|
XP1_MULTIPOINT_DATA_PLANE = $00001000;
|
|
{$EXTERNALSYM XP1_QOS_SUPPORTED}
|
|
XP1_QOS_SUPPORTED = $00002000;
|
|
{$EXTERNALSYM XP1_INTERRUPT}
|
|
XP1_INTERRUPT = $00004000;
|
|
{$EXTERNALSYM XP1_UNI_SEND}
|
|
XP1_UNI_SEND = $00008000;
|
|
{$EXTERNALSYM XP1_UNI_RECV}
|
|
XP1_UNI_RECV = $00010000;
|
|
{$EXTERNALSYM XP1_IFS_HANDLES}
|
|
XP1_IFS_HANDLES = $00020000;
|
|
{$EXTERNALSYM XP1_PARTIAL_MESSAGE}
|
|
XP1_PARTIAL_MESSAGE = $00040000;
|
|
|
|
{$EXTERNALSYM BIGENDIAN}
|
|
BIGENDIAN = $0000;
|
|
{$EXTERNALSYM LITTLEENDIAN}
|
|
LITTLEENDIAN = $0001;
|
|
|
|
{$EXTERNALSYM SECURITY_PROTOCOL_NONE}
|
|
SECURITY_PROTOCOL_NONE = $0000;
|
|
|
|
// WinSock 2 extension -- manifest constants for WSAJoinLeaf()
|
|
{$EXTERNALSYM JL_SENDER_ONLY}
|
|
JL_SENDER_ONLY = $01;
|
|
{$EXTERNALSYM JL_RECEIVER_ONLY}
|
|
JL_RECEIVER_ONLY = $02;
|
|
{$EXTERNALSYM JL_BOTH}
|
|
JL_BOTH = $04;
|
|
|
|
// WinSock 2 extension -- manifest constants for WSASocket()
|
|
{$EXTERNALSYM WSA_FLAG_OVERLAPPED}
|
|
WSA_FLAG_OVERLAPPED = $01;
|
|
{$EXTERNALSYM WSA_FLAG_MULTIPOINT_C_ROOT}
|
|
WSA_FLAG_MULTIPOINT_C_ROOT = $02;
|
|
{$EXTERNALSYM WSA_FLAG_MULTIPOINT_C_LEAF}
|
|
WSA_FLAG_MULTIPOINT_C_LEAF = $04;
|
|
{$EXTERNALSYM WSA_FLAG_MULTIPOINT_D_ROOT}
|
|
WSA_FLAG_MULTIPOINT_D_ROOT = $08;
|
|
{$EXTERNALSYM WSA_FLAG_MULTIPOINT_D_LEAF}
|
|
WSA_FLAG_MULTIPOINT_D_LEAF = $10;
|
|
|
|
// WinSock 2 extension -- manifest constants for WSAIoctl()
|
|
{$EXTERNALSYM IOC_UNIX}
|
|
IOC_UNIX = $00000000;
|
|
{$EXTERNALSYM IOC_WS2}
|
|
IOC_WS2 = $08000000;
|
|
{$EXTERNALSYM IOC_PROTOCOL}
|
|
IOC_PROTOCOL = $10000000;
|
|
{$EXTERNALSYM IOC_VENDOR}
|
|
IOC_VENDOR = $18000000;
|
|
|
|
{$IFNDEF WINCE}
|
|
///*
|
|
// * WSK-specific IO control codes are Winsock2 codes with the highest-order
|
|
// * 3 bits of the Vendor/AddressFamily-specific field set to 1.
|
|
// */
|
|
{$EXTERNALSYM IOC_WSK}
|
|
IOC_WSK = IOC_WS2 or $07000000;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM SIO_ASSOCIATE_HANDLE}
|
|
SIO_ASSOCIATE_HANDLE = DWORD(IOC_IN or IOC_WS2 or 1);
|
|
{$EXTERNALSYM SIO_ENABLE_CIRCULAR_QUEUEING}
|
|
SIO_ENABLE_CIRCULAR_QUEUEING = DWORD(IOC_VOID or IOC_WS2 or 2);
|
|
{$EXTERNALSYM SIO_FIND_ROUTE}
|
|
SIO_FIND_ROUTE = DWORD(IOC_OUT or IOC_WS2 or 3);
|
|
{$EXTERNALSYM SIO_FLUSH}
|
|
SIO_FLUSH = DWORD(IOC_VOID or IOC_WS2 or 4);
|
|
{$EXTERNALSYM SIO_GET_BROADCAST_ADDRESS}
|
|
SIO_GET_BROADCAST_ADDRESS = DWORD(IOC_OUT or IOC_WS2 or 5);
|
|
{$EXTERNALSYM SIO_GET_EXTENSION_FUNCTION_POINTER}
|
|
SIO_GET_EXTENSION_FUNCTION_POINTER = DWORD(IOC_INOUT or IOC_WS2 or 6);
|
|
{$EXTERNALSYM SIO_GET_QOS}
|
|
SIO_GET_QOS = DWORD(IOC_INOUT or IOC_WS2 or 7);
|
|
{$EXTERNALSYM SIO_GET_GROUP_QOS}
|
|
SIO_GET_GROUP_QOS = DWORD(IOC_INOUT or IOC_WS2 or 8);
|
|
{$EXTERNALSYM SIO_MULTIPOINT_LOOPBACK}
|
|
SIO_MULTIPOINT_LOOPBACK = DWORD(IOC_IN or IOC_WS2 or 9);
|
|
{$EXTERNALSYM SIO_MULTICAST_SCOPE}
|
|
SIO_MULTICAST_SCOPE = DWORD(IOC_IN or IOC_WS2 or 10);
|
|
{$EXTERNALSYM SIO_SET_QOS}
|
|
SIO_SET_QOS = DWORD(IOC_IN or IOC_WS2 or 11);
|
|
{$EXTERNALSYM SIO_SET_GROUP_QOS}
|
|
SIO_SET_GROUP_QOS = DWORD(IOC_IN or IOC_WS2 or 12);
|
|
{$EXTERNALSYM SIO_TRANSLATE_HANDLE}
|
|
SIO_TRANSLATE_HANDLE = DWORD(IOC_INOUT or IOC_WS2 or 13);
|
|
{$EXTERNALSYM SIO_ROUTING_INTERFACE_QUERY}
|
|
SIO_ROUTING_INTERFACE_QUERY = DWORD(IOC_INOUT or IOC_WS2 or 20);
|
|
{$EXTERNALSYM SIO_ROUTING_INTERFACE_CHANGE}
|
|
SIO_ROUTING_INTERFACE_CHANGE = DWORD(IOC_IN or IOC_WS2 or 21);
|
|
{$EXTERNALSYM SIO_ADDRESS_LIST_QUERY}
|
|
SIO_ADDRESS_LIST_QUERY = DWORD(IOC_OUT or IOC_WS2 or 22); // see below SOCKET_ADDRESS_LIST
|
|
{$EXTERNALSYM SIO_ADDRESS_LIST_CHANGE}
|
|
SIO_ADDRESS_LIST_CHANGE = DWORD(IOC_VOID or IOC_WS2 or 23);
|
|
{$EXTERNALSYM SIO_QUERY_TARGET_PNP_HANDLE}
|
|
SIO_QUERY_TARGET_PNP_HANDLE = DWORD(IOC_OUT or IOC_WS2 or 24);
|
|
{$EXTERNALSYM SIO_NSP_NOTIFY_CHANGE}
|
|
SIO_NSP_NOTIFY_CHANGE = DWORD(IOC_IN or IOC_WS2 or 25);
|
|
{$EXTERNALSYM SIO_ADDRESS_LIST_SORT}
|
|
SIO_ADDRESS_LIST_SORT = DWORD(IOC_INOUT or IOC_WS2 or 25);
|
|
{$EXTERNALSYM SIO_QUERY_RSS_PROCESSOR_INFO}
|
|
SIO_QUERY_RSS_PROCESSOR_INFO = DWORD(IOC_INOUT or IOC_WS2 or 37);
|
|
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM SIO_RESERVED_1}
|
|
SIO_RESERVED_1 = DWORD(IOC_IN or IOC_WS2 or 26);
|
|
{$EXTERNALSYM SIO_RESERVED_2}
|
|
SIO_RESERVED_2 = DWORD(IOC_IN or IOC_WS2 or 33);
|
|
{$ENDIF}
|
|
|
|
// WinSock 2 extension -- manifest constants for SIO_TRANSLATE_HANDLE ioctl
|
|
{$EXTERNALSYM TH_NETDEV}
|
|
TH_NETDEV = $00000001;
|
|
{$EXTERNALSYM TH_TAPI}
|
|
TH_TAPI = $00000002;
|
|
|
|
type
|
|
// Manifest constants and type definitions related to name resolution and
|
|
// registration (RNR) API
|
|
{$IFNDEF NO_REDECLARE}
|
|
{$EXTERNALSYM BLOB}
|
|
BLOB = record
|
|
cbSize : U_LONG;
|
|
pBlobData : PBYTE;
|
|
end;
|
|
{$NODEFINE TBLOB}
|
|
TBLOB = BLOB;
|
|
{$NODEFINE PBLOB}
|
|
PBLOB = ^TBLOB;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM LPBLOB}
|
|
LPBLOB = PBLOB;
|
|
|
|
{$EXTERNALSYM RIO_BUFFERID}
|
|
RIO_BUFFERID = Pointer;
|
|
{$EXTERNALSYM RIO_CQ}
|
|
RIO_CQ = Pointer;
|
|
{$EXTERNALSYM RIO_RQ}
|
|
RIO_RQ = Pointer;
|
|
|
|
{$EXTERNALSYM PRIO_BUFFERID}
|
|
PRIO_BUFFERID = ^RIO_BUFFERID;
|
|
{$EXTERNALSYM _RIORESULT}
|
|
_RIORESULT = record
|
|
Status : LONG;
|
|
BytesTransferred : ULONG;
|
|
SocketContext : ULONGLONG;
|
|
RequestContext : ULONGLONG;
|
|
end;
|
|
{$EXTERNALSYM RIORESULT}
|
|
RIORESULT = _RIORESULT;
|
|
{$EXTERNALSYM PRIORESULT}
|
|
PRIORESULT = ^RIORESULT;
|
|
{$EXTERNALSYM _RIO_BUF}
|
|
_RIO_BUF = record
|
|
BufferId : RIO_BUFFERID;
|
|
Offset : ULONG;
|
|
Length : ULONG;
|
|
end;
|
|
{$EXTERNALSYM RIO_BUF}
|
|
RIO_BUF = _RIO_BUF;
|
|
{$EXTERNALSYM PRIO_BUF}
|
|
PRIO_BUF = ^RIO_BUF;
|
|
{$EXTERNALSYM _RIO_CMSG_BUFFER}
|
|
_RIO_CMSG_BUFFER = record
|
|
TotalLength : ULONG;
|
|
//* followed by CMSG_HDR */
|
|
end;
|
|
{$EXTERNALSYM RIO_CMSG_BUFFER}
|
|
RIO_CMSG_BUFFER = _RIO_CMSG_BUFFER;
|
|
{$EXTERNALSYM PRIO_CMSG_BUFFER}
|
|
PRIO_CMSG_BUFFER = ^RIO_CMSG_BUFFER;
|
|
|
|
// Service Install Flags
|
|
|
|
const
|
|
{$EXTERNALSYM SERVICE_MULTIPLE}
|
|
SERVICE_MULTIPLE = $00000001;
|
|
|
|
// & name spaces
|
|
{$EXTERNALSYM NS_ALL}
|
|
NS_ALL = 0;
|
|
|
|
{$EXTERNALSYM NS_SAP}
|
|
NS_SAP = 1;
|
|
{$EXTERNALSYM NS_NDS}
|
|
NS_NDS = 2;
|
|
{$EXTERNALSYM NS_PEER_BROWSE}
|
|
NS_PEER_BROWSE = 3;
|
|
{$EXTERNALSYM NS_SLP}
|
|
NS_SLP = 5;
|
|
{$EXTERNALSYM NS_DHCP}
|
|
NS_DHCP = 6;
|
|
|
|
{$EXTERNALSYM NS_TCPIP_LOCAL}
|
|
NS_TCPIP_LOCAL = 10;
|
|
{$EXTERNALSYM NS_TCPIP_HOSTS}
|
|
NS_TCPIP_HOSTS = 11;
|
|
{$EXTERNALSYM NS_DNS}
|
|
NS_DNS = 12;
|
|
{$EXTERNALSYM NS_NETBT}
|
|
NS_NETBT = 13;
|
|
{$EXTERNALSYM NS_WINS}
|
|
NS_WINS = 14;
|
|
{$EXTERNALSYM NS_NLA}
|
|
NS_NLA = 15; //* Network Location Awareness*/ - WindowsXP
|
|
{$EXTERNALSYM NS_BTH}
|
|
NS_BTH = 16; //* Bluetooth SDP Namespace */ - Windows Vista
|
|
|
|
{$EXTERNALSYM NS_NBP}
|
|
NS_NBP = 20;
|
|
|
|
{$EXTERNALSYM NS_MS}
|
|
NS_MS = 30;
|
|
{$EXTERNALSYM NS_STDA}
|
|
NS_STDA = 31;
|
|
{$EXTERNALSYM NS_NTDS}
|
|
NS_NTDS = 32;
|
|
|
|
//Windows Vista namespaces
|
|
{$EXTERNALSYM NS_EMAIL}
|
|
NS_EMAIL = 37;
|
|
{$EXTERNALSYM NS_PNRPNAME}
|
|
NS_PNRPNAME = 38;
|
|
{$EXTERNALSYM NS_PNRPCLOUD}
|
|
NS_PNRPCLOUD = 39;
|
|
//
|
|
|
|
{$EXTERNALSYM NS_X500}
|
|
NS_X500 = 40;
|
|
{$EXTERNALSYM NS_NIS}
|
|
NS_NIS = 41;
|
|
{$EXTERNALSYM NS_NISPLUS}
|
|
NS_NISPLUS = 42;
|
|
|
|
{$EXTERNALSYM NS_WRQ}
|
|
NS_WRQ = 50;
|
|
|
|
{$EXTERNALSYM NS_NETDES}
|
|
NS_NETDES = 60; // Network Designers Limited
|
|
|
|
{ Resolution flags for WSAGetAddressByName().
|
|
Note these are also used by the 1.1 API GetAddressByName, so leave them around. }
|
|
{$EXTERNALSYM RES_UNUSED_1}
|
|
RES_UNUSED_1 = $00000001;
|
|
{$EXTERNALSYM RES_FLUSH_CACHE}
|
|
RES_FLUSH_CACHE = $00000002;
|
|
{$EXTERNALSYM RES_SERVICE}
|
|
RES_SERVICE = $00000004;
|
|
{$EXTERNALSYM RIO_MSG_DONT_NOTIFY}
|
|
RIO_MSG_DONT_NOTIFY = $00000001;
|
|
{$EXTERNALSYM RIO_MSG_DEFER}
|
|
RIO_MSG_DEFER = $00000002;
|
|
{$EXTERNALSYM RIO_MSG_WAITALL}
|
|
RIO_MSG_WAITALL = $00000004;
|
|
{$EXTERNALSYM RIO_MSG_COMMIT_ONLY}
|
|
RIO_MSG_COMMIT_ONLY = $00000008;
|
|
|
|
{$EXTERNALSYM RIO_INVALID_BUFFERID}
|
|
RIO_INVALID_BUFFERID = RIO_BUFFERID($FFFFFFFF);
|
|
{$EXTERNALSYM RIO_INVALID_CQ}
|
|
RIO_INVALID_CQ = RIO_CQ(0);
|
|
{$EXTERNALSYM RIO_INVALID_RQ}
|
|
RIO_INVALID_RQ = RIO_RQ(0);
|
|
{$EXTERNALSYM RIO_MAX_CQ_SIZE}
|
|
RIO_MAX_CQ_SIZE = $8000000;
|
|
{$EXTERNALSYM RIO_CORRUPT_CQ}
|
|
RIO_CORRUPT_CQ = $FFFFFFFF;
|
|
|
|
{ Well known value names for Service Types }
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_IPXPORTA}
|
|
SERVICE_TYPE_VALUE_IPXPORTA : PAnsiChar = 'IpxSocket'; {Do not Localize}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_SAPIDA}
|
|
SERVICE_TYPE_VALUE_SAPIDA : PAnsiChar = 'SapId'; {Do not Localize}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_TCPPORTA}
|
|
SERVICE_TYPE_VALUE_TCPPORTA : PAnsiChar = 'TcpPort'; {Do not Localize}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_UDPPORTA}
|
|
SERVICE_TYPE_VALUE_UDPPORTA : PAnsiChar = 'UdpPort'; {Do not Localize}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_OBJECTIDA}
|
|
SERVICE_TYPE_VALUE_OBJECTIDA : PAnsiChar = 'ObjectId'; {Do not Localize}
|
|
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_IPXPORTW}
|
|
SERVICE_TYPE_VALUE_IPXPORTW : PWideChar = 'IpxSocket'; {Do not Localize}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_SAPIDW}
|
|
SERVICE_TYPE_VALUE_SAPIDW : PWideChar = 'SapId'; {Do not Localize}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_TCPPORTW}
|
|
SERVICE_TYPE_VALUE_TCPPORTW : PWideChar = 'TcpPort'; {Do not Localize}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_UDPPORTW}
|
|
SERVICE_TYPE_VALUE_UDPPORTW : PWideChar = 'UdpPort'; {Do not Localize}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_OBJECTIDW}
|
|
SERVICE_TYPE_VALUE_OBJECTIDW : PWideChar = 'ObjectId'; {Do not Localize}
|
|
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_SAPID}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_TCPPORT}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_UDPPORT}
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_OBJECTID}
|
|
{$IFDEF UNICODE}
|
|
SERVICE_TYPE_VALUE_SAPID : PWideChar = 'SapId'; {Do not Localize}
|
|
SERVICE_TYPE_VALUE_TCPPORT : PWideChar = 'TcpPort'; {Do not Localize}
|
|
SERVICE_TYPE_VALUE_UDPPORT : PWideChar = 'UdpPort'; {Do not Localize}
|
|
SERVICE_TYPE_VALUE_OBJECTID : PWideChar = 'ObjectId'; {Do not Localize}
|
|
{$ELSE}
|
|
SERVICE_TYPE_VALUE_SAPID : PAnsiChar = 'SapId'; {Do not Localize}
|
|
SERVICE_TYPE_VALUE_TCPPORT : PAnsiChar = 'TcpPort'; {Do not Localize}
|
|
SERVICE_TYPE_VALUE_UDPPORT : PAnsiChar = 'UdpPort'; {Do not Localize}
|
|
SERVICE_TYPE_VALUE_OBJECTID : PAnsiChar = 'ObjectId'; {Do not Localize}
|
|
{$ENDIF}
|
|
|
|
// SockAddr Information
|
|
type
|
|
{$EXTERNALSYM SOCKET_ADDRESS}
|
|
SOCKET_ADDRESS = record
|
|
lpSockaddr : PSOCKADDR;
|
|
iSockaddrLength : Integer;
|
|
end;
|
|
{$NODEFINE TSocket_Address}
|
|
TSocket_Address = SOCKET_ADDRESS;
|
|
{$EXTERNALSYM PSOCKET_ADDRESS}
|
|
PSOCKET_ADDRESS = ^TSocket_Address;
|
|
|
|
{$EXTERNALSYM SOCKET_ADDRESS_LIST}
|
|
SOCKET_ADDRESS_LIST = record
|
|
iAddressCount : Integer;
|
|
Address : SOCKET_ADDRESS;
|
|
end;
|
|
{$NODEFINE TSocket_Address_List}
|
|
TSocket_Address_List = SOCKET_ADDRESS_LIST;
|
|
{$EXTERNALSYM PSOCKET_ADDRESS_LIST}
|
|
PSOCKET_ADDRESS_LIST = ^TSocket_Address_List;
|
|
{$EXTERNALSYM LPSOCKET_ADDRESS_LIST}
|
|
LPSOCKET_ADDRESS_LIST = PSOCKET_ADDRESS_LIST;
|
|
|
|
// CSAddr Information
|
|
{$EXTERNALSYM CSADDR_INFO}
|
|
CSADDR_INFO = record
|
|
LocalAddr,
|
|
RemoteAddr : TSocket_Address;
|
|
iSocketType,
|
|
iProtocol : Integer;
|
|
end;
|
|
{$NODEFINE TCSAddr_Info}
|
|
TCSAddr_Info = CSADDR_INFO;
|
|
{$EXTERNALSYM PCSADDR_INFO}
|
|
PCSADDR_INFO = ^TCSAddr_Info;
|
|
{$EXTERNALSYM LPCSADDR_INFO}
|
|
LPCSADDR_INFO = PCSADDR_INFO;
|
|
|
|
// Address Family/Protocol Tuples
|
|
{$EXTERNALSYM AFPROTOCOLS}
|
|
AFPROTOCOLS = record
|
|
iAddressFamily : Integer;
|
|
iProtocol : Integer;
|
|
end;
|
|
{$NODEFINE TAFProtocols}
|
|
TAFProtocols = AFPROTOCOLS;
|
|
{$EXTERNALSYM PAFPROTOCOLS}
|
|
PAFPROTOCOLS = ^TAFProtocols;
|
|
{$EXTERNALSYM LPAFPROTOCOLS}
|
|
LPAFPROTOCOLS = PAFPROTOCOLS;
|
|
|
|
// Client Query API Typedefs
|
|
|
|
// The comparators
|
|
{$EXTERNALSYM WSAECOMPARATOR}
|
|
WSAECOMPARATOR = (COMP_EQUAL {= 0}, COMP_NOTLESS);
|
|
{$NODEFINE TWSAEComparator}
|
|
TWSAEComparator = WSAECOMPARATOR;
|
|
{$EXTERNALSYM PWSAECOMPARATOR}
|
|
PWSAECOMPARATOR = ^WSAECOMPARATOR;
|
|
|
|
{$EXTERNALSYM WSAVERSION}
|
|
WSAVERSION = record
|
|
dwVersion : DWORD;
|
|
ecHow : TWSAEComparator;
|
|
end;
|
|
{$NODEFINE TWSAVersion}
|
|
TWSAVersion = WSAVERSION;
|
|
{$EXTERNALSYM PWSAVERSION}
|
|
PWSAVERSION = ^TWSAVersion;
|
|
{$EXTERNALSYM LPWSAVERSION}
|
|
LPWSAVERSION = PWSAVERSION;
|
|
|
|
{$EXTERNALSYM WSAQUERYSETA}
|
|
WSAQUERYSETA = record
|
|
dwSize : DWORD;
|
|
lpszServiceInstanceName : PAnsiChar;
|
|
lpServiceClassId : PGUID;
|
|
lpVersion : LPWSAVERSION;
|
|
lpszComment : PAnsiChar;
|
|
dwNameSpace : DWORD;
|
|
lpNSProviderId : PGUID;
|
|
lpszContext : PAnsiChar;
|
|
dwNumberOfProtocols : DWORD;
|
|
lpafpProtocols : LPAFPROTOCOLS;
|
|
lpszQueryString : PAnsiChar;
|
|
dwNumberOfCsAddrs : DWORD;
|
|
lpcsaBuffer : LPCSADDR_INFO;
|
|
dwOutputFlags : DWORD;
|
|
lpBlob : LPBLOB;
|
|
end;
|
|
{$NODEFINE TWSAQuerySetA}
|
|
TWSAQuerySetA = WSAQUERYSETA;
|
|
{$EXTERNALSYM PWSAQUERYSETA}
|
|
PWSAQUERYSETA = ^TWSAQuerySetA;
|
|
{$EXTERNALSYM LPWSAQUERYSETA}
|
|
LPWSAQUERYSETA = PWSAQUERYSETA;
|
|
|
|
{$EXTERNALSYM WSAQUERYSETW}
|
|
WSAQUERYSETW = record
|
|
dwSize : DWORD;
|
|
lpszServiceInstanceName : PWideChar;
|
|
lpServiceClassId : PGUID;
|
|
lpVersion : LPWSAVERSION;
|
|
lpszComment : PWideChar;
|
|
dwNameSpace : DWORD;
|
|
lpNSProviderId : PGUID;
|
|
lpszContext : PWideChar;
|
|
dwNumberOfProtocols : DWORD;
|
|
lpafpProtocols : LPAFPROTOCOLS;
|
|
lpszQueryString : PWideChar;
|
|
dwNumberOfCsAddrs : DWORD;
|
|
lpcsaBuffer : LPCSADDR_INFO;
|
|
dwOutputFlags : DWORD;
|
|
lpBlob : LPBLOB;
|
|
end;
|
|
{$NODEFINE TWSAQuerySetW}
|
|
TWSAQuerySetW = WSAQUERYSETW;
|
|
{$EXTERNALSYM PWSAQUERYSETW}
|
|
PWSAQUERYSETW = ^TWSAQuerySetW;
|
|
{$EXTERNALSYM LPWSAQUERYSETW}
|
|
LPWSAQUERYSETW = PWSAQUERYSETW;
|
|
|
|
{$NODEFINE TWSAQuerySet}
|
|
{$EXTERNALSYM PWSAQUERYSET}
|
|
{$EXTERNALSYM LPWSAQUERYSET}
|
|
{$IFDEF UNICODE}
|
|
TWSAQuerySet = TWSAQuerySetW;
|
|
PWSAQUERYSET = PWSAQUERYSETW;
|
|
LPWSAQUERYSET = LPWSAQUERYSETW;
|
|
{$ELSE}
|
|
TWSAQuerySet = TWSAQuerySetA;
|
|
PWSAQUERYSET = PWSAQUERYSETA;
|
|
LPWSAQUERYSET = LPWSAQUERYSETA;
|
|
{$ENDIF}
|
|
|
|
const
|
|
{$EXTERNALSYM LUP_DEEP}
|
|
LUP_DEEP = $0001;
|
|
{$EXTERNALSYM LUP_CONTAINERS}
|
|
LUP_CONTAINERS = $0002;
|
|
{$EXTERNALSYM LUP_NOCONTAINERS}
|
|
LUP_NOCONTAINERS = $0004;
|
|
{$EXTERNALSYM LUP_NEAREST}
|
|
LUP_NEAREST = $0008;
|
|
{$EXTERNALSYM LUP_RETURN_NAME}
|
|
LUP_RETURN_NAME = $0010;
|
|
{$EXTERNALSYM LUP_RETURN_TYPE}
|
|
LUP_RETURN_TYPE = $0020;
|
|
{$EXTERNALSYM LUP_RETURN_VERSION}
|
|
LUP_RETURN_VERSION = $0040;
|
|
{$EXTERNALSYM LUP_RETURN_COMMENT}
|
|
LUP_RETURN_COMMENT = $0080;
|
|
{$EXTERNALSYM LUP_RETURN_ADDR}
|
|
LUP_RETURN_ADDR = $0100;
|
|
{$EXTERNALSYM LUP_RETURN_BLOB}
|
|
LUP_RETURN_BLOB = $0200;
|
|
{$EXTERNALSYM LUP_RETURN_ALIASES}
|
|
LUP_RETURN_ALIASES = $0400;
|
|
{$EXTERNALSYM LUP_RETURN_QUERY_STRING}
|
|
LUP_RETURN_QUERY_STRING = $0800;
|
|
{$EXTERNALSYM LUP_RETURN_ALL}
|
|
LUP_RETURN_ALL = $0FF0;
|
|
{$EXTERNALSYM LUP_RES_SERVICE}
|
|
LUP_RES_SERVICE = $8000;
|
|
|
|
{$EXTERNALSYM LUP_FLUSHCACHE}
|
|
LUP_FLUSHCACHE = $1000;
|
|
{$EXTERNALSYM LUP_FLUSHPREVIOUS}
|
|
LUP_FLUSHPREVIOUS = $2000;
|
|
|
|
// Return flags
|
|
{$EXTERNALSYM RESULT_IS_ALIAS}
|
|
RESULT_IS_ALIAS = $0001;
|
|
//These are not supported in WinCE 4.2 but are available in later versions.
|
|
{$EXTERNALSYM RESULT_IS_ADDED}
|
|
RESULT_IS_ADDED = $0010;
|
|
{$EXTERNALSYM RESULT_IS_CHANGED}
|
|
RESULT_IS_CHANGED = $0020;
|
|
{$EXTERNALSYM RESULT_IS_DELETED}
|
|
RESULT_IS_DELETED = $0040;
|
|
|
|
{$EXTERNALSYM MAX_NATURAL_ALIGNMENT}
|
|
{$IFDEF _WIN64}
|
|
MAX_NATURAL_ALIGNMENT = SizeOf(Int64);
|
|
{$ELSE}
|
|
MAX_NATURAL_ALIGNMENT = SizeOf(DWORD);
|
|
{$ENDIF}
|
|
|
|
// WSARecvMsg flags
|
|
{$EXTERNALSYM MSG_TRUNC}
|
|
MSG_TRUNC = $0100;
|
|
{$EXTERNALSYM MSG_CTRUNC}
|
|
MSG_CTRUNC = $0200;
|
|
{$EXTERNALSYM MSG_BCAST}
|
|
MSG_BCAST = $0400;
|
|
{$EXTERNALSYM MSG_MCAST}
|
|
MSG_MCAST = $0800;
|
|
|
|
{$IFNDEF WINCE}
|
|
//Windows Vista WSAPoll
|
|
//* Event flag definitions for WSAPoll(). */
|
|
{$EXTERNALSYM POLLRDNORM}
|
|
POLLRDNORM = $0100;
|
|
{$EXTERNALSYM POLLRDBAND}
|
|
POLLRDBAND = $0200;
|
|
{$EXTERNALSYM POLLIN}
|
|
POLLIN = (POLLRDNORM or POLLRDBAND);
|
|
{$EXTERNALSYM POLLPRI}
|
|
POLLPRI = $0400;
|
|
{$EXTERNALSYM POLLWRNORM}
|
|
POLLWRNORM = $0010;
|
|
{$EXTERNALSYM POLLOUT}
|
|
POLLOUT = (POLLWRNORM);
|
|
{$EXTERNALSYM POLLWRBAND}
|
|
POLLWRBAND = $0020;
|
|
{$EXTERNALSYM POLLERR}
|
|
POLLERR = $0001;
|
|
{$EXTERNALSYM POLLHUP}
|
|
POLLHUP = $0002;
|
|
{$EXTERNALSYM POLLNVAL}
|
|
POLLNVAL = $0004;
|
|
{$ENDIF}
|
|
|
|
type
|
|
// Service Address Registration and Deregistration Data Types.
|
|
{$EXTERNALSYM WSAESETSERVICEOP}
|
|
WSAESETSERVICEOP = (RNRSERVICE_REGISTER{=0}, RNRSERVICE_DEREGISTER, RNRSERVICE_DELETE);
|
|
{$NODEFINE TWSAESetServiceOp}
|
|
TWSAESetServiceOp = WSAESETSERVICEOP;
|
|
|
|
{ Service Installation/Removal Data Types. }
|
|
{$EXTERNALSYM WSANSCLASSINFOA}
|
|
WSANSCLASSINFOA = record
|
|
lpszName : PAnsiChar;
|
|
dwNameSpace : DWORD;
|
|
dwValueType : DWORD;
|
|
dwValueSize : DWORD;
|
|
lpValue : Pointer;
|
|
end;
|
|
{$NODEFINE TWSANSClassInfoA}
|
|
TWSANSClassInfoA = WSANSCLASSINFOA;
|
|
{$EXTERNALSYM PWSANSClassInfoA}
|
|
PWSANSCLASSINFOA = ^TWSANSClassInfoA;
|
|
{$EXTERNALSYM LPWSANSCLASSINFOA}
|
|
LPWSANSCLASSINFOA = PWSANSCLASSINFOA;
|
|
|
|
{$EXTERNALSYM WSANSCLASSINFOW}
|
|
WSANSCLASSINFOW = record
|
|
lpszName : PWideChar;
|
|
dwNameSpace : DWORD;
|
|
dwValueType : DWORD;
|
|
dwValueSize : DWORD;
|
|
lpValue : Pointer;
|
|
end;
|
|
{$NODEFINE TWSANSClassInfoW}
|
|
TWSANSClassInfoW = WSANSCLASSINFOW;
|
|
{$EXTERNALSYM PWSANSClassInfoW}
|
|
PWSANSCLASSINFOW = ^TWSANSClassInfoW;
|
|
{$EXTERNALSYM LPWSANSCLASSINFOW}
|
|
LPWSANSCLASSINFOW = PWSANSCLASSINFOW;
|
|
|
|
{$NODEFINE TWSANSClassInfo}
|
|
{$EXTERNALSYM WSANSCLASSINFO}
|
|
{$EXTERNALSYM PWSANSCLASSINFO}
|
|
{$EXTERNALSYM LPWSANSCLASSINFO}
|
|
{$IFDEF UNICODE}
|
|
TWSANSClassInfo = TWSANSClassInfoW;
|
|
WSANSCLASSINFO = TWSANSClassInfoW;
|
|
PWSANSCLASSINFO = PWSANSCLASSINFOW;
|
|
LPWSANSCLASSINFO = LPWSANSCLASSINFOW;
|
|
{$ELSE}
|
|
TWSANSClassInfo = TWSANSClassInfoA;
|
|
WSANSCLASSINFO = TWSANSClassInfoA;
|
|
PWSANSCLASSINFO = PWSANSCLASSINFOA;
|
|
LPWSANSCLASSINFO = LPWSANSCLASSINFOA;
|
|
{$ENDIF // UNICODE}
|
|
|
|
{$EXTERNALSYM WSASERVICECLASSINFOA}
|
|
WSASERVICECLASSINFOA = record
|
|
lpServiceClassId : PGUID;
|
|
lpszServiceClassName : PAnsiChar;
|
|
dwCount : DWORD;
|
|
lpClassInfos : LPWSANSCLASSINFOA;
|
|
end;
|
|
{$NODEFINE TWSAServiceClassInfoA}
|
|
TWSAServiceClassInfoA = WSASERVICECLASSINFOA;
|
|
{$EXTERNALSYM PWSASERVICECLASSINFOA}
|
|
PWSASERVICECLASSINFOA = ^TWSAServiceClassInfoA;
|
|
{$EXTERNALSYM LPWSASERVICECLASSINFOA}
|
|
LPWSASERVICECLASSINFOA = PWSASERVICECLASSINFOA;
|
|
|
|
{$EXTERNALSYM WSASERVICECLASSINFOW}
|
|
WSASERVICECLASSINFOW = record
|
|
lpServiceClassId : PGUID;
|
|
lpszServiceClassName : PWideChar;
|
|
dwCount : DWORD;
|
|
lpClassInfos : LPWSANSCLASSINFOW;
|
|
end;
|
|
{$NODEFINE TWSAServiceClassInfoW}
|
|
TWSAServiceClassInfoW = WSASERVICECLASSINFOW;
|
|
{$EXTERNALSYM PWSASERVICECLASSINFOW}
|
|
PWSASERVICECLASSINFOW = ^TWSAServiceClassInfoW;
|
|
{$EXTERNALSYM LPWSASERVICECLASSINFOW}
|
|
LPWSASERVICECLASSINFOW = PWSASERVICECLASSINFOW;
|
|
|
|
{$NODEFINE TWSAServiceClassInfo}
|
|
{$EXTERNALSYM WSASERVICECLASSINFO}
|
|
{$EXTERNALSYM PWSASERVICECLASSINFO}
|
|
{$EXTERNALSYM LPWSASERVICECLASSINFO}
|
|
{$IFDEF UNICODE}
|
|
TWSAServiceClassInfo = TWSAServiceClassInfoW;
|
|
WSASERVICECLASSINFO = TWSAServiceClassInfoW;
|
|
PWSASERVICECLASSINFO = PWSASERVICECLASSINFOW;
|
|
LPWSASERVICECLASSINFO = LPWSASERVICECLASSINFOW;
|
|
{$ELSE}
|
|
TWSAServiceClassInfo = TWSAServiceClassInfoA;
|
|
WSASERVICECLASSINFO = TWSAServiceClassInfoA;
|
|
PWSASERVICECLASSINFO = PWSASERVICECLASSINFOA;
|
|
LPWSASERVICECLASSINFO = LPWSASERVICECLASSINFOA;
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM WSANAMESPACE_INFOA}
|
|
WSANAMESPACE_INFOA = record
|
|
NSProviderId : TGUID;
|
|
dwNameSpace : DWORD;
|
|
fActive : DWORD{Bool};
|
|
dwVersion : DWORD;
|
|
lpszIdentifier : PAnsiChar;
|
|
end;
|
|
{$NODEFINE TWSANameSpace_InfoA}
|
|
TWSANameSpace_InfoA = WSANAMESPACE_INFOA;
|
|
{$EXTERNALSYM PWSANAMESPACE_INFOA}
|
|
PWSANAMESPACE_INFOA = ^TWSANameSpace_InfoA;
|
|
{$EXTERNALSYM LPWSANAMESPACE_INFOA}
|
|
LPWSANAMESPACE_INFOA = PWSANAMESPACE_INFOA;
|
|
|
|
{$EXTERNALSYM WSANAMESPACE_INFOW}
|
|
WSANAMESPACE_INFOW = record
|
|
NSProviderId : TGUID;
|
|
dwNameSpace : DWORD;
|
|
fActive : DWORD{Bool};
|
|
dwVersion : DWORD;
|
|
lpszIdentifier : PWideChar;
|
|
end;
|
|
{$NODEFINE TWSANameSpace_InfoW}
|
|
TWSANameSpace_InfoW = WSANAMESPACE_INFOW;
|
|
{$EXTERNALSYM PWSANAMESPACE_INFOW}
|
|
PWSANAMESPACE_INFOW = ^TWSANameSpace_InfoW;
|
|
{$EXTERNALSYM LPWSANAMESPACE_INFOW}
|
|
LPWSANAMESPACE_INFOW = PWSANAMESPACE_INFOW;
|
|
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM WSANAMESPACE_INFOEXW}
|
|
WSANAMESPACE_INFOEXW = record
|
|
NSProviderId : TGUID;
|
|
dwNameSpace : DWord;
|
|
fActive : LongBool;
|
|
lpszIdentifier : LPWSTR;
|
|
ProviderSpecific : BLOB;
|
|
end;
|
|
{$NODEFINE TWSANameSpace_InfoExW}
|
|
TWSANameSpace_InfoExW = WSANAMESPACE_INFOEXW;
|
|
{$EXTERNALSYM PWSANAMESPACE_INFOEXW}
|
|
PWSANAMESPACE_INFOEXW = ^TWSANameSpace_InfoExW;
|
|
{$EXTERNALSYM LPWSANAMESPACE_INFOEXW}
|
|
LPWSANAMESPACE_INFOEXW = PWSANAMESPACE_INFOEXW;
|
|
|
|
{$EXTERNALSYM WSANAMESPACE_INFOEXA}
|
|
WSANAMESPACE_INFOEXA = record
|
|
NSProviderId : TGUID;
|
|
dwNameSpace : DWord;
|
|
fActive : LongBool;
|
|
lpszIdentifier : LPSTR;
|
|
ProviderSpecific : BLOB;
|
|
end;
|
|
{$NODEFINE TWSANameSpace_InfoExA}
|
|
TWSANameSpace_InfoExA = WSANAMESPACE_INFOEXA;
|
|
{$EXTERNALSYM PWSANAMESPACE_INFOEXA}
|
|
PWSANAMESPACE_INFOEXA = ^TWSANameSpace_InfoExA;
|
|
{$EXTERNALSYM LPWSANAMESPACE_INFOEXA}
|
|
LPWSANAMESPACE_INFOEXA = PWSANAMESPACE_INFOEXA;
|
|
|
|
{$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERSEXW}
|
|
LPFN_WSAENUMNAMESPACEPROVIDERSEXW = function (var lpdwBufferLength : DWord;
|
|
lpnspBuffer : PWSANAMESPACE_INFOEXW): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERSEXA}
|
|
LPFN_WSAENUMNAMESPACEPROVIDERSEXA = function (var lpdwBufferLength : DWord;
|
|
lpnspBuffer : PWSANAMESPACE_INFOEXA): Integer; stdcall;
|
|
|
|
{$NODEFINE TWSANameSpace_InfoEx}
|
|
{$EXTERNALSYM WSANAMESPACE_INFOEX}
|
|
{$EXTERNALSYM PWSANAMESPACE_INFOEX}
|
|
{$EXTERNALSYM LPWSANAMESPACE_INFOEX}
|
|
{$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERSEX}
|
|
{$IFDEF UNICODE}
|
|
WSANAMESPACE_INFOEX = WSANAMESPACE_INFOEXW;
|
|
TWSANameSpace_InfoEx = TWSANameSpace_InfoExW;
|
|
PWSANAMESPACE_INFOEX = PWSANAMESPACE_INFOEXW;
|
|
LPWSANAMESPACE_INFOEX = PWSANAMESPACE_INFOEX;
|
|
LPFN_WSAENUMNAMESPACEPROVIDERSEX = LPFN_WSAENUMNAMESPACEPROVIDERSEXW;
|
|
{$ELSE}
|
|
WSANAMESPACE_INFOEX = WSANAMESPACE_INFOEXA;
|
|
TWSANameSpace_InfoEx = TWSANameSpace_InfoExA;
|
|
PWSANAMESPACE_INFOEX = PWSANAMESPACE_INFOEXA;
|
|
LPWSANAMESPACE_INFOEX = PWSANAMESPACE_INFOEX;
|
|
LPFN_WSAENUMNAMESPACEPROVIDERSEX = LPFN_WSAENUMNAMESPACEPROVIDERSEXA;
|
|
{$ENDIF}
|
|
{$ENDIF} // WINCE
|
|
|
|
{$NODEFINE TWSANameSpace_Info}
|
|
{$EXTERNALSYM WSANAMESPACE_INFO}
|
|
{$EXTERNALSYM PWSANAMESPACE_INFO}
|
|
{$EXTERNALSYM LPWSANAMESPACE_INFO}
|
|
{$IFDEF UNICODE}
|
|
TWSANameSpace_Info = TWSANameSpace_InfoW;
|
|
WSANAMESPACE_INFO = TWSANameSpace_InfoW;
|
|
PWSANAMESPACE_INFO = PWSANAMESPACE_INFOW;
|
|
LPWSANAMESPACE_INFO = LPWSANAMESPACE_INFOW;
|
|
{$ELSE}
|
|
TWSANameSpace_Info = TWSANameSpace_InfoA;
|
|
WSANAMESPACE_INFO = TWSANameSpace_InfoA;
|
|
PWSANAMESPACE_INFO = PWSANAMESPACE_INFOA;
|
|
LPWSANAMESPACE_INFO = LPWSANAMESPACE_INFOA;
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WINCE}
|
|
{$EXTERNALSYM DSCP_TRAFFIC_TYPE}
|
|
{$EXTERNALSYM DSCPTypeNotSet}
|
|
{$EXTERNALSYM DSCPBestEffort}
|
|
{$EXTERNALSYM DSCPBackground}
|
|
{$EXTERNALSYM DSCPExcellentEffort}
|
|
{$EXTERNALSYM DSCPVideo}
|
|
{$EXTERNALSYM DSCPAudio}
|
|
{$EXTERNALSYM DSCPControl}
|
|
{$EXTERNALSYM NumDSCPTrafficTypes}
|
|
DSCP_TRAFFIC_TYPE = (
|
|
DSCPTypeNotSet = 0,
|
|
DSCPBestEffort = 1,
|
|
DSCPBackground = 2,
|
|
DSCPExcellentEffort = 3,
|
|
DSCPVideo = 4,
|
|
DSCPAudio = 5,
|
|
DSCPControl = 6);
|
|
// Define NumDSCPTrafficTypes as DSCPControl
|
|
//because FPC warns that enumerations must be descending.
|
|
//The original definition for DSCP_TRAFFIC_TYPE is:
|
|
//
|
|
///* differential service traffic types */
|
|
//typedef enum _DSCP_TRAFFIC_TYPE
|
|
//{
|
|
// DSCPTypeNotSet = 0,
|
|
// DSCPBestEffort = 1,
|
|
// DSCPBackground = 2,
|
|
// DSCPExcellentEffort = 3,
|
|
// DSCPVideo = 4,
|
|
// DSCPAudio = 5,
|
|
// DSCPControl = 6,
|
|
// NumDSCPTrafficTypes = 6
|
|
//} //DSCP_TRAFFIC_TYPE;
|
|
const
|
|
NumDSCPTrafficTypes : DSCP_TRAFFIC_TYPE = DSCPControl;
|
|
|
|
type
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM WSAMSG}
|
|
WSAMSG = record
|
|
name : PSOCKADDR; ///* Remote address */
|
|
namelen : Integer; ///* Remote address length *
|
|
lpBuffers : LPWSABUF; // /* Data buffer array */
|
|
dwBufferCount : DWord; // /* Number of elements in the array */
|
|
Control : WSABUF; // /* Control buffer */
|
|
dwFlags : DWord; // /* Flags */
|
|
end;
|
|
{$NODEFINE TWSAMSG}
|
|
TWSAMSG = WSAMSG;
|
|
{$EXTERNALSYM PWSAMSG}
|
|
PWSAMSG = ^TWSAMSG;
|
|
{$EXTERNALSYM LPWSAMSG}
|
|
LPWSAMSG = PWSAMSG;
|
|
|
|
{$EXTERNALSYM _WSACMSGHDR}
|
|
_WSACMSGHDR = record
|
|
cmsg_len: SIZE_T;
|
|
cmsg_level: Integer;
|
|
cmsg_type: Integer;
|
|
{ followed by UCHAR cmsg_data[] }
|
|
end;
|
|
{$EXTERNALSYM WSACMSGHDR}
|
|
WSACMSGHDR = _WSACMSGHDR;
|
|
{$EXTERNALSYM cmsghdr}
|
|
cmsghdr = _WSACMSGHDR;
|
|
{$NODEFINE TWSACMsgHdr}
|
|
TWSACMsgHdr = WSACMSGHDR;
|
|
{$EXTERNALSYM PWSACMSGHDR}
|
|
PWSACMSGHDR = ^TWSACMsgHdr;
|
|
{$EXTERNALSYM LPWSACMSGHDR}
|
|
LPWSACMSGHDR = PWSACMSGHDR;
|
|
{$EXTERNALSYM PCMSGHDR}
|
|
PCMSGHDR = ^CMSGHDR;
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM WSAPOLLFD}
|
|
WSAPOLLFD = record
|
|
fd : TSocket;
|
|
events : SHORT;
|
|
revents : SHORT;
|
|
end;
|
|
{$NODEFINE TWSAPOLLFD}
|
|
TWSAPOLLFD = WSAPOLLFD;
|
|
{$EXTERNALSYM PWSAPOLLFD}
|
|
PWSAPOLLFD = ^TWSAPOLLFD;
|
|
{$EXTERNALSYM LPWSAPOLLFD}
|
|
LPWSAPOLLFD = PWSAPOLLFD;
|
|
{$ENDIF}
|
|
|
|
{ WinSock 2 extensions -- data types for the condition function in }
|
|
{ WSAAccept() and overlapped I/O completion routine. }
|
|
type
|
|
{$EXTERNALSYM LPCONDITIONPROC}
|
|
LPCONDITIONPROC = function(lpCallerId: LPWSABUF; lpCallerData: LPWSABUF; lpSQOS, pGQOS: LPQOS;
|
|
lpCalleeId,lpCalleeData: LPWSABUF; g: PGROUP; dwCallbackData: DWORD_PTR): Integer; stdcall;
|
|
{$EXTERNALSYM LPWSAOVERLAPPED_COMPLETION_ROUTINE}
|
|
LPWSAOVERLAPPED_COMPLETION_ROUTINE = procedure(dwError, cbTransferred: DWORD;
|
|
lpOverlapped: LPWSAOVERLAPPED; dwFlags: DWORD); stdcall;
|
|
|
|
{$EXTERNALSYM WSACOMPLETIONTYPE}
|
|
{$EXTERNALSYM NSP_NOTIFY_IMMEDIATELY}
|
|
{$EXTERNALSYM NSP_NOTIFY_HWND}
|
|
{$EXTERNALSYM NSP_NOTIFY_EVENT}
|
|
{$EXTERNALSYM NSP_NOTIFY_PORT}
|
|
{$EXTERNALSYM NSP_NOTIFY_APC}
|
|
WSACOMPLETIONTYPE = (
|
|
NSP_NOTIFY_IMMEDIATELY,
|
|
NSP_NOTIFY_HWND,
|
|
NSP_NOTIFY_EVENT,
|
|
NSP_NOTIFY_PORT,
|
|
NSP_NOTIFY_APC);
|
|
{$EXTERNALSYM WSACOMPLETION_WINDOWMESSAGE}
|
|
WSACOMPLETION_WINDOWMESSAGE = record
|
|
hWnd : HWND;
|
|
uMsg : UINT;
|
|
context : WPARAM;
|
|
end;
|
|
{$EXTERNALSYM WSACOMPLETION_EVENT}
|
|
WSACOMPLETION_EVENT = record
|
|
lpOverlapped : LPWSAOVERLAPPED;
|
|
end;
|
|
{$EXTERNALSYM WSACOMPLETION_APC}
|
|
WSACOMPLETION_APC = record
|
|
lpOverlapped : LPWSAOVERLAPPED;
|
|
lpfnCompletionProc : LPWSAOVERLAPPED_COMPLETION_ROUTINE;
|
|
end;
|
|
{$EXTERNALSYM WSACOMPLETION_PORT}
|
|
WSACOMPLETION_PORT = record
|
|
lpOverlapped : LPWSAOVERLAPPED;
|
|
hPort : THandle;
|
|
Key : ULONG_PTR;
|
|
end;
|
|
{$EXTERNALSYM WSACOMPLETION_UNION}
|
|
WSACOMPLETION_union = record
|
|
case Integer of
|
|
0: (WindowMessage : WSACOMPLETION_WINDOWMESSAGE);
|
|
1: (Event : WSACOMPLETION_EVENT);
|
|
2: (Apc : WSACOMPLETION_APC);
|
|
3: (Port : WSACOMPLETION_PORT);
|
|
end;
|
|
{$EXTERNALSYM WSACOMPLETION}
|
|
WSACOMPLETION = record
|
|
_Type : WSACOMPLETIONTYPE;
|
|
Parameters : WSACOMPLETION_union;
|
|
end;
|
|
{$EXTERNALSYM PWSACOMPLETION}
|
|
PWSACOMPLETION = ^WSACOMPLETION;
|
|
{$EXTERNALSYM LPWSACOMPLETION}
|
|
LPWSACOMPLETION = PWSACOMPLETION;
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM _RIO_NOTIFICATION_COMPLETION_TYPE}
|
|
{$EXTERNALSYM RIO_EVENT_COMPLETION}
|
|
{$EXTERNALSYM RIO_IOCP_COMPLETION}
|
|
{$IFNDEF HAS_ENUM_ELEMENT_VALUES}
|
|
{$NODEFINE rnctUnused}
|
|
{$ENDIF}
|
|
// The Pascal compiler in Delphi/BCB prior to v6 does not
|
|
// support specifying values for individual enum items
|
|
_RIO_NOTIFICATION_COMPLETION_TYPE = (
|
|
{$IFDEF HAS_ENUM_ELEMENT_VALUES}
|
|
RIO_EVENT_COMPLETION = 1,
|
|
RIO_IOCP_COMPLETION = 2
|
|
{$ELSE}
|
|
rnctUnused, // do not use
|
|
RIO_EVENT_COMPLETION,
|
|
RIO_IOCP_COMPLETION
|
|
{$ENDIF}
|
|
);
|
|
{$EXTERNALSYM RIO_NOTIFICATION_COMPLETION_TYPE}
|
|
RIO_NOTIFICATION_COMPLETION_TYPE = _RIO_NOTIFICATION_COMPLETION_TYPE;
|
|
{$EXTERNALSYM PRIO_NOTIFICATION_COMPLETION_TYPE}
|
|
PRIO_NOTIFICATION_COMPLETION_TYPE = ^RIO_NOTIFICATION_COMPLETION_TYPE;
|
|
{$EXTERNALSYM _RIO_NOTIFICATION_COMPLETION}
|
|
{$EXTERNALSYM RIO_NOTIFICATION_COMPLETION}
|
|
{$EXTERNALSYM PRIO_NOTIFICATION_COMPLETION}
|
|
{$EXTERNALSYM _RIO_NOTIFICATION_COMPLETION_UNION}
|
|
{$EXTERNALSYM _RIO_NOTIFICATION_COMPLETION_IOCP}
|
|
{$EXTERNALSYM _RIO_NOTIFICATION_COMPLETION_EVENT}
|
|
_RIO_NOTIFICATION_COMPLETION_EVENT = record
|
|
EventHandle : THandle;
|
|
NotifyReset : BOOL;
|
|
end;
|
|
_RIO_NOTIFICATION_COMPLETION_IOCP = record
|
|
IocpHandle : THANDLE;
|
|
CompletionKey : PVOID;
|
|
Overlapped : PVOID;
|
|
end;
|
|
_RIO_NOTIFICATION_COMPLETION_UNION = record
|
|
case Integer of
|
|
0 : (Event : _RIO_NOTIFICATION_COMPLETION_EVENT);
|
|
1 : (Iocp : _RIO_NOTIFICATION_COMPLETION_IOCP);
|
|
end;
|
|
_RIO_NOTIFICATION_COMPLETION = record
|
|
_Type : RIO_NOTIFICATION_COMPLETION_TYPE;
|
|
a : _RIO_NOTIFICATION_COMPLETION_UNION;
|
|
end;
|
|
{$EXTERNALSYM RIO_NOTIFICATION_COMPLETION}
|
|
RIO_NOTIFICATION_COMPLETION = _RIO_NOTIFICATION_COMPLETION;
|
|
{$EXTERNALSYM PRIO_NOTIFICATION_COMPLETION}
|
|
PRIO_NOTIFICATION_COMPLETION = ^RIO_NOTIFICATION_COMPLETION;
|
|
{$ENDIF}
|
|
|
|
type
|
|
{$IFDEF INCL_WINSOCK_API_TYPEDEFS}
|
|
{$EXTERNALSYM LPFN_WSASTARTUP}
|
|
LPFN_WSASTARTUP = function(const wVersionRequired: WORD; out WSData: TWSAData): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSACLEANUP}
|
|
LPFN_WSACLEANUP = function: Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_ACCEPT}
|
|
LPFN_ACCEPT = function(const s: TSocket; AAddr: PSOCKADDR; addrlen: PInteger): TSocket; stdcall;
|
|
{$EXTERNALSYM LPFN_BIND}
|
|
LPFN_BIND = function(const s: TSocket; const name: PSOCKADDR; const namelen: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_CLOSESOCKET}
|
|
LPFN_CLOSESOCKET = function(const s: TSocket): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_CONNECT}
|
|
LPFN_CONNECT = function(const s: TSocket; const name: PSOCKADDR; const namelen: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM lpfn_IOCTLSOCKET}
|
|
LPFN_IOCTLSOCKET = function(const s: TSocket; const cmd: DWORD; var arg: u_long): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_GETPEERNAME}
|
|
LPFN_GETPEERNAME = function(const s: TSocket; const name: PSOCKADDR; var namelen: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_GETSOCKNAME}
|
|
LPFN_GETSOCKNAME = function(const s: TSocket; const name: PSOCKADDR; var namelen: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_GETSOCKOPT}
|
|
LPFN_GETSOCKOPT = function(const s: TSocket; const level, optname: Integer; optval: PAnsiChar; var optlen: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_HTONL}
|
|
LPFN_HTONL = function(hostlong: u_long): u_long; stdcall;
|
|
{$EXTERNALSYM LPFN_HTONS}
|
|
LPFN_HTONS = function(hostshort: u_short): u_short; stdcall;
|
|
{$EXTERNALSYM LPFN_INET_ADDR}
|
|
LPFN_INET_ADDR = function(cp: PAnsiChar): u_long; stdcall;
|
|
{$EXTERNALSYM LPFN_INET_NTOA}
|
|
LPFN_INET_NTOA = function(inaddr: TInAddr): PAnsiChar; stdcall;
|
|
{$EXTERNALSYM LPFN_LISTEN}
|
|
LPFN_LISTEN = function(const s: TSocket; backlog: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_NTOHL}
|
|
LPFN_NTOHL = function(netlong: u_long): u_long; stdcall;
|
|
{$EXTERNALSYM LPFN_NTOHS}
|
|
LPFN_NTOHS = function(netshort: u_short): u_short; stdcall;
|
|
{$EXTERNALSYM LPFN_RECV}
|
|
LPFN_RECV = function(const s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_RECVFROM}
|
|
LPFN_RECVFROM = function(const s: TSocket; var Buf; len, flags: Integer; from: PSOCKADDR; fromlen: PInteger): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_SELECT}
|
|
LPFN_SELECT = function(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_SEND}
|
|
LPFN_SEND = function(const s: TSocket; const Buf; len, flags: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_SENDTO}
|
|
LPFN_SENDTO = function(const s: TSocket; const Buf; const len, flags: Integer; const addrto: PSOCKADDR; const tolen: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_SETSOCKOPT}
|
|
LPFN_SETSOCKOPT = function(const s: TSocket; const level, optname: Integer; optval: PAnsiChar; const optlen: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_SHUTDOWN}
|
|
LPFN_SHUTDOWN = function(const s: TSocket; const how: Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_SOCKET}
|
|
LPFN_SOCKET = function(const af, istruct, protocol: Integer): TSocket; stdcall;
|
|
{$EXTERNALSYM LPFN_GETHOSTBYADDR}
|
|
LPFN_GETHOSTBYADDR = function(AAddr: Pointer; const len, addrtype: Integer): PHostEnt; stdcall;
|
|
{$EXTERNALSYM LPFN_GETHOSTBYNAME}
|
|
LPFN_GETHOSTBYNAME = function(name: PAnsiChar): PHostEnt; stdcall;
|
|
{$EXTERNALSYM LPFN_GETHOSTNAME}
|
|
LPFN_GETHOSTNAME = function(name: PAnsiChar; len: Integer): Integer; stdcall;
|
|
{$IFDEF WINCE}
|
|
// WinCE specific for setting the host name
|
|
{$EXTERNALSYM LPFN_SETHOSTNAME}
|
|
LPFN_SETHOSTNAME = function(pName : PAnsiChar; len : Integer) : Integer; stdcall;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM LPFN_GETSERVBYPORT}
|
|
LPFN_GETSERVBYPORT = function(const port: Integer; const proto: PAnsiChar): PServEnt; stdcall;
|
|
{$EXTERNALSYM LPFN_GETSERVBYNAME}
|
|
LPFN_GETSERVBYNAME = function(const name, proto: PAnsiChar): PServEnt; stdcall;
|
|
{$EXTERNALSYM LPFN_GETPROTOBYNUMBER}
|
|
LPFN_GETPROTOBYNUMBER = function(const proto: Integer): PProtoEnt; stdcall;
|
|
{$EXTERNALSYM LPFN_GETPROTOBYNAME}
|
|
LPFN_GETPROTOBYNAME = function(const name: PAnsiChar): PProtoEnt; stdcall;
|
|
{$EXTERNALSYM LPFN_WSASETLASTERROR}
|
|
LPFN_WSASETLASTERROR = procedure(const iError: Integer); stdcall;
|
|
{$EXTERNALSYM LPFN_WSAGETLASTERROR}
|
|
LPFN_WSAGETLASTERROR = function: Integer; stdcall;
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM LPFN_WSACANCELASYNCREQUEST}
|
|
LPFN_WSACANCELASYNCREQUEST = function(hAsyncTaskHandle: THandle): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAISBLOCKING}
|
|
LPFN_WSAISBLOCKING = function: BOOL; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAUNHOOKBLOCKINGHOOK}
|
|
LPFN_WSAUNHOOKBLOCKINGHOOK = function: Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSASETBLOCKINGHOOK}
|
|
LPFN_WSASETBLOCKINGHOOK = function(lpBlockFunc: TFarProc): TFarProc; stdcall;
|
|
{$EXTERNALSYM LPFN_WSACANCELBLOCKINGCALL}
|
|
LPFN_WSACANCELBLOCKINGCALL = function: Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAASYNCGETSERVBYNAME}
|
|
LPFN_WSAASYNCGETSERVBYNAME = function(HWindow: HWND; wMsg: u_int; name, proto, buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAASYNCGETSERVBYPORT}
|
|
LPFN_WSAASYNCGETSERVBYPORT = function(HWindow: HWND; wMsg, port: u_int; proto, buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAASYNCGETPROTOBYNAME}
|
|
LPFN_WSAASYNCGETPROTOBYNAME = function(HWindow: HWND; wMsg: u_int; name, buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAASYNCGETPROTOBYNUMBER}
|
|
LPFN_WSAASYNCGETPROTOBYNUMBER = function(HWindow: HWND; wMsg: u_int; number: Integer; buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAASYNCGETHOSTBYNAME}
|
|
LPFN_WSAASYNCGETHOSTBYNAME = function(HWindow: HWND; wMsg: u_int; name, buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAASYNCGETHOSTBYADDR}
|
|
LPFN_WSAASYNCGETHOSTBYADDR = function(HWindow: HWND; wMsg: u_int; AAddr: PAnsiChar; len, istruct: Integer; buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAASYNCSELECT}
|
|
LPFN_WSAASYNCSELECT = function(const s: TSocket; HWindow: HWND; wMsg: u_int; lEvent: Longint): Integer; stdcall;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM LPFN___WSAFDISSET}
|
|
LPFN___WSAFDISSET = function(const s: TSocket; var FDSet: TFDSet): Bool; stdcall;
|
|
|
|
// WinSock 2 API new function prototypes
|
|
{$EXTERNALSYM LPFN_WSAACCEPT}
|
|
LPFN_WSAACCEPT = function(const s : TSocket; AAddr : PSOCKADDR; addrlen : PInteger; lpfnCondition : LPCONDITIONPROC; const dwCallbackData : DWORD): TSocket; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAENUMPROTOCOLSA}
|
|
LPFN_WSAENUMPROTOCOLSA = function(lpiProtocols : PInteger; lpProtocolBuffer : LPWSAPROTOCOL_INFOA; var lpdwBufferLength : DWORD) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAENUMPROTOCOLSW}
|
|
LPFN_WSAENUMPROTOCOLSW = function(lpiProtocols : PInteger; lpProtocolBuffer : LPWSAPROTOCOL_INFOW; var lpdwBufferLength : DWORD) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAGETOVERLAPPEDRESULT}
|
|
LPFN_WSAGETOVERLAPPEDRESULT = function(const s : TSocket; AOverlapped: Pointer; lpcbTransfer : LPDWORD; fWait : BOOL; var lpdwFlags : DWORD) : WordBool; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAIOCTL}
|
|
LPFN_WSAIOCTL = function(const s : TSocket; dwIoControlCode : DWORD; lpvInBuffer : Pointer; cbInBuffer : DWORD; lpvOutBuffer : Pointer; cbOutBuffer : DWORD;
|
|
lpcbBytesReturned : LPDWORD; AOverlapped: Pointer; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSARECVFROM}
|
|
LPFN_WSARECVFROM = function(const s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesRecvd : DWORD; var lpFlags : DWORD;
|
|
lpFrom : PSOCKADDR; lpFromlen : PInteger; AOverlapped: Pointer; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_TRANSMITFILE}
|
|
LPFN_TRANSMITFILE = function(hSocket: TSocket; hFile: THandle; nNumberOfBytesToWrite, nNumberOfBytesPerSend: DWORD;
|
|
lpOverlapped: POverlapped; lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS; dwReserved: DWORD): BOOL; stdcall;
|
|
{$EXTERNALSYM LPFN_ACCEPTEX}
|
|
LPFN_ACCEPTEX = function(sListenSocket, sAcceptSocket: TSocket;
|
|
lpOutputBuffer: Pointer; dwReceiveDataLength, dwLocalAddressLength,
|
|
dwRemoteAddressLength: DWORD; var lpdwBytesReceived: DWORD;
|
|
lpOverlapped: POverlapped): BOOL; stdcall;
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM LPFN_WSACONNECTBYLIST}
|
|
LPFN_WSACONNECTBYLIST = function(const s : TSocket; SocketAddressList : PSOCKET_ADDRESS_LIST;
|
|
var LocalAddressLength : DWORD; LocalAddress : LPSOCKADDR;
|
|
var RemoteAddressLength : DWORD; RemoteAddress : LPSOCKADDR;
|
|
timeout : Ptimeval; Reserved : LPWSAOVERLAPPED):LongBool; stdcall;
|
|
{$EXTERNALSYM LPFN_WSACONNECTBYNAMEA}
|
|
LPFN_WSACONNECTBYNAMEA = function(const s : TSOCKET;
|
|
nodename : PAnsiChar; servicename : PAnsiChar;
|
|
var LocalAddressLength : DWORD; LocalAddress : LPSOCKADDR;
|
|
var RemoteAddressLength : DWORD; RemoteAddress : LPSOCKADDR;
|
|
timeout : Ptimeval; Reserved : LPWSAOVERLAPPED) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSACONNECTBYNAMEW}
|
|
LPFN_WSACONNECTBYNAMEW = function(const s : TSOCKET;
|
|
nodename : PWChar; servicename : PWChar;
|
|
var LocalAddressLength : DWORD; LocalAddress : LPSOCKADDR;
|
|
var RemoteAddressLength : DWORD; RemoteAddress : LPSOCKADDR;
|
|
timeout : Ptimeval; Reserved : LPWSAOVERLAPPED) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSACONNECTBYNAME}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSACONNECTBYNAME = LPFN_WSACONNECTBYNAMEW;
|
|
{$ELSE}
|
|
LPFN_WSACONNECTBYNAME = LPFN_WSACONNECTBYNAMEA;
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSAENUMPROTOCOLS}
|
|
{wince}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSAENUMPROTOCOLS = LPFN_WSAENUMPROTOCOLSW;
|
|
{$ELSE}
|
|
LPFN_WSAENUMPROTOCOLS = LPFN_WSAENUMPROTOCOLSA;
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSACLOSEEVENT}
|
|
LPFN_WSACLOSEEVENT = function(const hEvent : WSAEVENT) : WordBool; stdcall;
|
|
{$EXTERNALSYM LPFN_WSACONNECT}
|
|
LPFN_WSACONNECT = function(const s : TSocket; const name : PSOCKADDR; const namelen : Integer; lpCallerData, lpCalleeData : LPWSABUF; lpSQOS, lpGQOS : LPQOS) : Integer; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSACREATEEVENT}
|
|
LPFN_WSACREATEEVENT = function: WSAEVENT; stdcall;
|
|
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM LPFN_WSADUPLICATESOCKETA}
|
|
LPFN_WSADUPLICATESOCKETA = function(const s : TSocket; const dwProcessId : DWORD; lpProtocolInfo : LPWSAPROTOCOL_INFOA) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSADUPLICATESOCKETW}
|
|
LPFN_WSADUPLICATESOCKETW = function(const s : TSocket; const dwProcessId : DWORD; lpProtocolInfo : LPWSAPROTOCOL_INFOW) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSADUPLICATESOCKET}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSADUPLICATESOCKET = LPFN_WSADUPLICATESOCKETW;
|
|
{$ELSE}
|
|
LPFN_WSADUPLICATESOCKET = LPFN_WSADUPLICATESOCKETA;
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSAENUMNETWORKEVENTS}
|
|
LPFN_WSAENUMNETWORKEVENTS = function(const s : TSocket; const hEventObject : WSAEVENT; lpNetworkEvents : LPWSANETWORKEVENTS) :Integer; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSAEVENTSELECT}
|
|
LPFN_WSAEVENTSELECT = function(const s : TSocket; const hEventObject : WSAEVENT; lNetworkEvents : LongInt): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAGETQOSBYNAME}
|
|
LPFN_WSAGETQOSBYNAME = function(const s : TSocket; lpQOSName : LPWSABUF; lpQOS : LPQOS): WordBool; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAHTONL}
|
|
LPFN_WSAHTONL = function(const s : TSocket; hostlong : u_long; var lpnetlong : DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAHTONS}
|
|
LPFN_WSAHTONS = function(const s : TSocket; hostshort : u_short; var lpnetshort : WORD): Integer; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSAJOINLEAF}
|
|
LPFN_WSAJOINLEAF = function(const s : TSocket; name : PSOCKADDR; namelen : Integer; lpCallerData, lpCalleeData : LPWSABUF;
|
|
lpSQOS,lpGQOS : LPQOS; dwFlags : DWORD) : TSocket; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSANTOHL}
|
|
LPFN_WSANTOHL = function(const s : TSocket; netlong : u_long; var lphostlong : DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSANTOHS}
|
|
LPFN_WSANTOHS = function(const s : TSocket; netshort : u_short; var lphostshort : WORD): Integer; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSARECV}
|
|
LPFN_WSARECV = function(const s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesRecvd : DWORD; var lpFlags : DWORD;
|
|
lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSARECVDISCONNECT}
|
|
LPFN_WSARECVDISCONNECT = function(const s : TSocket; lpInboundDisconnectData : LPWSABUF): Integer; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSARESETEVENT}
|
|
LPFN_WSARESETEVENT = function(hEvent : WSAEVENT): WordBool; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSASEND}
|
|
LPFN_WSASEND = function(const s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesSent : DWORD; dwFlags : DWORD;
|
|
lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSASENDDISCONNECT}
|
|
LPFN_WSASENDDISCONNECT = function(const s : TSocket; lpOutboundDisconnectData : LPWSABUF): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSASENDTO}
|
|
LPFN_WSASENDTO = function(const s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesSent : DWORD; dwFlags : DWORD;
|
|
lpTo : LPSOCKADDR; iTolen : Integer; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSASETEVENT}
|
|
LPFN_WSASETEVENT = function(hEvent : WSAEVENT): WordBool; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSASOCKETA}
|
|
LPFN_WSASOCKETA = function(af, iType, protocol : Integer; lpProtocolInfo : LPWSAPROTOCOL_INFOA; g : GROUP; dwFlags : DWORD): TSocket; stdcall;
|
|
{$EXTERNALSYM LPFN_WSASOCKETW}
|
|
LPFN_WSASOCKETW = function(af, iType, protocol : Integer; lpProtocolInfo : LPWSAPROTOCOL_INFOW; g : GROUP; dwFlags : DWORD): TSocket; stdcall;
|
|
{$EXTERNALSYM LPFN_WSASOCKET}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSASOCKET = LPFN_WSASOCKETW;
|
|
{$ELSE}
|
|
LPFN_WSASOCKET = LPFN_WSASOCKETA;
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSAWAITFORMULTIPLEEVENTS}
|
|
LPFN_WSAWAITFORMULTIPLEEVENTS = function(cEvents : DWORD; lphEvents : PWSAEVENT; fWaitAll : LongBool;
|
|
dwTimeout : DWORD; fAlertable : LongBool): DWORD; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSAADDRESSTOSTRINGA}
|
|
LPFN_WSAADDRESSTOSTRINGA = function(lpsaAddress : PSOCKADDR; const dwAddressLength : DWORD; const lpProtocolInfo : LPWSAPROTOCOL_INFOA;
|
|
const lpszAddressString : PAnsiChar; var lpdwAddressStringLength : DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAADDRESSTOSTRINGW}
|
|
LPFN_WSAADDRESSTOSTRINGW = function(lpsaAddress : PSOCKADDR; const dwAddressLength : DWORD; const lpProtocolInfo : LPWSAPROTOCOL_INFOW;
|
|
const lpszAddressString : PWideChar; var lpdwAddressStringLength : DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAADDRESSTOSTRING}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSAADDRESSTOSTRING = LPFN_WSAADDRESSTOSTRINGW;
|
|
{$ELSE}
|
|
LPFN_WSAADDRESSTOSTRING = LPFN_WSAADDRESSTOSTRINGA;
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSASTRINGTOADDRESSA}
|
|
LPFN_WSASTRINGTOADDRESSA = function(const AddressString : PAnsiChar; const AddressFamily: Integer; const lpProtocolInfo : LPWSAPROTOCOL_INFOA;
|
|
var lpAddress : TSockAddr; var lpAddressLength : Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSASTRINGTOADDRESSW}
|
|
LPFN_WSASTRINGTOADDRESSW = function(const AddressString : PWideChar; const AddressFamily: Integer; const lpProtocolInfo : LPWSAPROTOCOL_INFOW;
|
|
var lpAddress : TSockAddr; var lpAddressLength : Integer): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSASTRINGTOADDRESS}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSASTRINGTOADDRESS = LPFN_WSASTRINGTOADDRESSW;
|
|
{$ELSE}
|
|
LPFN_WSASTRINGTOADDRESS = LPFN_WSASTRINGTOADDRESSA;
|
|
{$ENDIF}
|
|
|
|
// Registration and Name Resolution API functions
|
|
{$EXTERNALSYM LPFN_WSALOOKUPSERVICEBEGINA}
|
|
LPFN_WSALOOKUPSERVICEBEGINA = function(var qsRestrictions : TWSAQuerySetA; const dwControlFlags : DWORD; var hLookup : THandle): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSALOOKUPSERVICEBEGINw}
|
|
LPFN_WSALOOKUPSERVICEBEGINW = function(var qsRestrictions : TWSAQuerySetW; const dwControlFlags : DWORD; var hLookup : THandle): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSALOOKUPSERVICEBEGIN}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSALOOKUPSERVICEBEGIN = LPFN_WSALOOKUPSERVICEBEGINW;
|
|
{$ELSE}
|
|
LPFN_WSALOOKUPSERVICEBEGIN = LPFN_WSALOOKUPSERVICEBEGINA;
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSALOOKUPSERVICENEXTA}
|
|
LPFN_WSALOOKUPSERVICENEXTA = function(const hLookup : THandle; const dwControlFlags : DWORD; var dwBufferLength : DWORD; lpqsResults : PWSAQUERYSETA): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSALOOKUPSERVICENEXTW}
|
|
LPFN_WSALOOKUPSERVICENEXTW = function(const hLookup : THandle; const dwControlFlags : DWORD; var dwBufferLength : DWORD; lpqsResults : PWSAQUERYSETW): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSALOOKUPSERVICENEXT}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSALOOKUPSERVICENEXT = LPFN_WSALOOKUPSERVICENEXTW;
|
|
{$ELSE}
|
|
LPFN_WSALOOKUPSERVICENEXT = LPFN_WSALOOKUPSERVICENEXTA;
|
|
{$ENDIF}
|
|
|
|
//WinCE 4.20 doesn't support WSANSPIoctl but later versions do.
|
|
{$EXTERNALSYM LPFN_WSANSPIOCTL}
|
|
LPFN_WSANSPIOCTL = function(const hLookup : THANDLE; const dwControlCode : DWORD; lpvInBuffer : Pointer; var cbInBuffer : DWORD; lpvOutBuffer : Pointer; var cbOutBuffer : DWORD; var lpcbBytesReturned : DWORD; lpCompletion : LPWSACOMPLETION) : Integer; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSALOOKUPSERVICEEND}
|
|
LPFN_WSALOOKUPSERVICEEND = function(const hLookup : THandle): Integer; stdcall;
|
|
|
|
|
|
{$EXTERNALSYM LPFN_WSAINSTALLSERVICECLASSA}
|
|
LPFN_WSAINSTALLSERVICECLASSA = function(const lpServiceClassInfo : LPWSASERVICECLASSINFOA) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAINSTALLSERVICECLASSW}
|
|
LPFN_WSAINSTALLSERVICECLASSW = function(const lpServiceClassInfo : LPWSASERVICECLASSINFOW) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAINSTALLSERVICECLASS}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSAINSTALLSERVICECLASS = LPFN_WSAINSTALLSERVICECLASSW;
|
|
{$ELSE}
|
|
LPFN_WSAINSTALLSERVICECLASS = LPFN_WSAINSTALLSERVICECLASSA;
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSAREMOVESERVICECLASS}
|
|
LPFN_WSAREMOVESERVICECLASS = function(const lpServiceClassId : LPGUID) : Integer; stdcall;
|
|
|
|
{$EXTERNALSYM LPFN_WSAGETSERVICECLASSINFOA}
|
|
LPFN_WSAGETSERVICECLASSINFOA = function(const lpProviderId : LPGUID; const lpServiceClassId : LPGUID; var lpdwBufSize : DWORD;
|
|
lpServiceClassInfo : LPWSASERVICECLASSINFOA): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAGETSERVICECLASSINFOW}
|
|
LPFN_WSAGETSERVICECLASSINFOW = function(const lpProviderId : LPGUID; const lpServiceClassId : LPGUID; var lpdwBufSize : DWORD;
|
|
lpServiceClassInfo : LPWSASERVICECLASSINFOW): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAGETSERVICECLASSINFO}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSAGETSERVICECLASSINFO = LPFN_WSAGETSERVICECLASSINFOW;
|
|
{$ELSE}
|
|
LPFN_WSAGETSERVICECLASSINFO = LPFN_WSAGETSERVICECLASSINFOA;
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERSA}
|
|
LPFN_WSAENUMNAMESPACEPROVIDERSA = function(var lpdwBufferLength: DWORD; const lpnspBuffer: LPWSANAMESPACE_INFOA): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERSW}
|
|
LPFN_WSAENUMNAMESPACEPROVIDERSW = function(var lpdwBufferLength: DWORD; const lpnspBuffer: LPWSANAMESPACE_INFOW): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERS}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSAENUMNAMESPACEPROVIDERS = LPFN_WSAENUMNAMESPACEPROVIDERSW;
|
|
{$ELSE}
|
|
LPFN_WSAENUMNAMESPACEPROVIDERS = LPFN_WSAENUMNAMESPACEPROVIDERSA;
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA}
|
|
LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA = function(const lpServiceClassId: LPGUID; lpszServiceClassName: PAnsiChar; var lpdwBufferLength: DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW}
|
|
LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW = function(const lpServiceClassId: LPGUID; lpszServiceClassName: PWideChar; var lpdwBufferLength: DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAGETSERVICECLASSNAMEBYCLASSID}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSAGETSERVICECLASSNAMEBYCLASSID = LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW;
|
|
{$ELSE}
|
|
LPFN_WSAGETSERVICECLASSNAMEBYCLASSID = LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA;
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSASETSERVICEA}
|
|
LPFN_WSASETSERVICEA = function(const lpqsRegInfo: LPWSAQUERYSETA; const essoperation: WSAESETSERVICEOP; const dwControlFlags: DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSASETSERVICEW}
|
|
LPFN_WSASETSERVICEW = function(const lpqsRegInfo: LPWSAQUERYSETW; const essoperation: WSAESETSERVICEOP; const dwControlFlags: DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSASETSERVICE}
|
|
{$IFDEF UNICODE}
|
|
LPFN_WSASETSERVICE = LPFN_WSASETSERVICEW;
|
|
{$ELSE}
|
|
LPFN_WSASETSERVICE = LPFN_WSASETSERVICEA;
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM LPFN_WSAPROVIDERCONFIGCHANGE}
|
|
LPFN_WSAPROVIDERCONFIGCHANGE = function(var lpNotificationHandle : THandle; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) : Integer; stdcall;
|
|
|
|
//microsoft specific extension
|
|
{$EXTERNALSYM LPFN_GETACCEPTEXSOCKADDRS}
|
|
LPFN_GETACCEPTEXSOCKADDRS = procedure(lpOutputBuffer: Pointer;
|
|
dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
|
|
var LocalSockaddr: TSockAddr; var LocalSockaddrLength: Integer;
|
|
var RemoteSockaddr: TSockAddr; var RemoteSockaddrLength: Integer); stdcall;
|
|
|
|
{$IFNDEF WINCE}
|
|
//This is defined in the Windows Mobile 6 Standard SDK Refresh
|
|
//but I'm not sure what .DLL the function is in. I also couldn't find a WSAID
|
|
//constant for it.
|
|
{$EXTERNALSYM LPFN_WSARECVEX}
|
|
LPFN_WSARECVEX = function(s: TSocket; var buf; len: Integer; var flags: Integer): Integer; stdcall;
|
|
{$ENDIF}
|
|
|
|
//Windows Server 2003, Windows Vista
|
|
{$EXTERNALSYM LPFN_CONNECTEX}
|
|
LPFN_CONNECTEX = function(const s : TSocket; const name: PSOCKADDR; const namelen: Integer; lpSendBuffer : Pointer; dwSendDataLength : DWORD; var lpdwBytesSent : DWORD; lpOverlapped : LPWSAOVERLAPPED) : BOOL; stdcall;
|
|
{$EXTERNALSYM LPFN_DISCONNECTEX}
|
|
LPFN_DISCONNECTEX = function(const hSocket : TSocket; AOverlapped: Pointer; const dwFlags : DWORD; const dwReserved : DWORD) : BOOL; stdcall;
|
|
{$EXTERNALSYM LPFN_WSARECVMSG} //XP and Server 2003 only
|
|
LPFN_WSARECVMSG = function(const s : TSocket; lpMsg : LPWSAMSG; var lpNumberOfBytesRecvd : DWORD; AOverlapped: Pointer; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_TRANSMITPACKETS}
|
|
LPFN_TRANSMITPACKETS = function(s: TSocket; lpPacketArray: LPTRANSMIT_PACKETS_ELEMENT; nElementCount: DWORD; nSendSize: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: DWORD): BOOL; stdcall;
|
|
//Windows Vista, Windows Server 2008
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM LPFN_WSASENDMSG}
|
|
LPFN_WSASENDMSG = function(const s : TSocket; lpMsg : LPWSAMSG; const dwFlags : DWORD; var lpNumberOfBytesSent : DWORD; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_WSAPOLL}
|
|
LPFN_WSAPOLL = function(fdarray : LPWSAPOLLFD; const nfds : u_long; const timeout : Integer) : Integer; stdcall;
|
|
{$EXTERNALSYM LPFN_RIORECEIVE}
|
|
LPFN_RIORECEIVE = function (SocketQueue : RIO_RQ;
|
|
pData : PRIO_BUF;
|
|
const DataBufferCount : ULONG;
|
|
Flags : DWORD;
|
|
RequestContext : PVOID) : BOOL stdcall;
|
|
{$EXTERNALSYM LPFN_RIORECEIVEEX}
|
|
LPFN_RIORECEIVEEX = function (SocketQueu : RIO_RQ;
|
|
pData : PRIO_BUF;
|
|
const DataBufferCount : ULONG;
|
|
pLocalAddress, pRemoteAddress, pControlContext, pFlags : PRIO_BUF;
|
|
const Flags : DWORD; RequestContext : PVOID) : Integer stdcall;
|
|
{$EXTERNALSYM LPFN_RIOSEND}
|
|
LPFN_RIOSEND = function(SocketQueue : RIO_RQ;
|
|
pData : PRIO_BUF;
|
|
const DataBufferCount : ULONG;
|
|
const Flags : DWORD;
|
|
const RequestContext : PVOID) : Boolean stdcall;
|
|
{$EXTERNALSYM LPFN_RIOSENDEX}
|
|
LPFN_RIOSENDEX = function (SocketQueue : RIO_RQ;
|
|
pData : PRIO_BUF;
|
|
const DataBufferCount : ULONG;
|
|
pLocalAddress, pRemoteAddress, pControlContext, pFlags : PRIO_BUF;
|
|
const Flags : DWORD;
|
|
RequestContext : PVOID) : Boolean stdcall;
|
|
{$EXTERNALSYM LPFN_RIOCREATECOMPLETIONQUEUE}
|
|
LPFN_RIOCREATECOMPLETIONQUEUE = function (const QueueSize : DWORD;
|
|
NotificationCompletion : PRIO_NOTIFICATION_COMPLETION) : RIO_CQ stdcall;
|
|
{$EXTERNALSYM LPFN_RIOCREATEREQUESTQUEUE}
|
|
LPFN_RIOCREATEREQUESTQUEUE = function (const Socket : TSOCKET;
|
|
const MaxOutstandingReceive, MaxReceiveDataBuffers, MaxOutstandingSend, MaxSendDataBuffers : ULONG;
|
|
const ReceiveCQ, SendCQ : RIO_CQ; SocketContext : PVOID) : RIO_RQ stdcall;
|
|
{$EXTERNALSYM LPFN_RIODEQUEUECOMPLETION}
|
|
LPFN_RIODEQUEUECOMPLETION = function (const CQ : RIO_CQ; _Array : PRIORESULT; const ArraySize : ULONG) : ULONG stdcall;
|
|
{$EXTERNALSYM LPFN_RIODEREGISTERBUFFER}
|
|
LPFN_RIODEREGISTERBUFFER = procedure (const BufferId : RIO_BUFFERID) stdcall;
|
|
{$EXTERNALSYM LPFN_RIONOTIFY}
|
|
LPFN_RIONOTIFY = function (CQ : RIO_CQ) : Integer stdcall;
|
|
{$EXTERNALSYM LPFN_RIOREGISTERBUFFER}
|
|
LPFN_RIOREGISTERBUFFER = function (DataBuffer : PAnsiChar; const DataLength : DWORD) : BOOL stdcall;
|
|
{$EXTERNALSYM LPFN_RIORESIZECOMPLETIONQUEUE}
|
|
LPFN_RIORESIZECOMPLETIONQUEUE = function(const CQ : RIO_CQ; const QueueSize : DWORD) : BOOL stdcall;
|
|
{$EXTERNALSYM LPFN_RIORESIZEREQUESTQUEUE}
|
|
LPFN_RIORESIZEREQUESTQUEUE = function(const RQ : RIO_RQ; const MaxOutstandingReceive, MaxOutstandingSend : DWORD) : BOOL stdcall;
|
|
{$EXTERNALSYM LPFN_RIOCLOSECOMPLETIONQUEUE}
|
|
LPFN_RIOCLOSECOMPLETIONQUEUE = procedure (const CQ : RIO_CQ) stdcall;
|
|
{$EXTERNALSYM _RIO_EXTENSION_FUNCTION_TABLE}
|
|
_RIO_EXTENSION_FUNCTION_TABLE = record
|
|
cbSize : DWORD;
|
|
RIOReceive : LPFN_RIORECEIVE;
|
|
RIOReceiveEx : LPFN_RIORECEIVEEX;
|
|
RIOSend : LPFN_RIOSEND;
|
|
RIOSendEx : LPFN_RIOSENDEX;
|
|
RIOCloseCompletionQueue : LPFN_RIOCLOSECOMPLETIONQUEUE;
|
|
RIOCreateCompletionQueue : LPFN_RIOCREATECOMPLETIONQUEUE;
|
|
RIOCreateRequestQueue : LPFN_RIOCREATEREQUESTQUEUE;
|
|
RIODequeueCompletion : LPFN_RIODEQUEUECOMPLETION;
|
|
RIODeregisterBuffer : LPFN_RIODEREGISTERBUFFER;
|
|
RIONotify : LPFN_RIONOTIFY;
|
|
RIORegisterBuffer : LPFN_RIOREGISTERBUFFER;
|
|
RIOResizeCompletionQueue : LPFN_RIORESIZECOMPLETIONQUEUE;
|
|
RIOResizeRequestQueue : LPFN_RIORESIZEREQUESTQUEUE;
|
|
end;
|
|
{$EXTERNALSYM RIO_EXTENSION_FUNCTION_TABLE}
|
|
RIO_EXTENSION_FUNCTION_TABLE = _RIO_EXTENSION_FUNCTION_TABLE;
|
|
{$EXTERNALSYM PRIO_EXTENSION_FUNCTION_TABLE}
|
|
PRIO_EXTENSION_FUNCTION_TABLE = ^RIO_EXTENSION_FUNCTION_TABLE;
|
|
{$ENDIF} // $IFDEF INCL_WINSOCK_API_TYPEDEFS
|
|
|
|
|
|
const
|
|
//GUID's for Microsoft extensions
|
|
{$EXTERNALSYM WSAID_ACCEPTEX}
|
|
WSAID_ACCEPTEX: TGuid = (D1:$b5367df1;D2:$cbac;D3:$11cf;D4:($95,$ca,$00,$80,$5f,$48,$a1,$92));
|
|
{$EXTERNALSYM WSAID_CONNECTEX}
|
|
WSAID_CONNECTEX: TGuid = (D1:$25a207b9;D2:$ddf3;D3:$4660;D4:($8e,$e9,$76,$e5,$8c,$74,$06,$3e));
|
|
{$EXTERNALSYM WSAID_DISCONNECTEX}
|
|
WSAID_DISCONNECTEX: TGuid = (D1:$7fda2e11;D2:$8630;D3:$436f;D4:($a0,$31,$f5,$36,$a6,$ee,$c1,$57));
|
|
{$EXTERNALSYM WSAID_GETACCEPTEXSOCKADDRS}
|
|
WSAID_GETACCEPTEXSOCKADDRS: TGuid = (D1:$b5367df2;D2:$cbac;D3:$11cf;D4:($95,$ca,$00,$80,$5f,$48,$a1,$92));
|
|
{$EXTERNALSYM WSAID_TRANSMITFILE}
|
|
WSAID_TRANSMITFILE: TGuid = (D1:$b5367df0; D2:$cbac; D3:$11cf; D4:($95, $ca, $00, $80, $5f, $48, $a1, $92));
|
|
{$EXTERNALSYM WSAID_TRANSMITPACKETS}
|
|
WSAID_TRANSMITPACKETS: TGuid = (D1:$d9689da0;D2:$1f90;D3:$11d3;D4:($99,$71,$00,$c0,$4f,$68,$c8,$76));
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM WSAID_WSAPOLL}
|
|
WSAID_WSAPOLL: TGuid = (D1:$18C76F85;D2:$DC66;D3:$4964;D4:($97,$2E,$23,$C2,$72,$38,$31,$2B));
|
|
{$ENDIF}
|
|
{$EXTERNALSYM WSAID_WSARECVMSG}
|
|
WSAID_WSARECVMSG: TGuid = (D1:$f689d7c8;D2:$6f1f;D3:$436b;D4:($8a,$53,$e5,$4f,$e3,$51,$c3,$22));
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM WSAID_WSASENDMSG}
|
|
WSAID_WSASENDMSG : TGuid = (D1:$a441e712;D2:$754f;D3:$43ca;D4:($84,$a7,$0d,$ee,$44,$cf,$60,$6d));
|
|
{$EXTERNALSYM WSAID_MULTIPLE_RIO}
|
|
WSAID_MULTIPLE_RIO : TGuid = (D1:$8509e081;D2:$96dd;D3:$4005;D4:($b1,$65,$9e,$2e,$e8,$c7,$9e,$3f));
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WS2_DLL_FUNC_VARS}
|
|
var
|
|
{$EXTERNALSYM WSAStartup}
|
|
WSAStartup : LPFN_WSASTARTUP = nil;
|
|
{$EXTERNALSYM WSACleanup}
|
|
WSACleanup : LPFN_WSACLEANUP = nil;
|
|
{$EXTERNALSYM accept}
|
|
accept : LPFN_ACCEPT = nil;
|
|
{$EXTERNALSYM bind}
|
|
bind : LPFN_BIND = nil;
|
|
{$EXTERNALSYM closesocket}
|
|
closesocket : LPFN_CLOSESOCKET = nil;
|
|
{$EXTERNALSYM connect}
|
|
connect : LPFN_CONNECT = nil;
|
|
{$EXTERNALSYM ioctlsocket}
|
|
ioctlsocket : LPFN_IOCTLSOCKET = nil;
|
|
{$EXTERNALSYM getpeername}
|
|
getpeername : LPFN_GETPEERNAME = nil;
|
|
{$EXTERNALSYM getsockname}
|
|
getsockname : LPFN_GETSOCKNAME = nil;
|
|
{$EXTERNALSYM getsockopt}
|
|
getsockopt : LPFN_GETSOCKOPT = nil;
|
|
{$EXTERNALSYM htonl}
|
|
htonl : LPFN_HTONL = nil;
|
|
{$EXTERNALSYM htons}
|
|
htons : LPFN_HTONS = nil;
|
|
{$EXTERNALSYM inet_addr}
|
|
inet_addr : LPFN_INET_ADDR = nil;
|
|
{$EXTERNALSYM inet_ntoa}
|
|
inet_ntoa : LPFN_INET_NTOA = nil;
|
|
{$EXTERNALSYM listen}
|
|
listen : LPFN_LISTEN = nil;
|
|
{$EXTERNALSYM ntohl}
|
|
ntohl : LPFN_NTOHL = nil;
|
|
{$EXTERNALSYM ntohs}
|
|
ntohs : LPFN_NTOHS = nil;
|
|
{$EXTERNALSYM recv}
|
|
recv : LPFN_RECV = nil;
|
|
{$EXTERNALSYM recvfrom}
|
|
recvfrom : LPFN_RECVFROM = nil;
|
|
{$EXTERNALSYM select}
|
|
select : LPFN_SELECT = nil;
|
|
{$EXTERNALSYM send}
|
|
send : LPFN_SEND = nil;
|
|
{$EXTERNALSYM sendto}
|
|
sendto : LPFN_SENDTO = nil;
|
|
{$EXTERNALSYM setsockopt}
|
|
setsockopt : LPFN_SETSOCKOPT = nil;
|
|
{$EXTERNALSYM shutdown}
|
|
shutdown : LPFN_SHUTDOWN = nil;
|
|
{$EXTERNALSYM socket}
|
|
socket : LPFN_SOCKET = nil;
|
|
{$EXTERNALSYM gethostbyaddr}
|
|
gethostbyaddr : LPFN_GETHOSTBYADDR = nil;
|
|
{$EXTERNALSYM gethostbyname}
|
|
gethostbyname : LPFN_GETHOSTBYNAME = nil;
|
|
{$EXTERNALSYM gethostname}
|
|
gethostname : LPFN_GETHOSTNAME = nil;
|
|
{$IFDEF WINCE}
|
|
{$EXTERNALSYM sethostname}
|
|
sethostname : LPFN_SETHOSTNAME = nil;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM getservbyport}
|
|
getservbyport : LPFN_GETSERVBYPORT = nil;
|
|
{$EXTERNALSYM getservbyname}
|
|
getservbyname : LPFN_GETSERVBYNAME = nil;
|
|
{$EXTERNALSYM getprotobynumber}
|
|
getprotobynumber : LPFN_GETPROTOBYNUMBER = nil;
|
|
{$EXTERNALSYM getprotobyname}
|
|
getprotobyname : LPFN_GETPROTOBYNAME = nil;
|
|
{$EXTERNALSYM WSASetLastError}
|
|
WSASetLastError : LPFN_WSASETLASTERROR = nil;
|
|
{$EXTERNALSYM WSAGetLastError}
|
|
WSAGetLastError : LPFN_WSAGETLASTERROR = nil;
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM WSAIsblocking}
|
|
WSAIsBlocking : LPFN_WSAISBLOCKING = nil;
|
|
{$EXTERNALSYM WSAUnhookBlockingHook}
|
|
WSAUnhookBlockingHook : LPFN_WSAUNHOOKBLOCKINGHOOK = nil;
|
|
{$EXTERNALSYM WSASetBlockingHook}
|
|
WSASetBlockingHook : LPFN_WSASETBLOCKINGHOOK = nil;
|
|
{$EXTERNALSYM WSACancelBlockingCall}
|
|
WSACancelBlockingCall : LPFN_WSACANCELBLOCKINGCALL = nil;
|
|
{$EXTERNALSYM WSAAsyncGetServByName}
|
|
WSAAsyncGetServByName : LPFN_WSAASYNCGETSERVBYNAME = nil;
|
|
{$EXTERNALSYM WSAAsyncGetServByPort}
|
|
WSAAsyncGetServByPort : LPFN_WSAASYNCGETSERVBYPORT = nil;
|
|
{$EXTERNALSYM WSAAsyncGetProtoByName}
|
|
WSAAsyncGetProtoByName : LPFN_WSAASYNCGETPROTOBYNAME = nil;
|
|
{$EXTERNALSYM WSAAsyncGetProtoByNumber}
|
|
WSAAsyncGetProtoByNumber : LPFN_WSAASYNCGETPROTOBYNUMBER = nil;
|
|
{$EXTERNALSYM WSAAsyncGetHostByName}
|
|
WSAAsyncGetHostByName : LPFN_WSAASYNCGETHOSTBYNAME = nil;
|
|
{$EXTERNALSYM WSAAsyncGetHostByAddr}
|
|
WSAAsyncGetHostByAddr : LPFN_WSAASYNCGETHOSTBYADDR = nil;
|
|
{$EXTERNALSYM WSACancelAsyncRequest}
|
|
WSACancelAsyncRequest : LPFN_WSACANCELASYNCREQUEST = nil;
|
|
{$EXTERNALSYM WSAAsyncSelect}
|
|
WSAAsyncSelect : LPFN_WSAASYNCSELECT = nil;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM __WSAFDIsSet}
|
|
__WSAFDIsSet : LPFN___WSAFDISSET = nil;
|
|
{$EXTERNALSYM WSAAccept}
|
|
WSAAccept : LPFN_WSAACCEPT = nil;
|
|
{$EXTERNALSYM WSAAddressToStringA}
|
|
WSAAddressToStringA : LPFN_WSAADDRESSTOSTRINGA = nil;
|
|
{$EXTERNALSYM WSAAddressToStringW}
|
|
WSAAddressToStringW : LPFN_WSAADDRESSTOSTRINGW = nil;
|
|
{$EXTERNALSYM WSAAddressToString}
|
|
WSAAddressToString : LPFN_WSAADDRESSTOSTRING = nil;
|
|
{$EXTERNALSYM WSACloseEvent}
|
|
WSACloseEvent : LPFN_WSACLOSEEVENT = nil;
|
|
{$EXTERNALSYM WSAConnect}
|
|
WSAConnect : LPFN_WSACONNECT = nil;
|
|
{$EXTERNALSYM WSACreateEvent}
|
|
WSACreateEvent : LPFN_WSACREATEEVENT = nil;
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM WSADuplicateSocketA}
|
|
WSADuplicateSocketA : LPFN_WSADUPLICATESOCKETA = nil;
|
|
{$EXTERNALSYM WSADuplicateSocketW}
|
|
WSADuplicateSocketW : LPFN_WSADUPLICATESOCKETW = nil;
|
|
{$EXTERNALSYM WSADuplicateSocket}
|
|
WSADuplicateSocket : LPFN_WSADUPLICATESOCKET = nil;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM WSAEnumNetworkEvents}
|
|
WSAEnumNetworkEvents : LPFN_WSAENUMNETWORKEVENTS = nil;
|
|
{$EXTERNALSYM WSAEnumProtocolsA}
|
|
WSAEnumProtocolsA : LPFN_WSAENUMPROTOCOLSA = nil;
|
|
{$EXTERNALSYM WSAEnumProtocolsW}
|
|
WSAEnumProtocolsW : LPFN_WSAENUMPROTOCOLSW = nil;
|
|
{$EXTERNALSYM WSAEnumProtocols}
|
|
WSAEnumProtocols : LPFN_WSAENUMPROTOCOLS = nil;
|
|
{$EXTERNALSYM WSAEnumNameSpaceProvidersA}
|
|
WSAEnumNameSpaceProvidersA : LPFN_WSAENUMNAMESPACEPROVIDERSA = nil;
|
|
{$EXTERNALSYM WSAEnumNameSpaceProvidersW}
|
|
WSAEnumNameSpaceProvidersW : LPFN_WSAENUMNAMESPACEPROVIDERSW = nil;
|
|
{$EXTERNALSYM WSAEnumNameSpaceProviders}
|
|
WSAEnumNameSpaceProviders : LPFN_WSAENUMNAMESPACEPROVIDERS = nil;
|
|
{$EXTERNALSYM WSAEventSelect}
|
|
WSAEventSelect : LPFN_WSAEVENTSELECT = nil;
|
|
{$EXTERNALSYM WSAGetOverlappedResult}
|
|
WSAGetOverlappedResult : LPFN_WSAGETOVERLAPPEDRESULT = nil;
|
|
|
|
{$EXTERNALSYM WSAGetQosByName}
|
|
WSAGetQosByName : LPFN_WSAGETQOSBYNAME = nil;
|
|
{$EXTERNALSYM WSAGetServiceClassInfoA}
|
|
WSAGetServiceClassInfoA : LPFN_WSAGETSERVICECLASSINFOA = nil;
|
|
{$EXTERNALSYM WSAGetServiceClassInfoW}
|
|
WSAGetServiceClassInfoW : LPFN_WSAGETSERVICECLASSINFOW = nil;
|
|
{$EXTERNALSYM WSAGetServiceClassInfo}
|
|
WSAGetServiceClassInfo : LPFN_WSAGETSERVICECLASSINFO = nil;
|
|
{$EXTERNALSYM WSAGetServiceClassNameByClassIdA}
|
|
WSAGetServiceClassNameByClassIdA : LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA = nil;
|
|
{$EXTERNALSYM WSAGetServiceClassNameByClassIdW}
|
|
WSAGetServiceClassNameByClassIdW : LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW = nil;
|
|
{$EXTERNALSYM WSAGetServiceClassNameByClassId}
|
|
WSAGetServiceClassNameByClassId : LPFN_WSAGETSERVICECLASSNAMEBYCLASSID = nil;
|
|
|
|
{$EXTERNALSYM WSAHtonl}
|
|
WSAHtonl : LPFN_WSAHTONL = nil;
|
|
{$EXTERNALSYM WSAHtons}
|
|
WSAHtons : LPFN_WSAHTONS = nil;
|
|
{$EXTERNALSYM WSAIoctl}
|
|
WSAIoctl : LPFN_WSAIOCTL = nil;
|
|
{$EXTERNALSYM WSAInstallServiceClassA}
|
|
WSAInstallServiceClassA : LPFN_WSAINSTALLSERVICECLASSA = nil;
|
|
{$EXTERNALSYM WSAInstallServiceClassW}
|
|
WSAInstallServiceClassW : LPFN_WSAINSTALLSERVICECLASSW = nil;
|
|
{$EXTERNALSYM WSAInstallServiceClass}
|
|
WSAInstallServiceClass : LPFN_WSAINSTALLSERVICECLASS = nil;
|
|
{$EXTERNALSYM WSAJoinLeaf}
|
|
WSAJoinLeaf : LPFN_WSAJOINLEAF = nil;
|
|
{$EXTERNALSYM WSALookupServiceBeginA}
|
|
WSALookupServiceBeginA : LPFN_WSALOOKUPSERVICEBEGINA = nil;
|
|
{$EXTERNALSYM WSALookupServiceBeginW}
|
|
WSALookupServiceBeginW : LPFN_WSALOOKUPSERVICEBEGINW = nil;
|
|
{$EXTERNALSYM WSALookupServiceBegin}
|
|
WSALookupServiceBegin : LPFN_WSALOOKUPSERVICEBEGIN = nil;
|
|
{$EXTERNALSYM WSALookupServiceEnd}
|
|
WSALookupServiceEnd : LPFN_WSALOOKUPSERVICEEND = nil;
|
|
{$EXTERNALSYM WSALookupServiceNextA}
|
|
WSALookupServiceNextA : LPFN_WSALOOKUPSERVICENEXTA = nil;
|
|
{$EXTERNALSYM WSALookupServiceNextW}
|
|
WSALookupServiceNextW : LPFN_WSALOOKUPSERVICENEXTW = nil;
|
|
{$EXTERNALSYM WSALookupServiceNext}
|
|
WSALookupServiceNext : LPFN_WSALOOKUPSERVICENEXT = nil;
|
|
{$EXTERNALSYM WSANtohl}
|
|
WSANtohl : LPFN_WSANTOHL = nil;
|
|
{$EXTERNALSYM WSANtohs}
|
|
WSANtohs : LPFN_WSANTOHS = nil;
|
|
{$EXTERNALSYM WSARecv}
|
|
WSARecv : LPFN_WSARECV = nil;
|
|
{$EXTERNALSYM WSARecvDisconnect}
|
|
WSARecvDisconnect : LPFN_WSARECVDISCONNECT = nil;
|
|
{$EXTERNALSYM WSARecvFrom}
|
|
WSARecvFrom : LPFN_WSARECVFROM = nil;
|
|
{$EXTERNALSYM WSARemoveServiceClass}
|
|
WSARemoveServiceClass : LPFN_WSAREMOVESERVICECLASS = nil;
|
|
{$EXTERNALSYM WSAResetEvent}
|
|
WSAResetEvent : LPFN_WSARESETEVENT = nil;
|
|
{$EXTERNALSYM WSASend}
|
|
WSASend : LPFN_WSASEND = nil;
|
|
{$EXTERNALSYM WSASendDisconnect}
|
|
WSASendDisconnect : LPFN_WSASENDDISCONNECT = nil;
|
|
{$EXTERNALSYM WSASendTo}
|
|
WSASendTo : LPFN_WSASENDTO = nil;
|
|
{$EXTERNALSYM WSASetEvent}
|
|
WSASetEvent : LPFN_WSASETEVENT = nil;
|
|
{$EXTERNALSYM WSASetServiceA}
|
|
WSASetServiceA : LPFN_WSASETSERVICEA = nil;
|
|
{$EXTERNALSYM WSASetServiceW}
|
|
WSASetServiceW : LPFN_WSASETSERVICEW = nil;
|
|
{$EXTERNALSYM WSASetService}
|
|
WSASetService : LPFN_WSASETSERVICE = nil;
|
|
{$EXTERNALSYM WSASocketA}
|
|
WSASocketA : LPFN_WSASOCKETA = nil;
|
|
{$EXTERNALSYM WSASocketW}
|
|
WSASocketW : LPFN_WSASOCKETW = nil;
|
|
{$EXTERNALSYM WSASocket}
|
|
WSASocket : LPFN_WSASOCKET = nil;
|
|
{$EXTERNALSYM WSAStringToAddressA}
|
|
WSAStringToAddressA : LPFN_WSASTRINGTOADDRESSA = nil;
|
|
{$EXTERNALSYM WSAStringToAddressW}
|
|
WSAStringToAddressW : LPFN_WSASTRINGTOADDRESSW = nil;
|
|
{$EXTERNALSYM WSAStringToAddress}
|
|
WSAStringToAddress : LPFN_WSASTRINGTOADDRESS = nil;
|
|
|
|
{$EXTERNALSYM WSAWaitForMultipleEvents}
|
|
WSAWaitForMultipleEvents : LPFN_WSAWAITFORMULTIPLEEVENTS = nil;
|
|
{$EXTERNALSYM WSAProviderConfigChange}
|
|
WSAProviderConfigChange : LPFN_WSAPROVIDERCONFIGCHANGE = nil;
|
|
{$EXTERNALSYM TransmitFile}
|
|
TransmitFile : LPFN_TRANSMITFILE = nil;
|
|
{$EXTERNALSYM AcceptEx}
|
|
AcceptEx : LPFN_ACCEPTEX = nil;
|
|
{$EXTERNALSYM GetAcceptExSockaddrs}
|
|
GetAcceptExSockaddrs : LPFN_GETACCEPTEXSOCKADDRS = nil;
|
|
{$IFNDEF WINCE}
|
|
//This is defined in the Windows Mobile 6 Standard SDK Refresh
|
|
//but I'm not sure what .DLL the function is in. I also couldn't find a WSAID
|
|
//constant for it.
|
|
{$EXTERNALSYM WSARecvEx}
|
|
WSARecvEx : LPFN_WSARECVEX = nil;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM ConnectEx}
|
|
ConnectEx : LPFN_CONNECTEX = nil;
|
|
{$EXTERNALSYM DisconnectEx}
|
|
DisconnectEx : LPFN_DISCONNECTEX = nil;
|
|
{$EXTERNALSYM WSARecvMsg}
|
|
WSARecvMsg : LPFN_WSARECVMSG = nil;
|
|
{$EXTERNALSYM TransmitPackets}
|
|
TransmitPackets : LPFN_TRANSMITPACKETS = nil;
|
|
{$IFNDEF WINCE}
|
|
//Windows Vista, Windows Server 2008
|
|
{$EXTERNALSYM WSASendMsg}
|
|
WSASendMsg: LPFN_WSASENDMSG = nil;
|
|
{$EXTERNALSYM WSAPoll}
|
|
WSAPoll: LPFN_WSAPOLL = nil;
|
|
{$ENDIF}
|
|
//WSANSPIoctl is not supported in WinCE 4.20 but is supported in later versions.
|
|
{$EXTERNALSYM WSANSPIoctl}
|
|
WSANSPIoctl : LPFN_WSANSPIOCTL = nil;
|
|
{$ENDIF} // $IFDEF WS2_DLL_FUNC_VARS
|
|
|
|
{ Macros }
|
|
{$EXTERNALSYM WSAMakeSyncReply}
|
|
function WSAMakeSyncReply(Buflen, AError: Word): Longint;
|
|
{$EXTERNALSYM WSAMakeSelectReply}
|
|
function WSAMakeSelectReply(Event, AError: Word): Longint;
|
|
{$EXTERNALSYM WSAGetAsyncBuflen}
|
|
function WSAGetAsyncBuflen(Param: LPARAM): Word;
|
|
{$EXTERNALSYM WSAGetAsyncError}
|
|
function WSAGetAsyncError(Param: LPARAM): Word;
|
|
{$EXTERNALSYM WSAGetSelectEvent}
|
|
function WSAGetSelectEvent(Param: LPARAM): Word;
|
|
{$EXTERNALSYM WSAGetSelectError}
|
|
function WSAGetSelectError(Param: LPARAM): Word;
|
|
|
|
{$EXTERNALSYM FD_CLR}
|
|
procedure FD_CLR(ASocket: TSocket; var FDSet: TFDSet);
|
|
{$EXTERNALSYM FD_ISSET}
|
|
function FD_ISSET(ASocket: TSocket; var FDSet: TFDSet): Boolean;
|
|
{$EXTERNALSYM FD_SET}
|
|
procedure FD_SET(ASocket: TSocket; var FDSet: TFDSet);
|
|
{$EXTERNALSYM FD_ZERO}
|
|
procedure FD_ZERO(var FDSet: TFDSet);
|
|
|
|
{$IFNDEF WINCE}
|
|
//Posix aliases for helper macros
|
|
// #define CMSGHDR_ALIGN WSA_CMSGHDR_ALIGN
|
|
{$EXTERNALSYM CMSGHDR_ALIGN}
|
|
function CMSGHDR_ALIGN(const Alength: SIZE_T): SIZE_T;
|
|
// #define CMSGDATA_ALIGN WSA_CMSGDATA_ALIGN
|
|
{$EXTERNALSYM CMSGDATA_ALIGN}
|
|
function CMSGDATA_ALIGN(const Alength: PtrUInt): PtrUInt;
|
|
//#define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
|
|
{$EXTERNALSYM CMSG_FIRSTHDR}
|
|
function CMSG_FIRSTHDR(const msg: LPWSAMSG): LPWSACMSGHDR;
|
|
// #define CMSG_NXTHDR WSA_CMSG_NXTHDR
|
|
{$EXTERNALSYM CMSG_NXTHDR}
|
|
function CMSG_NXTHDR(const msg: LPWSAMSG; const cmsg: LPWSACMSGHDR): LPWSACMSGHDR;
|
|
// #define CMSG_SPACE WSA_CMSG_SPACE
|
|
{$EXTERNALSYM CMSG_SPACE}
|
|
function CMSG_SPACE(const Alength: PtrUInt): PtrUInt;
|
|
// #define CMSG_LEN WSA_CMSG_LEN
|
|
{$EXTERNALSYM CMSG_LEN}
|
|
function CMSG_LEN(const Alength: SIZE_T): SIZE_T;
|
|
//
|
|
{$EXTERNALSYM WSA_CMSGHDR_ALIGN}
|
|
function WSA_CMSGHDR_ALIGN(const Alength: PtrUInt): PtrUInt;
|
|
{$EXTERNALSYM WSA_CMSGDATA_ALIGN}
|
|
function WSA_CMSGDATA_ALIGN(const Alength: PtrUInt): PtrUInt;
|
|
{$EXTERNALSYM WSA_CMSG_FIRSTHDR}
|
|
function WSA_CMSG_FIRSTHDR(const msg: LPWSAMSG): LPWSACMSGHDR;
|
|
// #define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
|
|
{$EXTERNALSYM WSA_CMSG_NXTHDR}
|
|
function WSA_CMSG_NXTHDR(const msg: LPWSAMSG; const cmsg: LPWSACMSGHDR): LPWSACMSGHDR;
|
|
|
|
{$EXTERNALSYM WSA_CMSG_DATA}
|
|
function WSA_CMSG_DATA(const cmsg: LPWSACMSGHDR): PByte;
|
|
{$EXTERNALSYM WSA_CMSG_SPACE}
|
|
function WSA_CMSG_SPACE(const Alength: SIZE_T): SIZE_T;
|
|
{$EXTERNALSYM WSA_CMSG_LEN}
|
|
function WSA_CMSG_LEN(const Alength: SIZE_T): SIZE_T;
|
|
{$ENDIF}
|
|
|
|
//=============================================================
|
|
|
|
{
|
|
WS2TCPIP.H - WinSock2 Extension for TCP/IP protocols
|
|
|
|
This file contains TCP/IP specific information for use
|
|
by WinSock2 compatible applications.
|
|
|
|
Copyright (c) 1995-1999 Microsoft Corporation
|
|
|
|
To provide the backward compatibility, all the TCP/IP
|
|
specific definitions that were included in the WINSOCK.H
|
|
file are now included in WINSOCK2.H file. WS2TCPIP.H
|
|
file includes only the definitions introduced in the
|
|
"WinSock 2 Protocol-Specific Annex" document.
|
|
|
|
Rev 0.3 Nov 13, 1995
|
|
Rev 0.4 Dec 15, 1996
|
|
}
|
|
|
|
type
|
|
// Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP
|
|
{$EXTERNALSYM ip_mreq}
|
|
ip_mreq = record
|
|
imr_multiaddr : TInAddr; // IP multicast address of group
|
|
imr_interface : TInAddr; // local IP address of interface
|
|
end;
|
|
|
|
// Argument structure for IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP,
|
|
// IP_BLOCK_SOURCE, and IP_UNBLOCK_SOURCE
|
|
{$EXTERNALSYM ip_mreq_source}
|
|
ip_mreq_source = record
|
|
imr_multiaddr: TInAddr; // IP multicast address of group
|
|
imr_sourceaddr: TInAddr; // IP address of source
|
|
imr_interface: TInAddr; // local IP address of interface
|
|
end;
|
|
|
|
// Argument structure for SIO_{GET,SET}_MULTICAST_FILTER
|
|
{$EXTERNALSYM ip_msfilter}
|
|
ip_msfilter = record
|
|
imsf_multiaddr: TInAddr; // IP multicast address of group
|
|
imsf_interface: TInAddr; // local IP address of interface
|
|
imsf_fmode: u_long; // filter mode - INCLUDE or EXCLUDE
|
|
imsf_numsrc: u_long; // number of sources in src_list
|
|
imsf_slist: Array[0..0] of TInAddr;
|
|
end;
|
|
|
|
{$EXTERNALSYM IP_MSFILTER_SIZE}
|
|
function IP_MSFILTER_SIZE(const numsrc: DWORD): PtrUInt;
|
|
|
|
// TCP/IP specific Ioctl codes
|
|
const
|
|
{$EXTERNALSYM SIO_GET_INTERFACE_LIST}
|
|
SIO_GET_INTERFACE_LIST = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or 127; {Do not Localize}
|
|
// New IOCTL with address size independent address array
|
|
{$EXTERNALSYM SIO_GET_INTERFACE_LIST_EX}
|
|
SIO_GET_INTERFACE_LIST_EX = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or 126; {Do not Localize}
|
|
{$EXTERNALSYM SIO_SET_MULTICAST_FILTER}
|
|
SIO_SET_MULTICAST_FILTER = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or 125; {Do not Localize}
|
|
{$EXTERNALSYM SIO_GET_MULTICAST_FILTER}
|
|
SIO_GET_MULTICAST_FILTER = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or (124 or IOC_IN); {Do not Localize}
|
|
{$EXTERNALSYM SIOCSIPMSFILTER}
|
|
SIOCSIPMSFILTER = SIO_SET_MULTICAST_FILTER;
|
|
{$EXTERNALSYM SIOCGIPMSFILTER}
|
|
SIOCGIPMSFILTER = SIO_GET_MULTICAST_FILTER;
|
|
//
|
|
// Protocol independent ioctls for setting and retrieving multicast filters.
|
|
//
|
|
{$EXTERNALSYM SIOCSMSFILTER}
|
|
SIOCSMSFILTER = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or 126; {Do not Localize}
|
|
{$EXTERNALSYM SIOCGMSFILTER}
|
|
SIOCGMSFILTER = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or (127 or IOC_IN); {Do not Localize}
|
|
|
|
{$IFNDEF WINCE}
|
|
//Windows 2008 and Windows Vista SP1 additions
|
|
{$EXTERNALSYM SIO_IDEAL_SEND_BACKLOG_QUERY}
|
|
SIO_IDEAL_SEND_BACKLOG_QUERY = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or 123;
|
|
{$EXTERNALSYM SIO_IDEAL_SEND_BACKLOG_CHANGE}
|
|
SIO_IDEAL_SEND_BACKLOG_CHANGE = IOC_VOID or (Ord('t') shl 8) or 122;
|
|
{$ENDIF}
|
|
|
|
{$IFNDEF WINCE}
|
|
// Options for use with [gs]etsockopt at the IP level.
|
|
{$EXTERNALSYM IP_OPTIONS}
|
|
IP_OPTIONS = 1; // set/get IP options
|
|
{$EXTERNALSYM IP_HDRINCL}
|
|
IP_HDRINCL = 2; // header is included with data
|
|
{$EXTERNALSYM IP_TOS}
|
|
IP_TOS = 3; // IP type of service and preced
|
|
{$EXTERNALSYM IP_TTL}
|
|
IP_TTL = 4; // IP time to live
|
|
{$EXTERNALSYM IP_MULTICAST_IF}
|
|
IP_MULTICAST_IF = 9; // set/get IP multicast i/f
|
|
{$EXTERNALSYM IP_MULTICAST_TTL}
|
|
IP_MULTICAST_TTL = 10; // set/get IP multicast ttl
|
|
{$EXTERNALSYM IP_MULTICAST_LOOP}
|
|
IP_MULTICAST_LOOP = 11; // set/get IP multicast loopback
|
|
{$EXTERNALSYM IP_ADD_MEMBERSHIP}
|
|
IP_ADD_MEMBERSHIP = 12; // add an IP group membership
|
|
{$EXTERNALSYM IP_DROP_MEMBERSHIP}
|
|
IP_DROP_MEMBERSHIP = 13; // drop an IP group membership
|
|
{$ELSE}
|
|
{$EXTERNALSYM IP_TOS}
|
|
IP_TOS = 8; //* IP type of service and preced*/
|
|
{$EXTERNALSYM IP_TTL}
|
|
IP_TTL = 7; //* IP time to live */
|
|
{$EXTERNALSYM IP_MULTICAST_IF}
|
|
IP_MULTICAST_IF = 2; //* set/get IP multicast i/f */
|
|
{$EXTERNALSYM IP_MULTICAST_TTL}
|
|
IP_MULTICAST_TTL = 3; //* set/get IP multicast ttl */
|
|
{$EXTERNALSYM IP_MULTICAST_LOOP}
|
|
IP_MULTICAST_LOOP = 4; //*set/get IP multicast loopback */
|
|
{$EXTERNALSYM IP_ADD_MEMBERSHIP}
|
|
IP_ADD_MEMBERSHIP = 5; //* add an IP group membership */
|
|
{$EXTERNALSYM IP_DROP_MEMBERSHIP}
|
|
IP_DROP_MEMBERSHIP = 6; //* drop an IP group membership */
|
|
//JPM Notes. IP_HDRINCL is not supported in WinCE 4.0.
|
|
{$EXTERNALSYM IP_HDRINCL}
|
|
IP_HDRINCL = 9; //* header is included with data */
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM IP_DONTFRAGMENT}
|
|
IP_DONTFRAGMENT = 14; // don't fragment IP datagrams {Do not Localize}
|
|
{$EXTERNALSYM IP_ADD_SOURCE_MEMBERSHIP}
|
|
IP_ADD_SOURCE_MEMBERSHIP = 15; // join IP group/source
|
|
{$EXTERNALSYM IP_DROP_SOURCE_MEMBERSHIP}
|
|
IP_DROP_SOURCE_MEMBERSHIP = 16; // leave IP group/source
|
|
{$EXTERNALSYM IP_BLOCK_SOURCE}
|
|
IP_BLOCK_SOURCE = 17; // block IP group/source
|
|
{$EXTERNALSYM IP_UNBLOCK_SOURCE}
|
|
IP_UNBLOCK_SOURCE = 18; // unblock IP group/source
|
|
{$EXTERNALSYM IP_PKTINFO}
|
|
IP_PKTINFO = 19; // receive packet information for ipv4
|
|
{$EXTERNALSYM IP_RECEIVE_BROADCAST}
|
|
IP_RECEIVE_BROADCAST = 22; // Allow/block broadcast reception.
|
|
{$EXTERNALSYM IP_RECVIF}
|
|
IP_RECVIF = 24; // Receive arrival interface.
|
|
{$EXTERNALSYM IP_RECVDSTADDR}
|
|
IP_RECVDSTADDR = 25; // Receive destination address.
|
|
{$EXTERNALSYM IP_IFLIST}
|
|
IP_IFLIST = 28; // Enable/Disable an interface list.
|
|
{$EXTERNALSYM IP_ADD_IFLIST}
|
|
IP_ADD_IFLIST = 29; // Add an interface list entry.
|
|
{$EXTERNALSYM IP_DEL_IFLIST}
|
|
IP_DEL_IFLIST = 30; // Delete an interface list entry.
|
|
{$EXTERNALSYM IP_UNICAST_IF}
|
|
IP_UNICAST_IF = 31; // IP unicast interface.
|
|
{$EXTERNALSYM IP_RTHDR}
|
|
IP_RTHDR = 32; // Set/get IPv6 routing header.
|
|
{$EXTERNALSYM IP_GET_IFLIST}
|
|
IP_GET_IFLIST = 33; // Get an interface list.
|
|
{$EXTERNALSYM IP_RECVRTHDR}
|
|
IP_RECVRTHDR = 38; // Receive the routing header.
|
|
{$EXTERNALSYM IP_TCLASS}
|
|
IP_TCLASS = 39; // Packet traffic class.
|
|
{$EXTERNALSYM IP_RECVTCLASS}
|
|
IP_RECVTCLASS = 40; // Receive packet traffic class.
|
|
{$EXTERNALSYM IP_ORIGINAL_ARRIVAL_IF}
|
|
IP_ORIGINAL_ARRIVAL_IF = 47; // Original Arrival Interface Index. (Windows 7)
|
|
|
|
|
|
{$IFDEF WINCE}
|
|
{$EXTERNALSYM IP_DSCP_TRAFFIC_TYPE}
|
|
IP_DSCP_TRAFFIC_TYPE = 100; //* differential services */
|
|
{$EXTERNALSYM IP_RELOAD_DSCP_MAPPINGS}
|
|
IP_RELOAD_DSCP_MAPPINGS = 101; //* reload DSCP registry mappings */
|
|
{$ENDIF}
|
|
|
|
{$EXTERNALSYM IP_DEFAULT_MULTICAST_TTL}
|
|
IP_DEFAULT_MULTICAST_TTL = 1; // normally limit m'casts to 1 hop {Do not Localize}
|
|
{$EXTERNALSYM IP_DEFAULT_MULTICAST_LOOP}
|
|
IP_DEFAULT_MULTICAST_LOOP = 1; // normally hear sends if a member
|
|
{$EXTERNALSYM IP_MAX_MEMBERSHIPS}
|
|
IP_MAX_MEMBERSHIPS = 20; // per socket; must fit in one mbuf
|
|
|
|
|
|
// Option to use with [gs]etsockopt at the IPPROTO_IPV6 level
|
|
{$EXTERNALSYM IPV6_HDRINCL}
|
|
IPV6_HDRINCL = 2; // Header is included with data
|
|
{$EXTERNALSYM IPV6_UNICAST_HOPS}
|
|
IPV6_UNICAST_HOPS = 4; // Set/get IP unicast hop limit
|
|
{$EXTERNALSYM IPV6_MULTICAST_IF}
|
|
IPV6_MULTICAST_IF = 9; // Set/get IP multicast interface
|
|
{$EXTERNALSYM IPV6_MULTICAST_HOPS}
|
|
IPV6_MULTICAST_HOPS = 10; // Set/get IP multicast ttl
|
|
{$EXTERNALSYM IPV6_MULTICAST_LOOP}
|
|
IPV6_MULTICAST_LOOP = 11; // Set/get IP multicast loopback
|
|
{$EXTERNALSYM IPV6_ADD_MEMBERSHIP}
|
|
IPV6_ADD_MEMBERSHIP = 12; // Add an IP group membership
|
|
{$EXTERNALSYM IPV6_DROP_MEMBERSHIP}
|
|
IPV6_DROP_MEMBERSHIP = 13; // Drop an IP group membership
|
|
{$EXTERNALSYM IPV6_JOIN_GROUP}
|
|
IPV6_JOIN_GROUP = IPV6_ADD_MEMBERSHIP;
|
|
{$EXTERNALSYM IPV6_LEAVE_GROUP}
|
|
IPV6_LEAVE_GROUP = IPV6_DROP_MEMBERSHIP;
|
|
{$EXTERNALSYM IPV6_PKTINFO}
|
|
IPV6_PKTINFO = 19; // Receive packet information for ipv6
|
|
{$EXTERNALSYM IPV6_HOPLIMIT}
|
|
IPV6_HOPLIMIT = 21; // Receive packet hop limit
|
|
//Note that IPV6_PROTECTION_LEVEL is not supported for WinCE 4.2
|
|
{$EXTERNALSYM IPV6_PROTECTION_LEVEL}
|
|
IPV6_PROTECTION_LEVEL = 23; // Set/get IPv6 protection level
|
|
|
|
{$EXTERNALSYM IPV6_RECVIF}
|
|
IPV6_RECVIF = 24; // Receive arrival interface.
|
|
{$EXTERNALSYM IPV6_RECVDSTADDR}
|
|
IPV6_RECVDSTADDR = 25; // Receive destination address.
|
|
{$EXTERNALSYM IPV6_CHECKSUM}
|
|
IPV6_CHECKSUM = 26; // Offset to checksum for raw IP socket send.
|
|
{$EXTERNALSYM IPV6_V6ONLY}
|
|
IPV6_V6ONLY = 27; // Treat wildcard bind as AF_INET6-only.
|
|
{$EXTERNALSYM IPV6_IFLIST}
|
|
IPV6_IFLIST = 28; // Enable/Disable an interface list.
|
|
{$EXTERNALSYM IPV6_ADD_IFLIST}
|
|
IPV6_ADD_IFLIST = 29; // Add an interface list entry.
|
|
{$EXTERNALSYM IPV6_DEL_IFLIST}
|
|
IPV6_DEL_IFLIST = 30; // Delete an interface list entry.
|
|
{$EXTERNALSYM IPV6_UNICAST_IF}
|
|
IPV6_UNICAST_IF = 31; // IP unicast interface.
|
|
{$EXTERNALSYM IPV6_RTHDR}
|
|
IPV6_RTHDR = 32; // Set/get IPv6 routing header.
|
|
{$EXTERNALSYM IPV6_GET_IFLIST}
|
|
IPV6_GET_IFLIST = 33; // Get an interface list.
|
|
{$EXTERNALSYM IPV6_RECVRTHDR}
|
|
IPV6_RECVRTHDR = 38; // Receive the routing header.
|
|
{$EXTERNALSYM IPV6_TCLASS}
|
|
IPV6_TCLASS = 39; // Packet traffic class.
|
|
{$EXTERNALSYM IPV6_RECVTCLASS}
|
|
IPV6_RECVTCLASS = 40; // Receive packet traffic class.
|
|
{$EXTERNALSYM IPV6_ECN}
|
|
IPV6_ECN = 50; // Receive ECN codepoints in the IP header.
|
|
{$EXTERNALSYM IPV6_PKTINFO_EX}
|
|
IPV6_PKTINFO_EX = 51; // Receive extended packet information.
|
|
{$EXTERNALSYM IPV6_WFP_REDIRECT_RECORDS}
|
|
IPV6_WFP_REDIRECT_RECORDS = 60; // WFP's Connection Redirect Records
|
|
{$EXTERNALSYM IPV6_WFP_REDIRECT_CONTEXT}
|
|
IPV6_WFP_REDIRECT_CONTEXT = 70; // WFP's Connection Redirect Context
|
|
|
|
|
|
// Option to use with [gs]etsockopt at the IPPROTO_UDP level
|
|
{$EXTERNALSYM UDP_NOCHECKSUM}
|
|
UDP_NOCHECKSUM = 1;
|
|
{$EXTERNALSYM UDP_CHECKSUM_COVERAGE}
|
|
UDP_CHECKSUM_COVERAGE = 20; // Set/get UDP-Lite checksum coverage
|
|
|
|
// Option to use with [gs]etsockopt at the IPPROTO_TCP level
|
|
{$EXTERNALSYM TCP_EXPEDITED_1122}
|
|
TCP_EXPEDITED_1122 = $0002;
|
|
{$EXTERNALSYM TCP_KEEPALIVE}
|
|
TCP_KEEPALIVE = 3;
|
|
{$EXTERNALSYM TCP_MAXSEG}
|
|
TCP_MAXSEG = 4;
|
|
{$EXTERNALSYM TCP_MAXRT}
|
|
TCP_MAXRT = 5;
|
|
{$EXTERNALSYM TCP_STDURG}
|
|
TCP_STDURG = 6;
|
|
{$EXTERNALSYM TCP_NOURG}
|
|
TCP_NOURG = 7;
|
|
{$EXTERNALSYM TCP_ATMARK}
|
|
TCP_ATMARK = 8;
|
|
{$EXTERNALSYM TCP_NOSYNRETRIES}
|
|
TCP_NOSYNRETRIES = 9;
|
|
{$EXTERNALSYM TCP_TIMESTAMPS}
|
|
TCP_TIMESTAMPS = 10;
|
|
{$EXTERNALSYM TCP_OFFLOAD_PREFERENCE}
|
|
TCP_OFFLOAD_PREFERENCE = 11;
|
|
{$EXTERNALSYM TCP_CONGESTION_ALGORITHM}
|
|
TCP_CONGESTION_ALGORITHM = 12;
|
|
{$EXTERNALSYM TCP_DELAY_FIN_ACK}
|
|
TCP_DELAY_FIN_ACK = 13;
|
|
{$EXTERNALSYM TCP_MAXRTMS}
|
|
TCP_MAXRTMS = 14;
|
|
|
|
// IPv6 definitions
|
|
type
|
|
{$EXTERNALSYM IN6_ADDR}
|
|
IN6_ADDR = record
|
|
case Integer of
|
|
0: (s6_bytes: array[0..15] of u_char);
|
|
1: (s6_words: array[0..7] of u_short);
|
|
end;
|
|
{$NODEFINE TIn6Addr}
|
|
TIn6Addr = IN6_ADDR;
|
|
{$NODEFINE PIn6Addr}
|
|
PIn6Addr = ^TIn6Addr;
|
|
{$EXTERNALSYM PIN6_ADDR}
|
|
PIN6_ADDR = PIn6Addr;
|
|
{$EXTERNALSYM LPIN6_ADDR}
|
|
LPIN6_ADDR = PIN6_ADDR;
|
|
|
|
{$IFNDEF WINCE}
|
|
{$IFNDEF NO_REDECLARE}
|
|
// Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP
|
|
{$EXTERNALSYM ipv6_mreq}
|
|
ipv6_mreq = record
|
|
ipv6mr_multiaddr: TIn6Addr; // IPv6 multicast address
|
|
ipv6mr_interface: u_int; // Interface index
|
|
end;
|
|
{$NODEFINE TIPv6_MReq}
|
|
TIPv6_MReq = IPV6_MREQ;
|
|
{$NODEFINE PIPv6_MReq}
|
|
PIPv6_MReq = ^TIPv6_MReq;
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
{$EXTERNALSYM SCOPE_LEVEL}
|
|
// The Pascal compiler in Delphi/BCB prior to v6 does not
|
|
// support specifying values for individual enum items
|
|
SCOPE_LEVEL = (
|
|
{$IFDEF HAS_ENUM_ELEMENT_VALUES}
|
|
ScopeLevelInterface = 1,
|
|
ScopeLevelLink = 2,
|
|
ScopeLevelSubnet = 3,
|
|
ScopeLevelAdmin = 4,
|
|
ScopeLevelSite = 5,
|
|
ScopeLevelOrganization = 8,
|
|
ScopeLevelGlobal = 14,
|
|
ScopeLevelCount = 16
|
|
{$ELSE}
|
|
slUnused0, // do not use
|
|
ScopeLevelInterface,
|
|
ScopeLevelLink,
|
|
ScopeLevelSubnet,
|
|
ScopeLevelAdmin,
|
|
ScopeLevelSite,
|
|
slUnused6, // do not use
|
|
slUnused7, // do not use
|
|
ScopeLevelOrganization,
|
|
slUnused9, // do not use
|
|
slUnused10, // do not use
|
|
slUnused11, // do not use
|
|
slUnused12, // do not use
|
|
slUnused13, // do not use
|
|
ScopeLevelGlobal,
|
|
slUnused15, // do not use
|
|
ScopeLevelCount
|
|
{$ENDIF}
|
|
);
|
|
// Old IPv6 socket address structure (retained for sockaddr_gen definition below)
|
|
{$EXTERNALSYM sockaddr_in6_old}
|
|
sockaddr_in6_old = record
|
|
sin6_family : short; // AF_INET6
|
|
sin6_port : u_short; // Transport level port number
|
|
sin6_flowinfo : u_long; // IPv6 flow information
|
|
sin6_addr : TIn6Addr; // IPv6 address
|
|
end;
|
|
|
|
// IPv6 socket address structure, RFC 2553
|
|
{$IFDEF WINCE}
|
|
{$EXTERNALSYM SOCKADDR_IN6}
|
|
SOCKADDR_IN6 = record
|
|
sin6_family : short; // AF_INET6
|
|
sin6_port : u_short; // Transport level port number
|
|
sin6_flowinfo : u_long; // IPv6 flow information
|
|
sin6_addr : TIn6Addr; // IPv6 address
|
|
sin6_scope_id : u_long; // set of interfaces for a scope
|
|
end;
|
|
{$ELSE}
|
|
{$EXTERNALSYM ADDRESS_FAMILY}
|
|
ADDRESS_FAMILY = USHORT;
|
|
//
|
|
// IPv6 socket address structure, RFC 3493.
|
|
//
|
|
|
|
//
|
|
// NB: The LH version of sockaddr_in6 has the struct tag sockaddr_in6 rather
|
|
// than sockaddr_in6_lh. This is to make sure that standard sockets apps
|
|
// that conform to RFC 2553 (Basic Socket Interface Extensions for IPv6).
|
|
//
|
|
{$EXTERNALSYM SCOPE_ID}
|
|
SCOPE_ID = record
|
|
// union {
|
|
// struct {
|
|
// ULONG Zone : 28;
|
|
// ULONG Level : 4;
|
|
// };
|
|
// ULONG Value;
|
|
// };
|
|
Value : ULONG;
|
|
end;
|
|
{$EXTERNALSYM PSCOPE_ID}
|
|
PSCOPE_ID = ^SCOPE_ID;
|
|
|
|
{$EXTERNALSYM SCOPEID_UNSPECIFIED_INIT}
|
|
function SCOPEID_UNSPECIFIED_INIT: SCOPE_ID;
|
|
|
|
type
|
|
{$EXTERNALSYM sockaddr_in6_union}
|
|
sockaddr_in6_union = record
|
|
case Integer of
|
|
0 : (sin6_scope_id : ULONG); // Set of interfaces for a scope.
|
|
1 : (sin6_scope_struct : SCOPE_ID);
|
|
end;
|
|
{$EXTERNALSYM SOCKADDR_IN6_LH}
|
|
SOCKADDR_IN6_LH = record
|
|
sin6_family : ADDRESS_FAMILY; // AF_INET6.
|
|
sin6_port : USHORT; // Transport level port number.
|
|
sin6_flowinfo : ULONG; // IPv6 flow information.
|
|
sin6_addr : IN6_ADDR; // IPv6 address.
|
|
a : sockaddr_in6_union;
|
|
end;
|
|
{$EXTERNALSYM SOCKADDR_IN6_W2KSP1}
|
|
SOCKADDR_IN6_W2KSP1 = record
|
|
sin6_family : short; //* AF_INET6 */
|
|
sin6_port : USHORT; //* Transport level port number */
|
|
sin6_flowinfo : ULONG; //* IPv6 flow information */
|
|
sin6_addr : in6_addr; //* IPv6 address */
|
|
sin6_scope_id : ULONG; //* set of interfaces for a scope */
|
|
end;
|
|
{$EXTERNALSYM PSOCKADDR_IN6_LH}
|
|
PSOCKADDR_IN6_LH = ^SOCKADDR_IN6_LH;
|
|
{$EXTERNALSYM SOCKADDR_IN6}
|
|
SOCKADDR_IN6 = SOCKADDR_IN6_LH;
|
|
{$ENDIF}
|
|
|
|
{$NODEFINE TSockAddrIn6}
|
|
TSockAddrIn6 = SOCKADDR_IN6;
|
|
{$NODEFINE PSockAddrIn6}
|
|
PSockAddrIn6 = ^TSockAddrIn6;
|
|
{$EXTERNALSYM PSOCKADDR_IN6}
|
|
PSOCKADDR_IN6 = PSockAddrIn6;
|
|
{$EXTERNALSYM LPSOCKADDR_IN6}
|
|
LPSOCKADDR_IN6 = PSOCKADDR_IN6;
|
|
|
|
{$EXTERNALSYM sockaddr_gen}
|
|
sockaddr_gen = record
|
|
case Integer of
|
|
1 : ( Address : TSockAddr; );
|
|
2 : ( AddressIn : TSockAddrIn; );
|
|
3 : ( AddressIn6 : sockaddr_in6_old; );
|
|
end;
|
|
{$NODEFINE TSockAddrGen}
|
|
TSockAddrGen = sockaddr_gen;
|
|
|
|
// Structure to keep interface specific information
|
|
{$EXTERNALSYM INTERFACE_INFO}
|
|
INTERFACE_INFO = record
|
|
iiFlags : u_long; // Interface flags
|
|
iiAddress : TSockAddrGen; // Interface address
|
|
iiBroadcastAddress : TSockAddrGen; // Broadcast address
|
|
iiNetmask : TSockAddrGen; // Network mask
|
|
end;
|
|
{$NODEFINE TInterface_Info}
|
|
TInterface_Info = INTERFACE_INFO;
|
|
{$EXTERNALSYM PINTERFACE_INFO}
|
|
PINTERFACE_INFO = ^TInterface_Info;
|
|
{$EXTERNALSYM LPINTERFACE_INFO}
|
|
LPINTERFACE_INFO = PINTERFACE_INFO;
|
|
|
|
// New structure that does not have dependency on the address size
|
|
{$EXTERNALSYM INTERFACE_INFO_EX}
|
|
INTERFACE_INFO_EX = record
|
|
iiFlags : u_long; // Interface flags
|
|
iiAddress : TSocket_Address; // Interface address
|
|
iiBroadcastAddress : TSocket_Address; // Broadcast address
|
|
iiNetmask : TSocket_Address; // Network mask
|
|
end;
|
|
{$NODEFINE TInterface_Info_Ex}
|
|
TInterface_Info_Ex = INTERFACE_INFO_EX;
|
|
{$EXTERNALSYM PINTERFACE_INFO_EX}
|
|
PINTERFACE_INFO_EX = ^TInterface_Info_Ex;
|
|
{$EXTERNALSYM LPINTERFACE_INFO_EX}
|
|
LPINTERFACE_INFO_EX = PINTERFACE_INFO_EX;
|
|
|
|
// Macro that works for both IPv4 and IPv6
|
|
{$EXTERNALSYM SS_PORT}
|
|
function SS_PORT(ssp: PSockAddrIn): u_short;
|
|
|
|
{$EXTERNALSYM IN6ADDR_ANY_INIT}
|
|
function IN6ADDR_ANY_INIT: TIn6Addr;
|
|
{$EXTERNALSYM IN6ADDR_LOOPBACK_INIT}
|
|
function IN6ADDR_LOOPBACK_INIT: TIn6Addr;
|
|
{$EXTERNALSYM IN6ADDR_ALLNODESONNODE_INIT}
|
|
function IN6ADDR_ALLNODESONNODE_INIT : TIn6Addr;
|
|
{$EXTERNALSYM IN6ADDR_ALLNODESONLINK_INIT}
|
|
function IN6ADDR_ALLNODESONLINK_INIT : TIn6Addr;
|
|
{$EXTERNALSYM IN6ADDR_ALLROUTERSONLINK_INIT}
|
|
function IN6ADDR_ALLROUTERSONLINK_INIT : TIn6Addr;
|
|
{$EXTERNALSYM IN6ADDR_ALLMLDV2ROUTERSONLINK_INIT}
|
|
function IN6ADDR_ALLMLDV2ROUTERSONLINK_INIT : TIn6Addr;
|
|
{$EXTERNALSYM IN6ADDR_TEREDOINITIALLINKLOCALADDRESS_INIT}
|
|
function IN6ADDR_TEREDOINITIALLINKLOCALADDRESS_INIT : TIn6Addr;
|
|
{$EXTERNALSYM IN6ADDR_TEREDOOLDLINKLOCALADDRESSXP_INIT}
|
|
function IN6ADDR_TEREDOOLDLINKLOCALADDRESSXP_INIT : TIn6Addr;
|
|
{$EXTERNALSYM IN6ADDR_TEREDOOLDLINKLOCALADDRESSVISTA_INIT}
|
|
function IN6ADDR_TEREDOOLDLINKLOCALADDRESSVISTA_INIT : TIn6Addr;
|
|
|
|
{$EXTERNALSYM IN6ADDR_SETANY}
|
|
procedure IN6ADDR_SETANY(sa: PSockAddrIn6);
|
|
{$EXTERNALSYM IN6ADDR_SETLOOPBACK}
|
|
procedure IN6ADDR_SETLOOPBACK(sa: PSockAddrIn6);
|
|
{$EXTERNALSYM IN6ADDR_ISANY}
|
|
function IN6ADDR_ISANY(sa: PSockAddrIn6): Boolean;
|
|
{$EXTERNALSYM IN6ADDR_ISLOOPBACK}
|
|
function IN6ADDR_ISLOOPBACK(sa: PSockAddrIn6): Boolean;
|
|
|
|
{$EXTERNALSYM IN6_IS_ADDR_SUBNET_ROUTER_ANYCAST}
|
|
function IN6_IS_ADDR_SUBNET_ROUTER_ANYCAST(const a : PIn6Addr) : Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_SUBNET_RESERVED_ANYCAST}
|
|
function IN6_IS_ADDR_SUBNET_RESERVED_ANYCAST(const a: PIn6Addr) : Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_ANYCAST}
|
|
function IN6_IS_ADDR_ANYCAST(const a: PIn6Addr) : Boolean;
|
|
{$EXTERNALSYM IN6_ADDR_EQUAL}
|
|
function IN6_ADDR_EQUAL(const a: PIn6Addr; const b: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_UNSPECIFIED}
|
|
function IN6_IS_ADDR_UNSPECIFIED(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_LOOPBACK}
|
|
function IN6_IS_ADDR_LOOPBACK(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_MULTICAST}
|
|
function IN6_IS_ADDR_MULTICAST(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_EUI64}
|
|
function IN6_IS_ADDR_EUI64(const a : PIn6Addr) : Boolean;
|
|
|
|
{$EXTERNALSYM IN6_IS_ADDR_LINKLOCAL}
|
|
function IN6_IS_ADDR_LINKLOCAL(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_SITELOCAL}
|
|
function IN6_IS_ADDR_SITELOCAL(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_V4MAPPED}
|
|
function IN6_IS_ADDR_V4MAPPED(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_V4COMPAT}
|
|
function IN6_IS_ADDR_V4COMPAT(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_V4TRANSLATED}
|
|
function IN6_IS_ADDR_V4TRANSLATED(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_MC_NODELOCAL}
|
|
function IN6_IS_ADDR_MC_NODELOCAL(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_MC_LINKLOCAL}
|
|
function IN6_IS_ADDR_MC_LINKLOCAL(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_MC_SITELOCAL}
|
|
function IN6_IS_ADDR_MC_SITELOCAL(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_MC_ORGLOCAL}
|
|
function IN6_IS_ADDR_MC_ORGLOCAL(const a: PIn6Addr): Boolean;
|
|
{$EXTERNALSYM IN6_IS_ADDR_MC_GLOBAL}
|
|
function IN6_IS_ADDR_MC_GLOBAL(const a: PIn6Addr): Boolean;
|
|
|
|
{$EXTERNALSYM IN6_SET_ADDR_UNSPECIFIED}
|
|
procedure IN6_SET_ADDR_UNSPECIFIED(a : PIN6_ADDR);
|
|
|
|
// Possible flags for the iiFlags - bitmask
|
|
const
|
|
{$EXTERNALSYM IFF_UP}
|
|
IFF_UP = $00000001; // Interface is up
|
|
{$EXTERNALSYM IFF_BROADCAST}
|
|
IFF_BROADCAST = $00000002; // Broadcast is supported
|
|
{$EXTERNALSYM IFF_LOOPBACK}
|
|
IFF_LOOPBACK = $00000004; // this is loopback interface
|
|
{$EXTERNALSYM IFF_POINTTOPOINT}
|
|
IFF_POINTTOPOINT = $00000008; // this is point-to-point interface
|
|
{$EXTERNALSYM IFF_MULTICAST}
|
|
IFF_MULTICAST = $00000010; // multicast is supported
|
|
|
|
type
|
|
{$EXTERNALSYM MULTICAST_MODE_TYPE}
|
|
{$EXTERNALSYM MCAST_INCLUDE}
|
|
{$EXTERNALSYM MCAST_EXCLUDE}
|
|
MULTICAST_MODE_TYPE = (MCAST_INCLUDE, MCAST_EXCLUDE);
|
|
{$EXTERNALSYM GROUP_FILTER}
|
|
GROUP_FILTER = record
|
|
gf_interface : PULONG; // Interface index.
|
|
gf_group : SOCKADDR_STORAGE; // Multicast address.
|
|
gf_fmode : MULTICAST_MODE_TYPE; // Filter mode.
|
|
gf_numsrc : ULONG; // Number of sources.
|
|
gf_slist : SOCKADDR_STORAGE; //gf_slist[1] : SOCKADDR_STORAGE; // Source address.
|
|
end;
|
|
{$EXTERNALSYM PGROUP_FILTER}
|
|
PGROUP_FILTER = ^GROUP_FILTER;
|
|
|
|
{$EXTERNALSYM GROUP_REQ}
|
|
GROUP_REQ = record
|
|
gr_interface : ULONG; // Interface index.
|
|
gr_group : SOCKADDR_STORAGE; // Multicast address.
|
|
end;
|
|
{$EXTERNALSYM PGROUP_REQ}
|
|
PGROUP_REQ = ^GROUP_REQ;
|
|
|
|
{$EXTERNALSYM GROUP_SOURCE_REQ}
|
|
GROUP_SOURCE_REQ = record
|
|
gsr_interface : ULONG; // Interface index.
|
|
gsr_group : SOCKADDR_STORAGE; // Group address.
|
|
gsr_source : SOCKADDR_STORAGE; // Source address.
|
|
end;
|
|
{$EXTERNALSYM PGROUP_SOURCE_REQ}
|
|
PGROUP_SOURCE_REQ = ^GROUP_SOURCE_REQ;
|
|
|
|
{$EXTERNALSYM GROUP_FILTER_SIZE}
|
|
function GROUP_FILTER_SIZE(const numsrc : DWord) : PtrUInt;
|
|
|
|
type
|
|
{$EXTERNALSYM WSAQUERYSET2}
|
|
WSAQUERYSET2 = record
|
|
dwSize : DWORD;
|
|
lpszServiceInstanceName : LPTSTR;
|
|
lpVersion : LPWSAVERSION;
|
|
lpszComment : LPTSTR;
|
|
dwNameSpace : DWORD;
|
|
lpNSProviderId : LPGUID;
|
|
lpszContext : LPTSTR;
|
|
dwNumberOfProtocols : DWORD;
|
|
lpafpProtocols : LPAFPROTOCOLS;
|
|
lpszQueryString : LPTSTR;
|
|
dwNumberOfCsAddrs : DWORD;
|
|
lpcsaBuffer : LPCSADDR_INFO;
|
|
dwOutputFlags : DWORD;
|
|
lpBlob : LPBLOB;
|
|
end;
|
|
{$EXTERNALSYM PWSAQUERYSET2}
|
|
PWSAQUERYSET2 = ^WSAQUERYSET2;
|
|
{$EXTERNALSYM LPWSAQUERYSET2}
|
|
LPWSAQUERYSET2 = PWSAQUERYSET2;
|
|
|
|
{$EXTERNALSYM NAPI_PROVIDER_TYPE}
|
|
{$EXTERNALSYM ProviderType_Application}
|
|
{$EXTERNALSYM ProviderType_Service}
|
|
{$IFNDEF HAS_ENUM_ELEMENT_VALUES}
|
|
{$NODEFINE nptUnused}
|
|
{$ENDIF}
|
|
// The Pascal compiler in Delphi/BCB prior to v6 does not
|
|
// support specifying values for individual enum items
|
|
NAPI_PROVIDER_TYPE = (
|
|
{$IFDEF HAS_ENUM_ELEMENT_VALUES}
|
|
ProviderType_Application = 1,
|
|
{$ELSE}
|
|
nptUnused, // Do not use
|
|
ProviderType_Application,
|
|
{$ENDIF}
|
|
ProviderType_Service);
|
|
{$EXTERNALSYM NAPI_DOMAIN_DESCRIPTION_BLOB}
|
|
NAPI_DOMAIN_DESCRIPTION_BLOB = record
|
|
AuthLevel : DWORD;
|
|
cchDomainName : DWORD;
|
|
OffsetNextDomainDescription : DWORD;
|
|
OffsetThisDomainName : DWORD;
|
|
end;
|
|
{$EXTERNALSYM PNAPI_DOMAIN_DESCRIPTION_BLOB}
|
|
PNAPI_DOMAIN_DESCRIPTION_BLOB = ^NAPI_DOMAIN_DESCRIPTION_BLOB;
|
|
|
|
{$EXTERNALSYM NAPI_PROVIDER_LEVEL}
|
|
{$EXTERNALSYM PROVIDERLEVEL_NONE}
|
|
{$EXTERNALSYM PROVIDERLEVEL_SECONDARY}
|
|
{$EXTERNALSYM PROVIDERLEVEL_PRIMARY}
|
|
NAPI_PROVIDER_LEVEL = (
|
|
PROVIDERLEVEL_NONE,
|
|
PROVIDERLEVEL_SECONDARY,
|
|
PROVIDERLEVEL_PRIMARY
|
|
);
|
|
|
|
{$EXTERNALSYM NAPI_PROVIDER_INSTALLATION_BLOB}
|
|
NAPI_PROVIDER_INSTALLATION_BLOB = record
|
|
dwVersion : DWORD;
|
|
dwProviderType : DWORD;
|
|
fSupportsWildCard : DWORD;
|
|
cDomains : DWORD;
|
|
OffsetFirstDomain : DWORD;
|
|
end;
|
|
{$EXTERNALSYM PNAPI_PROVIDER_INSTALLATION_BLOB}
|
|
PNAPI_PROVIDER_INSTALLATION_BLOB = ^NAPI_PROVIDER_INSTALLATION_BLOB;
|
|
|
|
{$IFNDEF NOREDECLARE}
|
|
{$EXTERNALSYM SERVICE_ADDRESS}
|
|
SERVICE_ADDRESS = record
|
|
dwAddressType : DWORD;
|
|
dwAddressFlags : DWORD;
|
|
dwAddressLength : DWORD;
|
|
dwPrincipalLength : DWORD;
|
|
lpAddress : PByte;
|
|
lpPrincipal : PByte;
|
|
end;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM PSERVICE_ADDRESS}
|
|
PSERVICE_ADDRESS = ^SERVICE_ADDRESS;
|
|
{$EXTERNALSYM LPSERVICE_ADDRESS}
|
|
LPSERVICE_ADDRESS = PSERVICE_ADDRESS;
|
|
|
|
{$IFNDEF NOREDECLARE}
|
|
{$EXTERNALSYM SERVICE_ADDRESSES}
|
|
SERVICE_ADDRESSES = record
|
|
dwAddressCount : DWORD;
|
|
//#ifdef MIDL_PASS
|
|
// [size_is(dwAddressCount)] SERVICE_ADDRESS Addressses[*];
|
|
//#else // MIDL_PASS
|
|
// SERVICE_ADDRESS Addresses[1] ;
|
|
//#endif // MIDL_PASS
|
|
Addresses : SERVICE_ADDRESS;
|
|
end;
|
|
{$EXTERNALSYM PSERVICE_ADDRESSES}
|
|
PSERVICE_ADDRESSES = ^SERVICE_ADDRESSES;
|
|
{$EXTERNALSYM LPSERVICE_ADDRESSES}
|
|
LPSERVICE_ADDRESSES = PSERVICE_ADDRESSES;
|
|
{$ENDIF}
|
|
|
|
{$IFNDEF VCL_2007_OR_ABOVE}
|
|
const
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_GENERIC}
|
|
RESOURCEDISPLAYTYPE_GENERIC = $00000000;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_DOMAIN}
|
|
RESOURCEDISPLAYTYPE_DOMAIN = $00000001;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_SERVER}
|
|
RESOURCEDISPLAYTYPE_SERVER = $00000002;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_SHARE}
|
|
RESOURCEDISPLAYTYPE_SHARE = $00000003;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_FILE}
|
|
RESOURCEDISPLAYTYPE_FILE = $00000004;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_GROUP}
|
|
RESOURCEDISPLAYTYPE_GROUP = $00000005;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_NETWORK}
|
|
RESOURCEDISPLAYTYPE_NETWORK = $00000006;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_ROOT}
|
|
RESOURCEDISPLAYTYPE_ROOT = $00000007;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_SHAREADMIN}
|
|
RESOURCEDISPLAYTYPE_SHAREADMIN = $00000008;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_DIRECTORY}
|
|
RESOURCEDISPLAYTYPE_DIRECTORY = $00000009;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_TREE}
|
|
RESOURCEDISPLAYTYPE_TREE = $0000000A;
|
|
{$EXTERNALSYM RESOURCEDISPLAYTYPE_NDSCONTAINER}
|
|
RESOURCEDISPLAYTYPE_NDSCONTAINER = $0000000B;
|
|
{$ENDIF}
|
|
|
|
type
|
|
{$EXTERNALSYM SERVICE_TYPE_VALUE_ABSA}
|
|
SERVICE_TYPE_VALUE_ABSA = record
|
|
dwNameSpace : DWORD;
|
|
dwValueType : DWORD;
|
|
dwValueSize : DWORD;
|
|
lpValueName : LPSTR;
|
|
lpValue : Pointer;
|
|
end;
|
|
{$EXTERNALSYM PSERVICE_TYPE_VALUE_ABSA}
|
|
PSERVICE_TYPE_VALUE_ABSA = ^SERVICE_TYPE_VALUE_ABSA;
|
|
{$EXTERNALSYM LPSERVICE_TYPE_VALUE_ABSA}
|
|
LPSERVICE_TYPE_VALUE_ABSA = PSERVICE_TYPE_VALUE_ABSA;
|
|
|
|
{$EXTERNALSYM SERVICE_INFOA}
|
|
SERVICE_INFOA = record
|
|
lpServiceType : LPGUID;
|
|
lpServiceName : PAnsiChar;
|
|
lpComment : PAnsiChar;
|
|
lpLocale : PAnsiChar;
|
|
dwDisplayHint : DWORD;
|
|
dwVersion : DWORD;
|
|
dwTime : DWORD;
|
|
lpMachineName : PAnsiChar;
|
|
lpServiceAddress : LPSERVICE_ADDRESSES;
|
|
ServiceSpecificInfo : BLOB;
|
|
end;
|
|
{$EXTERNALSYM SERVICE_INFOW}
|
|
SERVICE_INFOW = record
|
|
lpServiceType : LPGUID;
|
|
lpServiceName : PWideChar;
|
|
lpComment : PWideChar;
|
|
lpLocale : PWideChar;
|
|
dwDisplayHint : DWORD;
|
|
dwVersion : DWORD;
|
|
dwTime : DWORD;
|
|
lpMachineName : PWideChar;
|
|
lpServiceAddress : LPSERVICE_ADDRESSES;
|
|
ServiceSpecificInfo : BLOB;
|
|
end;
|
|
|
|
{$EXTERNALSYM SOCKET_USAGE_TYPE}
|
|
{$EXTERNALSYM SYSTEM_CRITICAL_SOCKET}
|
|
{$IFNDEF HAS_ENUM_ELEMENT_VALUES}
|
|
{$NODEFINE sutUnused}
|
|
{$ENDIF}
|
|
// The Pascal compiler in Delphi/BCB prior to v6 does not
|
|
// support specifying values for individual enum items
|
|
SOCKET_USAGE_TYPE = (
|
|
{$IFDEF HAS_ENUM_ELEMENT_VALUES}
|
|
SYSTEM_CRITICAL_SOCKET = 1
|
|
{$ELSE}
|
|
sutUnused, // do not use
|
|
SYSTEM_CRITICAL_SOCKET
|
|
{$ENDIF}
|
|
);
|
|
{$EXTERNALSYM SOCKET_SECURITY_PROTOCOL}
|
|
{$EXTERNALSYM SOCKET_SECURITY_PROTOCOL_DEFAULT}
|
|
{$EXTERNALSYM SOCKET_SECURITY_PROTOCOL_IPSEC}
|
|
{$EXTERNALSYM SOCKET_SECURITY_PROTOCOL_IPSEC2}
|
|
SOCKET_SECURITY_PROTOCOL = (
|
|
SOCKET_SECURITY_PROTOCOL_DEFAULT,
|
|
SOCKET_SECURITY_PROTOCOL_IPSEC,
|
|
SOCKET_SECURITY_PROTOCOL_IPSEC2);
|
|
{$IFNDEF NO_REDECLARE}
|
|
{$EXTERNALSYM SERVICE_INFO}
|
|
{$IFDEF UNICODE}
|
|
SERVICE_INFO = SERVICE_INFOW;
|
|
{$ELSE}
|
|
SERVICE_INFO = SERVICE_INFOA;
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
{$EXTERNALSYM NS_SERVICE_INFOA}
|
|
NS_SERVICE_INFOA = record
|
|
dwNameSpace : DWORD;
|
|
ServiceInfo : SERVICE_INFOA;
|
|
end;
|
|
{$EXTERNALSYM PNS_SERVICE_INFOA}
|
|
PNS_SERVICE_INFOA = ^NS_SERVICE_INFOA;
|
|
{$EXTERNALSYM LPNS_SERVICE_INFOA}
|
|
LPNS_SERVICE_INFOA = NS_SERVICE_INFOA;
|
|
{$EXTERNALSYM NS_SERVICE_INFOW}
|
|
NS_SERVICE_INFOW = record
|
|
dwNameSpace : DWORD;
|
|
ServiceInfo : SERVICE_INFOW;
|
|
end;
|
|
{$EXTERNALSYM PNS_SERVICE_INFOW}
|
|
PNS_SERVICE_INFOW = ^NS_SERVICE_INFOW;
|
|
{$EXTERNALSYM LPNS_SERVICE_INFOW}
|
|
LPNS_SERVICE_INFOW = NS_SERVICE_INFOW;
|
|
{$IFNDEF NO_REDECLARE}
|
|
{$EXTERNALSYM NS_SERVICE_INFO}
|
|
{$EXTERNALSYM PNS_SERVICE_INFO}
|
|
{$EXTERNALSYM LPNS_SERVICE_INFO}
|
|
{$IFDEF UNICODE}
|
|
NS_SERVICE_INFO = NS_SERVICE_INFOW;
|
|
PNS_SERVICE_INFO = PNS_SERVICE_INFOW;
|
|
LPNS_SERVICE_INFO = LPNS_SERVICE_INFOW;
|
|
{$ELSE}
|
|
NS_SERVICE_INFO = NS_SERVICE_INFOA;
|
|
PNS_SERVICE_INFO = PNS_SERVICE_INFOA;
|
|
LPNS_SERVICE_INFO = LPNS_SERVICE_INFOA;
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
{$IFNDEF WINCE}
|
|
type
|
|
// structure for IP_PKTINFO option
|
|
{$EXTERNALSYM IN_PKTINFO}
|
|
IN_PKTINFO = record
|
|
ipi_addr : TInAddr; // destination IPv4 address
|
|
ipi_ifindex : UINT; // received interface index
|
|
end;
|
|
{$NODEFINE TInPktInfo}
|
|
TInPktInfo = IN_PKTINFO;
|
|
{$NODEFINE PInPktInfo}
|
|
PInPktInfo = ^IN_PKTINFO;
|
|
|
|
// structure for IPV6_PKTINFO option
|
|
{$EXTERNALSYM IN6_PKTINFO}
|
|
IN6_PKTINFO = record
|
|
ipi6_addr : TIn6Addr; // destination IPv6 address
|
|
ipi6_ifindex : UINT; // received interface index
|
|
end;
|
|
{$NODEFINE TIn6PktInfo}
|
|
TIn6PktInfo = IN6_PKTINFO;
|
|
{$NODEFINE PIn6PktInfo}
|
|
PIn6PktInfo = ^TIn6PktInfo;
|
|
{$ENDIF}
|
|
|
|
// Error codes from getaddrinfo()
|
|
const
|
|
{$EXTERNALSYM EAI_AGAIN}
|
|
EAI_AGAIN = WSATRY_AGAIN;
|
|
{$EXTERNALSYM EAI_BADFLAGS}
|
|
EAI_BADFLAGS = WSAEINVAL;
|
|
{$EXTERNALSYM EAI_FAIL}
|
|
EAI_FAIL = WSANO_RECOVERY;
|
|
{$EXTERNALSYM EAI_FAMILY}
|
|
EAI_FAMILY = WSAEAFNOSUPPORT;
|
|
{$EXTERNALSYM EAI_MEMORY}
|
|
EAI_MEMORY = WSA_NOT_ENOUGH_MEMORY;
|
|
// {$EXTERNALSYM EAI_NODATA}
|
|
// EAI_NODATA = WSANO_DATA;
|
|
{$EXTERNALSYM EAI_NONAME}
|
|
EAI_NONAME = WSAHOST_NOT_FOUND;
|
|
{$EXTERNALSYM EAI_SERVICE}
|
|
EAI_SERVICE = WSATYPE_NOT_FOUND;
|
|
{$EXTERNALSYM EAI_SOCKTYPE}
|
|
EAI_SOCKTYPE = WSAESOCKTNOSUPPORT;
|
|
|
|
// DCR_FIX: EAI_NODATA remove or fix
|
|
//
|
|
// EAI_NODATA was removed from rfc2553bis
|
|
// need to find out from the authors why and
|
|
// determine the error for "no records of this type"
|
|
// temporarily, we'll keep #define to avoid changing
|
|
// code that could change back; use NONAME
|
|
{$EXTERNALSYM EAI_NODATA}
|
|
EAI_NODATA = EAI_NONAME;
|
|
|
|
// Structure used in getaddrinfo() call
|
|
type
|
|
{$NODEFINE PAddrInfo}
|
|
PAddrInfo = ^ADDRINFO;
|
|
{$NODEFINE PPaddrinfo}
|
|
PPaddrinfo = ^PAddrInfo;
|
|
{$NODEFINE PPaddrinfoW}
|
|
PPaddrinfoW = ^PAddrInfoW;
|
|
{$EXTERNALSYM ADDRINFO}
|
|
ADDRINFO = record
|
|
ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
|
|
ai_family : Integer; // PF_xxx
|
|
ai_socktype : Integer; // SOCK_xxx
|
|
ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
|
|
ai_addrlen : size_t; // Length of ai_addr
|
|
ai_canonname : PAnsiChar; // Canonical name for nodename
|
|
ai_addr : PSOCKADDR; // Binary address
|
|
ai_next : PAddrInfo; // Next structure in linked list
|
|
end;
|
|
{$NODEFINE TAddrInfo}
|
|
TAddrInfo = ADDRINFO;
|
|
{$EXTERNALSYM LPADDRINFO}
|
|
LPADDRINFO = PAddrInfo;
|
|
|
|
{$NODEFINE PAddrInfoW}
|
|
PAddrInfoW = ^ADDRINFOW;
|
|
{$EXTERNALSYM ADDRINFOW}
|
|
ADDRINFOW = record
|
|
ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
|
|
ai_family : Integer; // PF_xxx
|
|
ai_socktype : Integer; // SOCK_xxx
|
|
ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
|
|
ai_addrlen : size_t; // Length of ai_addr
|
|
ai_canonname : PWideChar; // Canonical name for nodename
|
|
ai_addr : PSOCKADDR; // Binary address
|
|
ai_next : PAddrInfoW; // Next structure in linked list
|
|
end;
|
|
{$NODEFINE TAddrInfoW}
|
|
TAddrInfoW = ADDRINFOW;
|
|
{$EXTERNALSYM LPADDRINFOW}
|
|
LPADDRINFOW = PAddrInfoW;
|
|
|
|
// Flags used in "hints" argument to getaddrinfo()
|
|
const
|
|
{$EXTERNALSYM AI_PASSIVE}
|
|
AI_PASSIVE = $00000001; // Socket address will be used in bind() call
|
|
{$EXTERNALSYM AI_CANONNAME}
|
|
AI_CANONNAME = $00000002; // Return canonical name in first ai_canonname
|
|
{$EXTERNALSYM AI_NUMERICHOST}
|
|
AI_NUMERICHOST = $00000004; // Nodename must be a numeric address string
|
|
{$EXTERNALSYM AI_NUMERICSERV}
|
|
AI_NUMERICSERV = $00000008; // Servicename must be a numeric port number
|
|
{$EXTERNALSYM AI_ALL}
|
|
AI_ALL = $00000100; // Query both IP6 and IP4 with AI_V4MAPPED
|
|
{$EXTERNALSYM AI_ADDRCONFIG}
|
|
AI_ADDRCONFIG = $00000400; // Resolution only if global address configured
|
|
{$EXTERNALSYM AI_V4MAPPED}
|
|
AI_V4MAPPED = $00000800; // On v6 failure, query v4 and convert to V4MAPPED format (Vista or later)
|
|
{$EXTERNALSYM AI_NON_AUTHORITATIVE}
|
|
AI_NON_AUTHORITATIVE = $00004000; // LUP_NON_AUTHORITATIVE (Vista or later)
|
|
{$EXTERNALSYM AI_SECURE}
|
|
AI_SECURE = $00008000; // LUP_SECURE (Vista or later and applies only to NS_EMAIL namespace.)
|
|
{$EXTERNALSYM AI_RETURN_PREFERRED_NAMES}
|
|
AI_RETURN_PREFERRED_NAMES = $00010000; // LUP_RETURN_PREFERRED_NAMES (Vista or later and applies only to NS_EMAIL namespace.)
|
|
{$EXTERNALSYM AI_FQDN}
|
|
AI_FQDN = $00020000; // Return the FQDN in ai_canonname (Windows 7 or later)
|
|
{$EXTERNALSYM AI_FILESERVER}
|
|
AI_FILESERVER = $00040000; // Resolving fileserver name resolution (Windows 7 or later)
|
|
{$EXTERNALSYM AI_DISABLE_IDN_ENCODING}
|
|
AI_DISABLE_IDN_ENCODING = $00080000; // Disable Internationalized Domain Names handling
|
|
|
|
|
|
type
|
|
{$EXTERNALSYM PADDRINFOEXA}
|
|
PADDRINFOEXA = ^TAddrInfoEXA;
|
|
{$EXTERNALSYM ADDRINFOEXA}
|
|
ADDRINFOEXA = record
|
|
ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
|
|
ai_family : Integer; // PF_xxx
|
|
ai_socktype : Integer; // SOCK_xxx
|
|
ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
|
|
ai_addrlen : size_t; // Length of ai_addr
|
|
ai_canonname : PAnsiChar; // Canonical name for nodename
|
|
ai_addr : Psockaddr; // Binary address
|
|
ai_blob : Pointer;
|
|
ai_bloblen : size_t;
|
|
ai_provider : LPGUID;
|
|
ai_next : PADDRINFOEXA; // Next structure in linked list
|
|
end;
|
|
{$NODEFINE TAddrInfoEXA}
|
|
TAddrInfoExA = ADDRINFOEXA;
|
|
{$EXTERNALSYM LPADDRINFOEXA}
|
|
LPADDRINFOEXA = PADDRINFOEXA;
|
|
|
|
{$EXTERNALSYM PADDRINFOEXW}
|
|
PADDRINFOEXW = ^TAddrInfoEXW;
|
|
{$EXTERNALSYM ADDRINFOEXW}
|
|
ADDRINFOEXW = record
|
|
ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
|
|
ai_family : Integer; // PF_xxx
|
|
ai_socktype : Integer; // SOCK_xxx
|
|
ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
|
|
ai_addrlen : size_t; // Length of ai_addr
|
|
ai_canonname : PWideChar; // Canonical name for nodename
|
|
ai_addr : Psockaddr; // Binary address
|
|
ai_blob : Pointer;
|
|
ai_bloblen : size_t;
|
|
ai_provider : LPGUID;
|
|
ai_next : PADDRINFOEXW; // Next structure in linked list
|
|
end;
|
|
{$NODEFINE TAddrInfoExW}
|
|
TAddrInfoExW = ADDRINFOEXW;
|
|
{$EXTERNALSYM LPADDRINFOEXW}
|
|
LPADDRINFOEXW = PADDRINFOEXW;
|
|
|
|
{$EXTERNALSYM Paddrinfoex2A}
|
|
Paddrinfoex2A = ^addrinfoex2A;
|
|
{$EXTERNALSYM addrinfoex2A}
|
|
addrinfoex2A = record
|
|
ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
|
|
ai_family : Integer; // PF_xxx
|
|
ai_socktype : Integer; // SOCK_xxx
|
|
ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
|
|
ai_addrlen : size_t; // Length of ai_addr
|
|
ai_canonname : PAnsiChar; // Canonical name for nodename
|
|
ai_addr : Psockaddr; // Binary address
|
|
ai_blob : Pointer;
|
|
ai_bloblen : size_t;
|
|
ai_provider : LPGUID;
|
|
ai_next : Paddrinfoex2A; // Next structure in linked list
|
|
ai_version : Integer;
|
|
ai_fqdn : PAnsiChar;
|
|
end;
|
|
{$NODEFINE TAddrInfoEx2A}
|
|
TAddrInfoEx2A = addrinfoex2A;
|
|
{$EXTERNALSYM LPADDRINFOEX2A}
|
|
LPADDRINFOEX2A = Paddrinfoex2A;
|
|
|
|
{$EXTERNALSYM Paddrinfoex2W}
|
|
Paddrinfoex2W = ^addrinfoex2W;
|
|
{$EXTERNALSYM addrinfoex2W}
|
|
addrinfoex2W = record
|
|
ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
|
|
ai_family : Integer; // PF_xxx
|
|
ai_socktype : Integer; // SOCK_xxx
|
|
ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
|
|
ai_addrlen : size_t; // Length of ai_addr
|
|
ai_canonname : PWideChar; // Canonical name for nodename
|
|
ai_addr : Psockaddr; //_Field_size_bytes_(ai_addrlen) // Binary address
|
|
ai_blob : Pointer; //_Field_size_(ai_bloblen)
|
|
ai_bloblen : size_t;
|
|
ai_provider : LPGUID;
|
|
ai_next : Paddrinfoex2W; // Next structure in linked list
|
|
ai_version : Integer;
|
|
ai_fqdn : PWideChar;
|
|
end;
|
|
{$NODEFINE TAddrInfoEx2W}
|
|
TAddrInfoEx2W = addrinfoex2W;
|
|
{$EXTERNALSYM LPADDRINFOEX2W}
|
|
LPADDRINFOEX2W = Paddrinfoex2W;
|
|
|
|
var
|
|
{$EXTERNALSYM scopeid_unspecified}
|
|
scopeid_unspecified: {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
|
|
|
|
// RLebeau: the in4addr_any, _in4addr_loopback, and _in4addr_broadcast variables
|
|
// clash with the IN4ADDR_ANY, IN4ADDR_LOOPBACK, and IN4ADDR_BROADCAST constants
|
|
{$EXTERNALSYM in4addr_any}
|
|
{$NODEFINE _in4addr_any}
|
|
_in4addr_any: TInAddr;
|
|
{$EXTERNALSYM in4addr_loopback}
|
|
{$NODEFINE _in4addr_loopback}
|
|
_in4addr_loopback: TInAddr;
|
|
{$EXTERNALSYM in4addr_broadcast}
|
|
{$NODEFINE _in4addr_broadcast}
|
|
_in4addr_broadcast: TInAddr;
|
|
|
|
{$EXTERNALSYM in4addr_allnodesonlink}
|
|
in4addr_allnodesonlink: TInAddr;
|
|
{$EXTERNALSYM in4addr_allroutersonlink}
|
|
in4addr_allroutersonlink: TInAddr;
|
|
{$EXTERNALSYM in4addr_alligmpv3routersonlink}
|
|
in4addr_alligmpv3routersonlink: TInAddr;
|
|
{$EXTERNALSYM in4addr_allteredohostsonlink}
|
|
in4addr_allteredohostsonlink: TInAddr;
|
|
{$EXTERNALSYM in4addr_linklocalprefix}
|
|
in4addr_linklocalprefix: TInAddr;
|
|
{$EXTERNALSYM in4addr_multicastprefix}
|
|
in4addr_multicastprefix: TInAddr;
|
|
|
|
{$EXTERNALSYM in6addr_any}
|
|
in6addr_any: TIn6Addr;
|
|
{$EXTERNALSYM in6addr_loopback}
|
|
in6addr_loopback: TIn6Addr;
|
|
{$EXTERNALSYM in6addr_allnodesonnode}
|
|
in6addr_allnodesonnode: TIn6Addr;
|
|
{$EXTERNALSYM in6addr_allnodesonlink}
|
|
in6addr_allnodesonlink: TIn6Addr;
|
|
{$EXTERNALSYM in6addr_allroutersonlink}
|
|
in6addr_allroutersonlink: TIn6Addr;
|
|
{$EXTERNALSYM in6addr_solicitednodemulticastprefix}
|
|
in6addr_solicitednodemulticastprefix: TIn6Addr;
|
|
{$EXTERNALSYM in6addr_v4mappedprefix}
|
|
in6addr_v4mappedprefix: TIn6Addr;
|
|
{$EXTERNALSYM in6addr_6to4prefix}
|
|
in6addr_6to4prefix: TIn6Addr;
|
|
{$EXTERNALSYM in6addr_teredoprefix}
|
|
in6addr_teredoprefix: TIn6Addr;
|
|
|
|
//=============================================================
|
|
|
|
{
|
|
wsipx.h
|
|
|
|
Microsoft Windows
|
|
Copyright (C) Microsoft Corporation, 1992-1999.
|
|
|
|
Windows Sockets include file for IPX/SPX. This file contains all
|
|
standardized IPX/SPX information. Include this header file after
|
|
winsock.h.
|
|
|
|
To open an IPX socket, call socket() with an address family of
|
|
AF_IPX, a socket type of SOCK_DGRAM, and protocol NSPROTO_IPX.
|
|
Note that the protocol value must be specified, it cannot be 0.
|
|
All IPX packets are sent with the packet type field of the IPX
|
|
header set to 0.
|
|
|
|
To open an SPX or SPXII socket, call socket() with an address
|
|
family of AF_IPX, socket type of SOCK_SEQPACKET or SOCK_STREAM,
|
|
and protocol of NSPROTO_SPX or NSPROTO_SPXII. If SOCK_SEQPACKET
|
|
is specified, then the end of message bit is respected, and
|
|
recv() calls are not completed until a packet is received with
|
|
the end of message bit set. If SOCK_STREAM is specified, then
|
|
the end of message bit is not respected, and recv() completes
|
|
as soon as any data is received, regardless of the setting of the
|
|
end of message bit. Send coalescing is never performed, and sends
|
|
smaller than a single packet are always sent with the end of
|
|
message bit set. Sends larger than a single packet are packetized
|
|
with the end of message bit set on only the last packet of the
|
|
send.
|
|
}
|
|
|
|
// This is the structure of the SOCKADDR structure for IPX and SPX.
|
|
type
|
|
{$EXTERNALSYM SOCKADDR_IPX}
|
|
SOCKADDR_IPX = record
|
|
sa_family : u_short;
|
|
sa_netnum : Array [0..3] of AnsiChar;
|
|
sa_nodenum : Array [0..5] of AnsiChar;
|
|
sa_socket : u_short;
|
|
end;
|
|
{$NODEFINE TSockAddrIPX}
|
|
TSockAddrIPX = SOCKADDR_IPX;
|
|
{$NODEFINE PSockAddrIPX}
|
|
PSockAddrIPX = ^TSockAddrIPX;
|
|
{$EXTERNALSYM PSOCKADDR_IPX}
|
|
PSOCKADDR_IPX = PSockAddrIPX;
|
|
{$EXTERNALSYM LPSOCKADDR_IPX}
|
|
LPSOCKADDR_IPX = PSOCKADDR_IPX;
|
|
|
|
// Protocol families used in the "protocol" parameter of the socket() API.
|
|
const
|
|
{$EXTERNALSYM NSPROTO_IPX}
|
|
NSPROTO_IPX = 1000;
|
|
{$EXTERNALSYM NSPROTO_SPX}
|
|
NSPROTO_SPX = 1256;
|
|
{$EXTERNALSYM NSPROTO_SPXII}
|
|
NSPROTO_SPXII = 1257;
|
|
|
|
|
|
//=============================================================
|
|
|
|
{
|
|
wsnwlink.h
|
|
|
|
Microsoft Windows
|
|
Copyright (C) Microsoft Corporation, 1992-1999.
|
|
Microsoft-specific extensions to the Windows NT IPX/SPX Windows
|
|
Sockets interface. These extensions are provided for use as
|
|
necessary for compatibility with existing applications. They are
|
|
otherwise not recommended for use, as they are only guaranteed to
|
|
work over the Microsoft IPX/SPX stack. An application which
|
|
uses these extensions may not work over other IPX/SPX
|
|
implementations. Include this header file after winsock.h and
|
|
wsipx.h.
|
|
|
|
To open an IPX socket where a particular packet type is sent in
|
|
the IPX header, specify NSPROTO_IPX + n as the protocol parameter
|
|
of the socket() API. For example, to open an IPX socket that
|
|
sets the packet type to 34, use the following socket() call:
|
|
|
|
s = socket(AF_IPX, SOCK_DGRAM, NSPROTO_IPX + 34);
|
|
}
|
|
|
|
// Below are socket option that may be set or retrieved by specifying
|
|
// the appropriate manifest in the "optname" parameter of getsockopt()
|
|
// or setsockopt(). Use NSPROTO_IPX as the "level" argument for the
|
|
// call.
|
|
const
|
|
|
|
// Set/get the IPX packet type. The value specified in the
|
|
// optval argument will be set as the packet type on every IPX
|
|
// packet sent from this socket. The optval parameter of
|
|
// getsockopt()/setsockopt() points to an int.
|
|
{$EXTERNALSYM IPX_PTYPE}
|
|
IPX_PTYPE = $4000;
|
|
|
|
// Set/get the receive filter packet type. Only IPX packets with
|
|
// a packet type equal to the value specified in the optval
|
|
// argument will be returned; packets with a packet type that
|
|
// does not match are discarded. optval points to an int.
|
|
{$EXTERNALSYM IPX_FILTERPTYPE}
|
|
IPX_FILTERPTYPE = $4001;
|
|
|
|
// Stop filtering on packet type set with IPX_FILTERPTYPE.
|
|
{$EXTERNALSYM IPX_STOPFILTERPTYPE}
|
|
IPX_STOPFILTERPTYPE = $4003;
|
|
|
|
// Set/get the value of the datastream field in the SPX header on
|
|
// every packet sent. optval points to an int.
|
|
{$EXTERNALSYM IPX_DSTYPE}
|
|
IPX_DSTYPE = $4002;
|
|
|
|
// Enable extended addressing. On sends, adds the element
|
|
// "unsigned char sa_ptype" to the SOCKADDR_IPX structure,
|
|
// making the total length 15 bytes. On receives, add both
|
|
// the sa_ptype and "unsigned char sa_flags" to the SOCKADDR_IPX
|
|
// structure, making the total length 16 bytes. The current
|
|
// bits defined in sa_flags are:
|
|
// 0x01 - the received frame was sent as a broadcast
|
|
// 0x02 - the received frame was sent from this machine
|
|
// optval points to a BOOL.
|
|
{$EXTERNALSYM IPX_EXTENDED_ADDRESS}
|
|
IPX_EXTENDED_ADDRESS = $4004;
|
|
|
|
// Send protocol header up on all receive packets. optval points
|
|
// to a BOOL.
|
|
{$EXTERNALSYM IPX_RECVHDR}
|
|
IPX_RECVHDR = $4005;
|
|
|
|
// Get the maximum data size that can be sent. Not valid with
|
|
// setsockopt(). optval points to an int where the value is
|
|
// returned.
|
|
{$EXTERNALSYM IPX_MAXSIZE}
|
|
IPX_MAXSIZE = $4006;
|
|
|
|
// Query information about a specific adapter that IPX is bound
|
|
// to. In a system with n adapters they are numbered 0 through n-1.
|
|
// Callers can issue the IPX_MAX_ADAPTER_NUM getsockopt() to find
|
|
// out the number of adapters present, or call IPX_ADDRESS with
|
|
// increasing values of adapternum until it fails. Not valid
|
|
// with setsockopt(). optval points to an instance of the
|
|
// IPX_ADDRESS_DATA structure with the adapternum filled in.
|
|
{$EXTERNALSYM IPX_ADDRESS}
|
|
IPX_ADDRESS = $4007;
|
|
|
|
type
|
|
{$EXTERNALSYM IPX_ADDRESS_DATA}
|
|
IPX_ADDRESS_DATA = record
|
|
adapternum : Integer; // input: 0-based adapter number
|
|
netnum : Array [0..3] of Byte; // output: IPX network number
|
|
nodenum : Array [0..5] of Byte; // output: IPX node address
|
|
wan : Boolean; // output: TRUE = adapter is on a wan link
|
|
status : Boolean; // output: TRUE = wan link is up (or adapter is not wan)
|
|
maxpkt : Integer; // output: max packet size, not including IPX header
|
|
linkspeed : ULONG; // output: link speed in 100 bytes/sec (i.e. 96 == 9600 bps)
|
|
end;
|
|
{$NODEFINE TIPXAddressData}
|
|
TIPXAddressData = IPX_ADDRESS_DATA;
|
|
{$NODEFINE PIPXAddressData}
|
|
PIPXAddressData = ^TIPXAddressData;
|
|
{$EXTERNALSYM PIPX_ADDRESS_DATA}
|
|
PIPX_ADDRESS_DATA = PIPXAddressData;
|
|
|
|
const
|
|
// Query information about a specific IPX network number. If the
|
|
// network is in IPX's cache it will return the information directly, {Do not Localize}
|
|
// otherwise it will issue RIP requests to find it. Not valid with
|
|
// setsockopt(). optval points to an instance of the IPX_NETNUM_DATA
|
|
// structure with the netnum filled in.
|
|
{$EXTERNALSYM IPX_GETNETINFO}
|
|
IPX_GETNETINFO = $4008;
|
|
|
|
type
|
|
{$EXTERNALSYM IPX_NETNUM_DATA}
|
|
IPX_NETNUM_DATA = record
|
|
netnum : Array [0..3] of Byte; // input: IPX network number
|
|
hopcount : Word; // output: hop count to this network, in machine order
|
|
netdelay : Word; // output: tick count to this network, in machine order
|
|
cardnum : Integer; // output: 0-based adapter number used to route to this net;
|
|
// can be used as adapternum input to IPX_ADDRESS
|
|
router : Array [0..5] of Byte; // output: MAC address of the next hop router, zeroed if
|
|
// the network is directly attached
|
|
end;
|
|
{$NODEFINE TIPXNetNumData}
|
|
TIPXNetNumData = IPX_NETNUM_DATA;
|
|
{$NODEFINE PIPXNetNumData}
|
|
PIPXNetNumData = ^TIPXNetNumData;
|
|
{$EXTERNALSYM PIPX_NETNUM_DATA}
|
|
PIPX_NETNUM_DATA = PIPXNetNumData;
|
|
|
|
const
|
|
// Like IPX_GETNETINFO except it does not issue RIP requests. If the
|
|
// network is in IPX's cache it will return the information, otherwise {Do not Localize}
|
|
// it will fail (see also IPX_RERIPNETNUMBER which always forces a
|
|
// re-RIP). Not valid with setsockopt(). optval points to an instance of
|
|
// the IPX_NETNUM_DATA structure with the netnum filled in.
|
|
{$EXTERNALSYM IPX_GETNETINFO_NORIP}
|
|
IPX_GETNETINFO_NORIP = $4009;
|
|
|
|
// Get information on a connected SPX socket. optval points
|
|
// to an instance of the IPX_SPXCONNSTATUS_DATA structure.
|
|
// *** All numbers are in Novell (high-low) order. ***
|
|
{$EXTERNALSYM IPX_SPXGETCONNECTIONSTATUS}
|
|
IPX_SPXGETCONNECTIONSTATUS = $400B;
|
|
|
|
type
|
|
{$EXTERNALSYM IPX_SPXCONNSTATUS_DATA}
|
|
IPX_SPXCONNSTATUS_DATA = record
|
|
ConnectionState : Byte;
|
|
WatchDogActive : Byte;
|
|
LocalConnectionId : Word;
|
|
RemoteConnectionId : Word;
|
|
LocalSequenceNumber : Word;
|
|
LocalAckNumber : Word;
|
|
LocalAllocNumber : Word;
|
|
RemoteAckNumber : Word;
|
|
RemoteAllocNumber : Word;
|
|
LocalSocket : Word;
|
|
ImmediateAddress : Array [0..5] of Byte;
|
|
RemoteNetwork : Array [0..3] of Byte;
|
|
RemoteNode : Array [0..5] of Byte;
|
|
RemoteSocket : Word;
|
|
RetransmissionCount : Word;
|
|
EstimatedRoundTripDelay : Word; // In milliseconds
|
|
RetransmittedPackets : Word;
|
|
SuppressedPacket : Word;
|
|
end;
|
|
{$NODEFINE TIPXSPXConnStatusData}
|
|
TIPXSPXConnStatusData = IPX_SPXCONNSTATUS_DATA;
|
|
{$NODEFINE PIPXSPXConnStatusData}
|
|
PIPXSPXConnStatusData = ^TIPXSPXConnStatusData;
|
|
{$EXTERNALSYM PIPX_SPXCONNSTATUS_DATA}
|
|
PIPX_SPXCONNSTATUS_DATA = PIPXSPXConnStatusData;
|
|
|
|
const
|
|
// Get notification when the status of an adapter that IPX is
|
|
// bound to changes. Typically this will happen when a wan line
|
|
// goes up or down. Not valid with setsockopt(). optval points
|
|
// to a buffer which contains an IPX_ADDRESS_DATA structure
|
|
// followed immediately by a HANDLE to an unsignaled event.
|
|
//
|
|
// When the getsockopt() query is submitted, it will complete
|
|
// successfully. However, the IPX_ADDRESS_DATA pointed to by
|
|
// optval will not be updated at that point. Instead the
|
|
// request is queued internally inside the transport.
|
|
//
|
|
// When the status of an adapter changes, IPX will locate a
|
|
// queued getsockopt() query and fill in all the fields in the
|
|
// IPX_ADDRESS_DATA structure. It will then signal the event
|
|
// pointed to by the HANDLE in the optval buffer. This handle
|
|
// should be obtained before calling getsockopt() by calling
|
|
// CreateEvent(). If multiple getsockopts() are submitted at
|
|
// once, different events must be used.
|
|
//
|
|
// The event is used because the call needs to be asynchronous
|
|
// but currently getsockopt() does not support this.
|
|
//
|
|
// WARNING: In the current implementation, the transport will
|
|
// only signal one queued query for each status change. Therefore
|
|
// only one service which uses this query should be running at
|
|
// once.
|
|
{$EXTERNALSYM IPX_ADDRESS_NOTIFY}
|
|
IPX_ADDRESS_NOTIFY = $400C;
|
|
|
|
// Get the maximum number of adapters present. If this call returns
|
|
// n then the adapters are numbered 0 through n-1. Not valid
|
|
// with setsockopt(). optval points to an int where the value
|
|
// is returned.
|
|
{$EXTERNALSYM IPX_MAX_ADAPTER_NUM}
|
|
IPX_MAX_ADAPTER_NUM = $400D;
|
|
|
|
// Like IPX_GETNETINFO except it forces IPX to re-RIP even if the
|
|
// network is in its cache (but not if it is directly attached to).
|
|
// Not valid with setsockopt(). optval points to an instance of
|
|
// the IPX_NETNUM_DATA structure with the netnum filled in.
|
|
{$EXTERNALSYM IPX_RERIPNETNUMBER}
|
|
IPX_RERIPNETNUMBER = $400E;
|
|
|
|
// A hint that broadcast packets may be received. The default is
|
|
// TRUE. Applications that do not need to receive broadcast packets
|
|
// should set this sockopt to FALSE which may cause better system
|
|
// performance (note that it does not necessarily cause broadcasts
|
|
// to be filtered for the application). Not valid with getsockopt().
|
|
// optval points to a BOOL.
|
|
{$EXTERNALSYM IPX_RECEIVE_BROADCAST}
|
|
IPX_RECEIVE_BROADCAST = $400F;
|
|
|
|
// On SPX connections, don't delay before sending ack. Applications {Do not Localize}
|
|
// that do not tend to have back-and-forth traffic over SPX should
|
|
// set this; it will increase the number of acks sent but will remove
|
|
// delays in sending acks. optval points to a BOOL.
|
|
{$EXTERNALSYM IPX_IMMEDIATESPXACK}
|
|
IPX_IMMEDIATESPXACK = $4010;
|
|
|
|
|
|
//=============================================================
|
|
|
|
// wsnetbs.h
|
|
// Copyright (c) 1994-1999, Microsoft Corp. All rights reserved.
|
|
//
|
|
// Windows Sockets include file for NETBIOS. This file contains all
|
|
// standardized NETBIOS information. Include this header file after
|
|
// winsock.h.
|
|
|
|
// To open a NetBIOS socket, call the socket() function as follows:
|
|
//
|
|
// s = socket( AF_NETBIOS, {SOCK_SEQPACKET|SOCK_DGRAM}, -Lana );
|
|
//
|
|
// where Lana is the NetBIOS Lana number of interest. For example, to
|
|
// open a socket for Lana 2, specify -2 as the "protocol" parameter
|
|
// to the socket() function.
|
|
|
|
|
|
// This is the structure of the SOCKADDR structure for NETBIOS.
|
|
|
|
const
|
|
{$EXTERNALSYM NETBIOS_NAME_LENGTH}
|
|
NETBIOS_NAME_LENGTH = 16;
|
|
|
|
type
|
|
{$EXTERNALSYM SOCKADDR_NB}
|
|
SOCKADDR_NB = record
|
|
snb_family : short;
|
|
snb_type : u_short;
|
|
snb_name : array[0..NETBIOS_NAME_LENGTH-1] of AnsiChar;
|
|
end;
|
|
{$NODEFINE TSockAddrNB}
|
|
TSockAddrNB = SOCKADDR_NB;
|
|
{$NODEFINE PSockAddrNB}
|
|
PSockAddrNB = ^TSockAddrNB;
|
|
{$EXTERNALSYM PSOCKADDR_NB}
|
|
PSOCKADDR_NB = PSockAddrNB;
|
|
{$EXTERNALSYM LPSOCKADDR_NB}
|
|
LPSOCKADDR_NB = PSOCKADDR_NB;
|
|
|
|
// Bit values for the snb_type field of SOCKADDR_NB.
|
|
const
|
|
{$EXTERNALSYM NETBIOS_UNIQUE_NAME}
|
|
NETBIOS_UNIQUE_NAME = $0000;
|
|
{$EXTERNALSYM NETBIOS_GROUP_NAME}
|
|
NETBIOS_GROUP_NAME = $0001;
|
|
{$EXTERNALSYM NETBIOS_TYPE_QUICK_UNIQUE}
|
|
NETBIOS_TYPE_QUICK_UNIQUE = $0002;
|
|
{$EXTERNALSYM NETBIOS_TYPE_QUICK_GROUP}
|
|
NETBIOS_TYPE_QUICK_GROUP = $0003;
|
|
|
|
// A macro convenient for setting up NETBIOS SOCKADDRs.
|
|
{$EXTERNALSYM SET_NETBIOS_SOCKADDR}
|
|
procedure SET_NETBIOS_SOCKADDR(snb : PSockAddrNB; const SnbType : Word; const Name : PAnsiChar; const Port : AnsiChar);
|
|
|
|
|
|
//=============================================================
|
|
|
|
// Copyright 1997 - 1998 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
//
|
|
// ws2atm.h
|
|
//
|
|
// Abstract:
|
|
//
|
|
// Winsock 2 ATM Annex definitions.
|
|
|
|
const
|
|
{$EXTERNALSYM ATMPROTO_AALUSER}
|
|
ATMPROTO_AALUSER = $00; // User-defined AAL
|
|
{$EXTERNALSYM ATMPROTO_AAL1}
|
|
ATMPROTO_AAL1 = $01; // AAL 1
|
|
{$EXTERNALSYM ATMPROTO_AAL2}
|
|
ATMPROTO_AAL2 = $02; // AAL 2
|
|
{$EXTERNALSYM ATMPROTO_AAL34}
|
|
ATMPROTO_AAL34 = $03; // AAL 3/4
|
|
{$EXTERNALSYM ATMPROTO_AAL5}
|
|
ATMPROTO_AAL5 = $05; // AAL 5
|
|
|
|
{$EXTERNALSYM SAP_FIELD_ABSENT}
|
|
SAP_FIELD_ABSENT = $FFFFFFFE;
|
|
{$EXTERNALSYM SAP_FIELD_ANY}
|
|
SAP_FIELD_ANY = $FFFFFFFF;
|
|
{$EXTERNALSYM SAP_FIELD_ANY_AESA_SEL}
|
|
SAP_FIELD_ANY_AESA_SEL = $FFFFFFFA;
|
|
{$EXTERNALSYM SAP_FIELD_ANY_AESA_REST}
|
|
SAP_FIELD_ANY_AESA_REST = $FFFFFFFB;
|
|
|
|
// values used for AddressType in struct ATM_ADDRESS
|
|
{$EXTERNALSYM ATM_E164}
|
|
ATM_E164 = $01; // E.164 addressing scheme
|
|
{$EXTERNALSYM ATM_NSAP}
|
|
ATM_NSAP = $02; // NSAP-style ATM Endsystem Address scheme
|
|
{$EXTERNALSYM ATM_AESA}
|
|
ATM_AESA = $02; // NSAP-style ATM Endsystem Address scheme
|
|
|
|
{$EXTERNALSYM ATM_ADDR_SIZE}
|
|
ATM_ADDR_SIZE = 20;
|
|
|
|
type
|
|
{$EXTERNALSYM ATM_ADDRESS}
|
|
ATM_ADDRESS = record
|
|
AddressType : DWORD; // E.164 or NSAP-style ATM Endsystem Address
|
|
NumofDigits : DWORD; // number of digits;
|
|
Addr : Array[0..ATM_ADDR_SIZE-1] of Byte; // IA5 digits for E164, BCD encoding for NSAP
|
|
// format as defined in the ATM Forum UNI 3.1
|
|
end;
|
|
|
|
// values used for Layer2Protocol in B-LLI
|
|
const
|
|
{$EXTERNALSYM BLLI_L2_ISO_1745}
|
|
BLLI_L2_ISO_1745 = $01; // Basic mode ISO 1745
|
|
{$EXTERNALSYM BLLI_L2_Q921}
|
|
BLLI_L2_Q921 = $02; // CCITT Rec. Q.921
|
|
{$EXTERNALSYM BLLI_L2_X25L}
|
|
BLLI_L2_X25L = $06; // CCITT Rec. X.25, link layer
|
|
{$EXTERNALSYM BLLI_L2_X25M}
|
|
BLLI_L2_X25M = $07; // CCITT Rec. X.25, multilink
|
|
{$EXTERNALSYM BLLI_L2_ELAPB}
|
|
BLLI_L2_ELAPB = $08; // Extended LAPB; for half duplex operation
|
|
{$EXTERNALSYM BLLI_L2_HDLC_NRM}
|
|
BLLI_L2_HDLC_NRM = $09; // HDLC NRM (ISO 4335)
|
|
{$EXTERNALSYM BLLI_L2_HDLC_ABM}
|
|
BLLI_L2_HDLC_ABM = $0A; // HDLC ABM (ISO 4335)
|
|
{$EXTERNALSYM BLLI_L2_HDLC_ARM}
|
|
BLLI_L2_HDLC_ARM = $0B; // HDLC ARM (ISO 4335)
|
|
{$EXTERNALSYM BLLI_L2_LLC}
|
|
BLLI_L2_LLC = $0C; // LAN logical link control (ISO 8802/2)
|
|
{$EXTERNALSYM BLLI_L2_X75}
|
|
BLLI_L2_X75 = $0D; // CCITT Rec. X.75, single link procedure
|
|
{$EXTERNALSYM BLLI_L2_Q922}
|
|
BLLI_L2_Q922 = $0E; // CCITT Rec. Q.922
|
|
{$EXTERNALSYM BLLI_L2_USER_SPECIFIED}
|
|
BLLI_L2_USER_SPECIFIED = $10; // User Specified
|
|
{$EXTERNALSYM BLLI_L2_ISO_7776}
|
|
BLLI_L2_ISO_7776 = $11; // ISO 7776 DTE-DTE operation
|
|
|
|
// values used for Layer3Protocol in B-LLI
|
|
{$EXTERNALSYM BLLI_L3_X25}
|
|
BLLI_L3_X25 = $06; // CCITT Rec. X.25, packet layer
|
|
{$EXTERNALSYM BLLI_L3_ISO_8208}
|
|
BLLI_L3_ISO_8208 = $07; // ISO/IEC 8208 (X.25 packet layer for DTE
|
|
{$EXTERNALSYM BLLI_L3_X223}
|
|
BLLI_L3_X223 = $08; // X.223/ISO 8878
|
|
{$EXTERNALSYM BLLI_L3_SIO_8473}
|
|
BLLI_L3_SIO_8473 = $09; // ISO/IEC 8473 (OSI connectionless)
|
|
{$EXTERNALSYM BLLI_L3_T70}
|
|
BLLI_L3_T70 = $0A; // CCITT Rec. T.70 min. network layer
|
|
{$EXTERNALSYM BLLI_L3_ISO_TR9577}
|
|
BLLI_L3_ISO_TR9577 = $0B; // ISO/IEC TR 9577 Network Layer Protocol ID
|
|
{$EXTERNALSYM BLLI_L3_USER_SPECIFIED}
|
|
BLLI_L3_USER_SPECIFIED = $10; // User Specified
|
|
|
|
// values used for Layer3IPI in B-LLI
|
|
{$EXTERNALSYM BLLI_L3_IPI_SNAP}
|
|
BLLI_L3_IPI_SNAP = $80; // IEEE 802.1 SNAP identifier
|
|
{$EXTERNALSYM BLLI_L3_IPI_IP}
|
|
BLLI_L3_IPI_IP = $CC; // Internet Protocol (IP) identifier
|
|
|
|
type
|
|
{$EXTERNALSYM ATM_BLLI}
|
|
ATM_BLLI = record
|
|
// Identifies the layer-two protocol.
|
|
// Corresponds to the User information layer 2 protocol field in the B-LLI information element.
|
|
// A value of SAP_FIELD_ABSENT indicates that this field is not used, and a value of SAP_FIELD_ANY means wildcard.
|
|
Layer2Protocol : DWORD; // User information layer 2 protocol
|
|
// Identifies the user-specified layer-two protocol.
|
|
// Only used if the Layer2Protocol parameter is set to BLLI_L2_USER_SPECIFIED.
|
|
// The valid values range from zero-127.
|
|
// Corresponds to the User specified layer 2 protocol information field in the B-LLI information element.
|
|
Layer2UserSpecifiedProtocol : DWORD; // User specified layer 2 protocol information
|
|
// Identifies the layer-three protocol.
|
|
// Corresponds to the User information layer 3 protocol field in the B-LLI information element.
|
|
// A value of SAP_FIELD_ABSENT indicates that this field is not used, and a value of SAP_FIELD_ANY means wildcard.
|
|
Layer3Protocol : DWORD; // User information layer 3 protocol
|
|
// Identifies the user-specified layer-three protocol.
|
|
// Only used if the Layer3Protocol parameter is set to BLLI_L3_USER_SPECIFIED.
|
|
// The valid values range from zero-127.
|
|
// Corresponds to the User specified layer 3 protocol information field in the B-LLI information element.
|
|
Layer3UserSpecifiedProtocol : DWORD; // User specified layer 3 protocol information
|
|
// Identifies the layer-three Initial Protocol Identifier.
|
|
// Only used if the Layer3Protocol parameter is set to BLLI_L3_ISO_TR9577.
|
|
// Corresponds to the ISO/IEC TR 9577 Initial Protocol Identifier field in the B-LLI information element.
|
|
Layer3IPI : DWORD; // ISO/IEC TR 9577 Initial Protocol Identifier
|
|
// Identifies the 802.1 SNAP identifier.
|
|
// Only used if the Layer3Protocol parameter is set to BLLI_L3_ISO_TR9577 and Layer3IPI is set to BLLI_L3_IPI_SNAP,
|
|
// indicating an IEEE 802.1 SNAP identifier. Corresponds to the OUI and PID fields in the B-LLI information element.
|
|
SnapID : Array[0..4] of Byte; // SNAP ID consisting of OUI and PID
|
|
end;
|
|
|
|
// values used for the HighLayerInfoType field in ATM_BHLI
|
|
const
|
|
{$EXTERNALSYM BHLI_ISO}
|
|
BHLI_ISO = $00; // ISO
|
|
{$EXTERNALSYM BHLI_UserSpecific}
|
|
BHLI_UserSpecific = $01; // User Specific
|
|
{$EXTERNALSYM BHLI_HighLayerProfile}
|
|
BHLI_HighLayerProfile = $02; // High layer profile (only in UNI3.0)
|
|
{$EXTERNALSYM BHLI_VendorSpecificAppId}
|
|
BHLI_VendorSpecificAppId = $03; // Vendor-Specific Application ID
|
|
|
|
type
|
|
{$EXTERNALSYM ATM_BHLI}
|
|
ATM_BHLI = record
|
|
// Identifies the high layer information type field in the B-LLI information element.
|
|
// Note that the type BHLI_HighLayerProfile has been eliminated in UNI 3.1.
|
|
// A value of SAP_FIELD_ABSENT indicates that B-HLI is not present, and a value of SAP_FIELD_ANY means wildcard.
|
|
HighLayerInfoType : DWORD; // High Layer Information Type
|
|
// Identifies the number of bytes from one to eight in the HighLayerInfo array.
|
|
// Valid values include eight for the cases of BHLI_ISO and BHLI_UserSpecific,
|
|
// four for BHLI_HighLayerProfile, and seven for BHLI_VendorSpecificAppId.
|
|
HighLayerInfoLength : DWORD; // number of bytes in HighLayerInfo
|
|
// Identifies the high layer information field in the B-LLI information element.
|
|
// In the case of HighLayerInfoType being BHLI_VendorSpecificAppId,
|
|
// the first 3 bytes consist of a globally-administered Organizationally Unique Identifier (OUI)
|
|
// (as per IEEE standard 802-1990), followed by a 4-byte application identifier,
|
|
// which is administered by the vendor identified by the OUI.
|
|
// Value for the case of BHLI_UserSpecific is user defined and requires bilateral agreement between two end users.
|
|
HighLayerInfo : Array[0..7] of Byte; // the value dependent on the HighLayerInfoType field
|
|
end;
|
|
|
|
// A new address family, AF_ATM, is introduced for native ATM services,
|
|
// and the corresponding SOCKADDR structure, sockaddr_atm, is defined in the following.
|
|
// To open a socket for native ATM services, parameters in socket should contain
|
|
// AF_ATM, SOCK_RAW, and ATMPROTO_AAL5 or ATMPROTO_AALUSER, respectively.
|
|
{$EXTERNALSYM SOCKADDR_ATM}
|
|
SOCKADDR_ATM = record
|
|
// Identifies the address family, which is AF_ATM in this case.
|
|
satm_family : u_short;
|
|
// Identifies the ATM address that could be either in E.164 or NSAP-style ATM End Systems Address format.
|
|
// This field will be mapped to the Called Party Number IE (Information Element)
|
|
// if it is specified in bind and WSPBind for a listening socket, or in connect, WSAConnect, WSPConnect,
|
|
// WSAJoinLeaf, or WSPJoinLeaf for a connecting socket.
|
|
// It will be mapped to the Calling Party Number IE if specified in bind and WSPBind for a connecting socket.
|
|
satm_number : ATM_ADDRESS;
|
|
// Identifies the fields in the B-LLI Information Element that are used along with satm_bhli to identify an application.
|
|
// Note that the B-LLI layer two information is treated as not present
|
|
// if its Layer2Protocol field contains SAP_FIELD_ABSENT, or as a wildcard if it contains SAP_FIELD_ANY.
|
|
// Similarly, the B-LLI layer three information is treated as not present
|
|
// if its Layer3Protocol field contains SAP_FIELD_ABSENT, or as a wildcard if it contains SAP_FIELD_ANY.
|
|
satm_blli : ATM_BLLI; // B-LLI
|
|
// Identifies the fields in the B-HLI Information Element that are used along with satm_blli to identify an application.
|
|
satm_bhli : ATM_BHLI; // B-HLI
|
|
end;
|
|
{$NODEFINE TSockAddrATM}
|
|
TSockAddrATM = SOCKADDR_ATM;
|
|
{$NODEFINE PSockAddrATM}
|
|
PSockAddrATM = ^TSockAddrATM;
|
|
{$EXTERNALSYM PSOCKADDR_ATM}
|
|
PSOCKADDR_ATM = PSockAddrATM;
|
|
{$EXTERNALSYM LPSOCKADDR_ATM}
|
|
LPSOCKADDR_ATM = PSOCKADDR_ATM;
|
|
|
|
{$EXTERNALSYM Q2931_IE_TYPE}
|
|
Q2931_IE_TYPE = (
|
|
IE_AALParameters,
|
|
IE_TrafficDescriptor,
|
|
IE_BroadbandBearerCapability,
|
|
IE_BHLI,
|
|
IE_BLLI,
|
|
IE_CalledPartyNumber,
|
|
IE_CalledPartySubaddress,
|
|
IE_CallingPartyNumber,
|
|
IE_CallingPartySubaddress,
|
|
IE_Cause,
|
|
IE_QOSClass,
|
|
IE_TransitNetworkSelection);
|
|
|
|
{$EXTERNALSYM Q2931_IE}
|
|
Q2931_IE = record
|
|
IEType : Q2931_IE_TYPE;
|
|
IELength : ULONG;
|
|
IE : Array[0..0] of Byte;
|
|
end;
|
|
|
|
// manifest constants for the AALType field in struct AAL_PARAMETERS_IE
|
|
{$EXTERNALSYM AAL_TYPE}
|
|
AAL_TYPE = LongInt;
|
|
|
|
const
|
|
{$EXTERNALSYM AALTYPE_5}
|
|
AALTYPE_5 = 5; // AAL 5
|
|
{$EXTERNALSYM AALTYPE_USER}
|
|
AALTYPE_USER = 16; // user-defined AAL
|
|
|
|
// values used for the Mode field in struct AAL5_PARAMETERS
|
|
{$EXTERNALSYM AAL5_MODE_MESSAGE}
|
|
AAL5_MODE_MESSAGE = $01;
|
|
{$EXTERNALSYM AAL5_MODE_STREAMING}
|
|
AAL5_MODE_STREAMING = $02;
|
|
|
|
// values used for the SSCSType field in struct AAL5_PARAMETERS
|
|
{$EXTERNALSYM AAL5_SSCS_NULL}
|
|
AAL5_SSCS_NULL = $00;
|
|
{$EXTERNALSYM AAL5_SSCS_SSCOP_ASSURED}
|
|
AAL5_SSCS_SSCOP_ASSURED = $01;
|
|
{$EXTERNALSYM AAL5_SSCS_SSCOP_NON_ASSURED}
|
|
AAL5_SSCS_SSCOP_NON_ASSURED = $02;
|
|
{$EXTERNALSYM AAL5_SSCS_FRAME_RELAY}
|
|
AAL5_SSCS_FRAME_RELAY = $04;
|
|
|
|
type
|
|
{$EXTERNALSYM AAL5_PARAMETERS}
|
|
AAL5_PARAMETERS = record
|
|
ForwardMaxCPCSSDUSize : ULONG;
|
|
BackwardMaxCPCSSDUSize : ULONG;
|
|
Mode : Byte; // only available in UNI 3.0
|
|
SSCSType : Byte;
|
|
end;
|
|
|
|
{$EXTERNALSYM AALUSER_PARAMETERS}
|
|
AALUSER_PARAMETERS = record
|
|
UserDefined : ULONG;
|
|
end;
|
|
|
|
{$EXTERNALSYM AAL_PARAMETERS_IE}
|
|
AAL_PARAMETERS_IE = record
|
|
AALType : AAL_TYPE;
|
|
case Byte of
|
|
0: ( AAL5Parameters : AAL5_PARAMETERS );
|
|
1: ( AALUserParameters : AALUSER_PARAMETERS );
|
|
end;
|
|
|
|
{$EXTERNALSYM ATM_TD}
|
|
ATM_TD = record
|
|
PeakCellRate_CLP0 : ULONG;
|
|
PeakCellRate_CLP01 : ULONG;
|
|
SustainableCellRate_CLP0 : ULONG;
|
|
SustainableCellRate_CLP01 : ULONG;
|
|
MaxBurstSize_CLP0 : ULONG;
|
|
MaxBurstSize_CLP01 : ULONG;
|
|
Tagging : LongBool;
|
|
end;
|
|
|
|
{$EXTERNALSYM ATM_TRAFFIC_DESCRIPTOR_IE}
|
|
ATM_TRAFFIC_DESCRIPTOR_IE = record
|
|
_Forward : ATM_TD;
|
|
Backward : ATM_TD;
|
|
BestEffort : LongBool;
|
|
end;
|
|
|
|
// values used for the BearerClass field in struct ATM_BROADBAND_BEARER_CAPABILITY_IE
|
|
const
|
|
{$EXTERNALSYM BCOB_A}
|
|
BCOB_A = $01; // Bearer class A
|
|
{$EXTERNALSYM BCOB_C}
|
|
BCOB_C = $03; // Bearer class C
|
|
{$EXTERNALSYM BCOB_X}
|
|
BCOB_X = $10; // Bearer class X
|
|
|
|
// values used for the TrafficType field in struct ATM_BROADBAND_BEARER_CAPABILITY_IE
|
|
{$EXTERNALSYM TT_NOIND}
|
|
TT_NOIND = $00; // No indication of traffic type
|
|
{$EXTERNALSYM TT_CBR}
|
|
TT_CBR = $04; // Constant bit rate
|
|
{$EXTERNALSYM TT_VBR}
|
|
TT_VBR = $06; // Variable bit rate
|
|
|
|
// values used for the TimingRequirements field in struct ATM_BROADBAND_BEARER_CAPABILITY_IE
|
|
{$EXTERNALSYM TR_NOIND}
|
|
TR_NOIND = $00; // No timing requirement indication
|
|
{$EXTERNALSYM TR_END_TO_END}
|
|
TR_END_TO_END = $01; // End-to-end timing required
|
|
{$EXTERNALSYM TR_NO_END_TO_END}
|
|
TR_NO_END_TO_END = $02; // End-to-end timing not required
|
|
|
|
// values used for the ClippingSusceptability field in struct ATM_BROADBAND_BEARER_CAPABILITY_IE
|
|
{$EXTERNALSYM CLIP_NOT}
|
|
CLIP_NOT = $00; // Not susceptible to clipping
|
|
{$EXTERNALSYM CLIP_SUS}
|
|
CLIP_SUS = $20; // Susceptible to clipping
|
|
|
|
// values used for the UserPlaneConnectionConfig field in struct ATM_BROADBAND_BEARER_CAPABILITY_IE
|
|
{$EXTERNALSYM UP_P2P}
|
|
UP_P2P = $00; // Point-to-point connection
|
|
{$EXTERNALSYM UP_P2MP}
|
|
UP_P2MP = $01; // Point-to-multipoint connection
|
|
|
|
type
|
|
{$EXTERNALSYM ATM_BROADBAND_BEARER_CAPABILITY_IE}
|
|
ATM_BROADBAND_BEARER_CAPABILITY_IE = record
|
|
BearerClass : Byte;
|
|
TrafficType : Byte;
|
|
TimingRequirements : Byte;
|
|
ClippingSusceptability : Byte;
|
|
UserPlaneConnectionConfig : Byte;
|
|
end;
|
|
{$EXTERNALSYM ATM_BHLI_IE}
|
|
ATM_BHLI_IE = ATM_BHLI;
|
|
|
|
// values used for the Layer2Mode field in struct ATM_BLLI_IE
|
|
const
|
|
{$EXTERNALSYM BLLI_L2_MODE_NORMAL}
|
|
BLLI_L2_MODE_NORMAL = $40;
|
|
{$EXTERNALSYM BLLI_L2_MODE_EXT}
|
|
BLLI_L2_MODE_EXT = $80;
|
|
|
|
// values used for the Layer3Mode field in struct ATM_BLLI_IE
|
|
{$EXTERNALSYM BLLI_L3_MODE_NORMAL}
|
|
BLLI_L3_MODE_NORMAL = $40;
|
|
{$EXTERNALSYM BLLI_L3_MODE_EXT}
|
|
BLLI_L3_MODE_EXT = $80;
|
|
|
|
// values used for the Layer3DefaultPacketSize field in struct ATM_BLLI_IE
|
|
{$EXTERNALSYM BLLI_L3_PACKET_16}
|
|
BLLI_L3_PACKET_16 = $04;
|
|
{$EXTERNALSYM BLLI_L3_PACKET_32}
|
|
BLLI_L3_PACKET_32 = $05;
|
|
{$EXTERNALSYM BLLI_L3_PACKET_64}
|
|
BLLI_L3_PACKET_64 = $06;
|
|
{$EXTERNALSYM BLLI_L3_PACKET_128}
|
|
BLLI_L3_PACKET_128 = $07;
|
|
{$EXTERNALSYM BLLI_L3_PACKET_256}
|
|
BLLI_L3_PACKET_256 = $08;
|
|
{$EXTERNALSYM BLLI_L3_PACKET_512}
|
|
BLLI_L3_PACKET_512 = $09;
|
|
{$EXTERNALSYM BLLI_L3_PACKET_1024}
|
|
BLLI_L3_PACKET_1024 = $0A;
|
|
{$EXTERNALSYM BLLI_L3_PACKET_2048}
|
|
BLLI_L3_PACKET_2048 = $0B;
|
|
{$EXTERNALSYM BLLI_L3_PACKET_4096}
|
|
BLLI_L3_PACKET_4096 = $0C;
|
|
|
|
type
|
|
{$EXTERNALSYM ATM_BLLI_IE}
|
|
ATM_BLLI_IE = record
|
|
Layer2Protocol : DWORD; // User information layer 2 protocol
|
|
Layer2Mode : Byte;
|
|
Layer2WindowSize : Byte;
|
|
Layer2UserSpecifiedProtocol : DWORD; // User specified layer 2 protocol information
|
|
Layer3Protocol : DWORD; // User information layer 3 protocol
|
|
Layer3Mode : Byte;
|
|
Layer3DefaultPacketSize : Byte;
|
|
Layer3PacketWindowSize : Byte;
|
|
Layer3UserSpecifiedProtocol : DWORD; // User specified layer 3 protocol information
|
|
Layer3IPI : DWORD; // ISO/IEC TR 9577 Initial Protocol Identifier
|
|
SnapID : Array[0..4] of Byte; // SNAP ID consisting of OUI and PID
|
|
end;
|
|
{$EXTERNALSYM ATM_CALLED_PARTY_NUMBER_IE}
|
|
ATM_CALLED_PARTY_NUMBER_IE = ATM_ADDRESS;
|
|
{$EXTERNALSYM ATM_CALLED_PARTY_SUBADDRESS_IE}
|
|
ATM_CALLED_PARTY_SUBADDRESS_IE = ATM_ADDRESS;
|
|
|
|
// values used for the Presentation_Indication field in struct ATM_CALLING_PARTY_NUMBER_IE
|
|
const
|
|
{$EXTERNALSYM PI_ALLOWED}
|
|
PI_ALLOWED = $00;
|
|
{$EXTERNALSYM PI_RESTRICTED}
|
|
PI_RESTRICTED = $40;
|
|
{$EXTERNALSYM PI_NUMBER_NOT_AVAILABLE}
|
|
PI_NUMBER_NOT_AVAILABLE = $80;
|
|
|
|
// values used for the Screening_Indicator field in struct ATM_CALLING_PARTY_NUMBER_IE
|
|
{$EXTERNALSYM SI_USER_NOT_SCREENED}
|
|
SI_USER_NOT_SCREENED = $00;
|
|
{$EXTERNALSYM SI_USER_PASSED}
|
|
SI_USER_PASSED = $01;
|
|
{$EXTERNALSYM SI_USER_FAILED}
|
|
SI_USER_FAILED = $02;
|
|
{$EXTERNALSYM SI_NETWORK}
|
|
SI_NETWORK = $03;
|
|
|
|
type
|
|
{$EXTERNALSYM ATM_CALLING_PARTY_NUMBER_IE}
|
|
ATM_CALLING_PARTY_NUMBER_IE = record
|
|
ATM_Number : ATM_ADDRESS;
|
|
Presentation_Indication : Byte;
|
|
Screening_Indicator : Byte;
|
|
end;
|
|
{$EXTERNALSYM ATM_CALLING_PARTY_SUBADDRESS_IE}
|
|
ATM_CALLING_PARTY_SUBADDRESS_IE = ATM_ADDRESS;
|
|
|
|
// values used for the Location field in struct ATM_CAUSE_IE
|
|
const
|
|
{$EXTERNALSYM CAUSE_LOC_USER}
|
|
CAUSE_LOC_USER = $00;
|
|
{$EXTERNALSYM CAUSE_LOC_PRIVATE_LOCAL}
|
|
CAUSE_LOC_PRIVATE_LOCAL = $01;
|
|
{$EXTERNALSYM CAUSE_LOC_PUBLIC_LOCAL}
|
|
CAUSE_LOC_PUBLIC_LOCAL = $02;
|
|
{$EXTERNALSYM CAUSE_LOC_TRANSIT_NETWORK}
|
|
CAUSE_LOC_TRANSIT_NETWORK = $03;
|
|
{$EXTERNALSYM CAUSE_LOC_PUBLIC_REMOTE}
|
|
CAUSE_LOC_PUBLIC_REMOTE = $04;
|
|
{$EXTERNALSYM CAUSE_LOC_PRIVATE_REMOTE}
|
|
CAUSE_LOC_PRIVATE_REMOTE = $05;
|
|
{$EXTERNALSYM CAUSE_LOC_INTERNATIONAL_NETWORK}
|
|
CAUSE_LOC_INTERNATIONAL_NETWORK = $06;
|
|
{$EXTERNALSYM CAUSE_LOC_BEYOND_INTERWORKING}
|
|
CAUSE_LOC_BEYOND_INTERWORKING = $0A;
|
|
|
|
// values used for the Cause field in struct ATM_CAUSE_IE
|
|
{$EXTERNALSYM CAUSE_UNALLOCATED_NUMBER}
|
|
CAUSE_UNALLOCATED_NUMBER = $01;
|
|
{$EXTERNALSYM CAUSE_NO_ROUTE_TO_TRANSIT_NETWORK}
|
|
CAUSE_NO_ROUTE_TO_TRANSIT_NETWORK = $02;
|
|
{$EXTERNALSYM CAUSE_NO_ROUTE_TO_DESTINATION}
|
|
CAUSE_NO_ROUTE_TO_DESTINATION = $03;
|
|
{$EXTERNALSYM CAUSE_VPI_VCI_UNACCEPTABLE}
|
|
CAUSE_VPI_VCI_UNACCEPTABLE = $0A;
|
|
{$EXTERNALSYM CAUSE_NORMAL_CALL_CLEARING}
|
|
CAUSE_NORMAL_CALL_CLEARING = $10;
|
|
{$EXTERNALSYM CAUSE_USER_BUSY}
|
|
CAUSE_USER_BUSY = $11;
|
|
{$EXTERNALSYM CAUSE_NO_USER_RESPONDING}
|
|
CAUSE_NO_USER_RESPONDING = $12;
|
|
{$EXTERNALSYM CAUSE_CALL_REJECTED}
|
|
CAUSE_CALL_REJECTED = $15;
|
|
{$EXTERNALSYM CAUSE_NUMBER_CHANGED}
|
|
CAUSE_NUMBER_CHANGED = $16;
|
|
{$EXTERNALSYM CAUSE_USER_REJECTS_CLIR}
|
|
CAUSE_USER_REJECTS_CLIR = $17;
|
|
{$EXTERNALSYM CAUSE_DESTINATION_OUT_OF_ORDER}
|
|
CAUSE_DESTINATION_OUT_OF_ORDER = $1B;
|
|
{$EXTERNALSYM CAUSE_INVALID_NUMBER_FORMAT}
|
|
CAUSE_INVALID_NUMBER_FORMAT = $1C;
|
|
{$EXTERNALSYM CAUSE_STATUS_ENQUIRY_RESPONSE}
|
|
CAUSE_STATUS_ENQUIRY_RESPONSE = $1E;
|
|
{$EXTERNALSYM CAUSE_NORMAL_UNSPECIFIED}
|
|
CAUSE_NORMAL_UNSPECIFIED = $1F;
|
|
{$EXTERNALSYM CAUSE_VPI_VCI_UNAVAILABLE}
|
|
CAUSE_VPI_VCI_UNAVAILABLE = $23;
|
|
{$EXTERNALSYM CAUSE_NETWORK_OUT_OF_ORDER}
|
|
CAUSE_NETWORK_OUT_OF_ORDER = $26;
|
|
{$EXTERNALSYM CAUSE_TEMPORARY_FAILURE}
|
|
CAUSE_TEMPORARY_FAILURE = $29;
|
|
{$EXTERNALSYM CAUSE_ACCESS_INFORMAION_DISCARDED}
|
|
CAUSE_ACCESS_INFORMAION_DISCARDED = $2B;
|
|
{$EXTERNALSYM CAUSE_NO_VPI_VCI_AVAILABLE}
|
|
CAUSE_NO_VPI_VCI_AVAILABLE = $2D;
|
|
{$EXTERNALSYM CAUSE_RESOURCE_UNAVAILABLE}
|
|
CAUSE_RESOURCE_UNAVAILABLE = $2F;
|
|
{$EXTERNALSYM CAUSE_QOS_UNAVAILABLE}
|
|
CAUSE_QOS_UNAVAILABLE = $31;
|
|
{$EXTERNALSYM CAUSE_USER_CELL_RATE_UNAVAILABLE}
|
|
CAUSE_USER_CELL_RATE_UNAVAILABLE = $33;
|
|
{$EXTERNALSYM CAUSE_BEARER_CAPABILITY_UNAUTHORIZED}
|
|
CAUSE_BEARER_CAPABILITY_UNAUTHORIZED = $39;
|
|
{$EXTERNALSYM CAUSE_BEARER_CAPABILITY_UNAVAILABLE}
|
|
CAUSE_BEARER_CAPABILITY_UNAVAILABLE = $3A;
|
|
{$EXTERNALSYM CAUSE_OPTION_UNAVAILABLE}
|
|
CAUSE_OPTION_UNAVAILABLE = $3F;
|
|
{$EXTERNALSYM CAUSE_BEARER_CAPABILITY_UNIMPLEMENTED}
|
|
CAUSE_BEARER_CAPABILITY_UNIMPLEMENTED = $41;
|
|
{$EXTERNALSYM CAUSE_UNSUPPORTED_TRAFFIC_PARAMETERS}
|
|
CAUSE_UNSUPPORTED_TRAFFIC_PARAMETERS = $49;
|
|
{$EXTERNALSYM CAUSE_INVALID_CALL_REFERENCE}
|
|
CAUSE_INVALID_CALL_REFERENCE = $51;
|
|
{$EXTERNALSYM CAUSE_CHANNEL_NONEXISTENT}
|
|
CAUSE_CHANNEL_NONEXISTENT = $52;
|
|
{$EXTERNALSYM CAUSE_INCOMPATIBLE_DESTINATION}
|
|
CAUSE_INCOMPATIBLE_DESTINATION = $58;
|
|
{$EXTERNALSYM CAUSE_INVALID_ENDPOINT_REFERENCE}
|
|
CAUSE_INVALID_ENDPOINT_REFERENCE = $59;
|
|
{$EXTERNALSYM CAUSE_INVALID_TRANSIT_NETWORK_SELECTION}
|
|
CAUSE_INVALID_TRANSIT_NETWORK_SELECTION = $5B;
|
|
{$EXTERNALSYM CAUSE_TOO_MANY_PENDING_ADD_PARTY}
|
|
CAUSE_TOO_MANY_PENDING_ADD_PARTY = $5C;
|
|
{$EXTERNALSYM CAUSE_AAL_PARAMETERS_UNSUPPORTED}
|
|
CAUSE_AAL_PARAMETERS_UNSUPPORTED = $5D;
|
|
{$EXTERNALSYM CAUSE_MANDATORY_IE_MISSING}
|
|
CAUSE_MANDATORY_IE_MISSING = $60;
|
|
{$EXTERNALSYM CAUSE_UNIMPLEMENTED_MESSAGE_TYPE}
|
|
CAUSE_UNIMPLEMENTED_MESSAGE_TYPE = $61;
|
|
{$EXTERNALSYM CAUSE_UNIMPLEMENTED_IE}
|
|
CAUSE_UNIMPLEMENTED_IE = $63;
|
|
{$EXTERNALSYM CAUSE_INVALID_IE_CONTENTS}
|
|
CAUSE_INVALID_IE_CONTENTS = $64;
|
|
{$EXTERNALSYM CAUSE_INVALID_STATE_FOR_MESSAGE}
|
|
CAUSE_INVALID_STATE_FOR_MESSAGE = $65;
|
|
{$EXTERNALSYM CAUSE_RECOVERY_ON_TIMEOUT}
|
|
CAUSE_RECOVERY_ON_TIMEOUT = $66;
|
|
{$EXTERNALSYM CAUSE_INCORRECT_MESSAGE_LENGTH}
|
|
CAUSE_INCORRECT_MESSAGE_LENGTH = $68;
|
|
{$EXTERNALSYM CAUSE_PROTOCOL_ERROR}
|
|
CAUSE_PROTOCOL_ERROR = $6F;
|
|
|
|
// values used for the Condition portion of the Diagnostics field
|
|
// in struct ATM_CAUSE_IE, for certain Cause values
|
|
{$EXTERNALSYM CAUSE_COND_UNKNOWN}
|
|
CAUSE_COND_UNKNOWN = $00;
|
|
{$EXTERNALSYM CAUSE_COND_PERMANENT}
|
|
CAUSE_COND_PERMANENT = $01;
|
|
{$EXTERNALSYM CAUSE_COND_TRANSIENT}
|
|
CAUSE_COND_TRANSIENT = $02;
|
|
|
|
// values used for the Rejection Reason portion of the Diagnostics field
|
|
// in struct ATM_CAUSE_IE, for certain Cause values
|
|
{$EXTERNALSYM CAUSE_REASON_USER}
|
|
CAUSE_REASON_USER = $00;
|
|
{$EXTERNALSYM CAUSE_REASON_IE_MISSING}
|
|
CAUSE_REASON_IE_MISSING = $04;
|
|
{$EXTERNALSYM CAUSE_REASON_IE_INSUFFICIENT}
|
|
CAUSE_REASON_IE_INSUFFICIENT = $08;
|
|
|
|
// values used for the P-U flag of the Diagnostics field
|
|
// in struct ATM_CAUSE_IE, for certain Cause values
|
|
{$EXTERNALSYM CAUSE_PU_PROVIDER}
|
|
CAUSE_PU_PROVIDER = $00;
|
|
{$EXTERNALSYM CAUSE_PU_USER}
|
|
CAUSE_PU_USER = $08;
|
|
|
|
// values used for the N-A flag of the Diagnostics field
|
|
// in struct ATM_CAUSE_IE, for certain Cause values
|
|
{$EXTERNALSYM CAUSE_NA_NORMAL}
|
|
CAUSE_NA_NORMAL = $00;
|
|
{$EXTERNALSYM CAUSE_NA_ABNORMAL}
|
|
CAUSE_NA_ABNORMAL = $04;
|
|
|
|
type
|
|
{$EXTERNALSYM ATM_CAUSE_IE}
|
|
ATM_CAUSE_IE = record
|
|
Location : Byte;
|
|
Cause : Byte;
|
|
DiagnosticsLength : Byte;
|
|
Diagnostics : Array[0..3] of Byte;
|
|
end;
|
|
|
|
// values used for the QOSClassForward and QOSClassBackward
|
|
// field in struct ATM_QOS_CLASS_IE
|
|
const
|
|
{$EXTERNALSYM QOS_CLASS0}
|
|
QOS_CLASS0 = $00;
|
|
{$EXTERNALSYM QOS_CLASS1}
|
|
QOS_CLASS1 = $01;
|
|
{$EXTERNALSYM QOS_CLASS2}
|
|
QOS_CLASS2 = $02;
|
|
{$EXTERNALSYM QOS_CLASS3}
|
|
QOS_CLASS3 = $03;
|
|
{$EXTERNALSYM QOS_CLASS4}
|
|
QOS_CLASS4 = $04;
|
|
|
|
type
|
|
{$EXTERNALSYM ATM_QOS_CLASS_IE}
|
|
ATM_QOS_CLASS_IE = record
|
|
QOSClassForward : Byte;
|
|
QOSClassBackward : Byte;
|
|
end;
|
|
|
|
// values used for the TypeOfNetworkId field in struct ATM_TRANSIT_NETWORK_SELECTION_IE
|
|
const
|
|
{$EXTERNALSYM TNS_TYPE_NATIONAL}
|
|
TNS_TYPE_NATIONAL = $40;
|
|
|
|
// values used for the NetworkIdPlan field in struct ATM_TRANSIT_NETWORK_SELECTION_IE
|
|
{$EXTERNALSYM TNS_PLAN_CARRIER_ID_CODE}
|
|
TNS_PLAN_CARRIER_ID_CODE = $01;
|
|
|
|
type
|
|
{$EXTERNALSYM ATM_TRANSIT_NETWORK_SELECTION_IE}
|
|
ATM_TRANSIT_NETWORK_SELECTION_IE = record
|
|
TypeOfNetworkId : Byte;
|
|
NetworkIdPlan : Byte;
|
|
NetworkIdLength : Byte;
|
|
NetworkId : Array[0..0] of Byte;
|
|
end;
|
|
|
|
// ATM specific Ioctl codes
|
|
const
|
|
{$EXTERNALSYM SIO_GET_NUMBER_OF_ATM_DEVICES}
|
|
SIO_GET_NUMBER_OF_ATM_DEVICES = $50160001;
|
|
{$EXTERNALSYM SIO_GET_ATM_ADDRESS}
|
|
SIO_GET_ATM_ADDRESS = $d0160002;
|
|
{$EXTERNALSYM SIO_ASSOCIATE_PVC}
|
|
SIO_ASSOCIATE_PVC = $90160003;
|
|
{$EXTERNALSYM SIO_GET_ATM_CONNECTION_ID}
|
|
SIO_GET_ATM_CONNECTION_ID = $50160004;
|
|
|
|
// ATM Connection Identifier
|
|
type
|
|
{$EXTERNALSYM ATM_CONNECTION_ID}
|
|
ATM_CONNECTION_ID = record
|
|
DeviceNumber : DWORD;
|
|
VPI : DWORD;
|
|
VCI : DWORD;
|
|
end;
|
|
|
|
// Input buffer format for SIO_ASSOCIATE_PVC
|
|
{$EXTERNALSYM ATM_PVC_PARAMS}
|
|
ATM_PVC_PARAMS = record
|
|
PvcConnectionId : ATM_CONNECTION_ID;
|
|
PvcQos : QOS;
|
|
end;
|
|
|
|
{$NODEFINE InitializeWinSock}
|
|
procedure InitializeWinSock;
|
|
{$NODEFINE UninitializeWinSock}
|
|
procedure UninitializeWinSock;
|
|
function Winsock2Loaded: Boolean;
|
|
function WinsockHandle : THandle;
|
|
|
|
//JPM
|
|
{
|
|
I made these symbols up so to prevent range check warnings in FreePascal.
|
|
SizeOf is a SmallInt when an expression is evaluated at run-time. This
|
|
run-time evaluation makes no sense because the compiler knows these when compiling
|
|
so it should give us the numbers.
|
|
|
|
}
|
|
const
|
|
{$EXTERNALSYM SIZE_WSACMSGHDR}
|
|
SIZE_WSACMSGHDR = DWORD(SizeOf(WSACMSGHDR));
|
|
{$EXTERNALSYM SIZE_FARPROC}
|
|
SIZE_FARPROC = DWORD(SizeOf(FARPROC));
|
|
{$EXTERNALSYM MAX_NATURAL_ALIGNMENT_SUB_1}
|
|
MAX_NATURAL_ALIGNMENT_SUB_1 = DWORD(MAX_NATURAL_ALIGNMENT - 1);
|
|
{$EXTERNALSYM SIZE_IP_MSFILTER}
|
|
SIZE_IP_MSFILTER = DWORD(SizeOf(ip_msfilter));
|
|
{$EXTERNALSYM SIZE_TINADDR}
|
|
SIZE_TINADDR = DWORD(SizeOf(TInAddr));
|
|
{$EXTERNALSYM SIZE_TIN6ADDR}
|
|
SIZE_TIN6ADDR = DWORD(SizeOf(TIn6Addr));
|
|
{$EXTERNALSYM SIZE_TSOCKADDRIN}
|
|
SIZE_TSOCKADDRIN = DWORD(SizeOf(TSockAddrIn));
|
|
{$EXTERNALSYM SIZE_TSOCKADDRIN6}
|
|
SIZE_TSOCKADDRIN6 = DWORD(SizeOf(TSockAddrIn6));
|
|
{$EXTERNALSYM SIZE_GROUP_FILTER}
|
|
SIZE_GROUP_FILTER = DWORD(SizeOf(GROUP_FILTER));
|
|
{$EXTERNALSYM SIZE_TADDRINFO}
|
|
SIZE_TADDRINFO = DWORD(SizeOf(TAddrInfo));
|
|
{$EXTERNALSYM SIZE_SOCKADDR_STORAGE}
|
|
SIZE_SOCKADDR_STORAGE = DWORD(sizeof(SOCKADDR_STORAGE));
|
|
{$IFNDEF WINCE}
|
|
{$EXTERNALSYM SIZE_TWSAMSG}
|
|
SIZE_TWSAMSG = DWORD(SizeOf(TWSAMSG));
|
|
{$ENDIF}
|
|
{$EXTERNALSYM SIZE_GUID}
|
|
SIZE_GUID = DWORD(SizeOf(TGuid));
|
|
{$EXTERNALSYM SIZE_INTEGER}
|
|
SIZE_INTEGER = DWORD(SizeOf(Integer));
|
|
|
|
//=============================================================
|
|
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Module Name:
|
|
//
|
|
// mstcpip.h
|
|
//
|
|
// Abstract:
|
|
//
|
|
// This module contains Microsoft-specific extensions to the core
|
|
// Winsock definitions.
|
|
//
|
|
// Environment:
|
|
//
|
|
// user mode or kernel mode
|
|
|
|
type
|
|
{$EXTERNALSYM TRANSPORT_SETTING_ID}
|
|
TRANSPORT_SETTING_ID = record
|
|
Guid : TGUID;
|
|
end;
|
|
{$EXTERNALSYM PTRANSPORT_SETTING_ID}
|
|
PTRANSPORT_SETTING_ID = ^TRANSPORT_SETTING_ID;
|
|
{$EXTERNALSYM _tcp_keepalive}
|
|
_tcp_keepalive = record
|
|
onoff: u_long;
|
|
keepalivetime: u_long;
|
|
keepaliveinterval: u_long;
|
|
end;
|
|
{$EXTERNALSYM TCP_INITIAL_RTO_PARAMETERS}
|
|
TCP_INITIAL_RTO_PARAMETERS = record
|
|
//
|
|
// Supplies the initial RTT in milliseconds.
|
|
//
|
|
Rtt : USHORT;
|
|
|
|
//
|
|
// Supplies the number of retransmissions attempted before the connection
|
|
// setup fails.
|
|
//
|
|
|
|
MaxSynRetransmissions : UCHAR;
|
|
end;
|
|
{$EXTERNALSYM PTCP_INITIAL_RTO_PARAMETERS}
|
|
PTCP_INITIAL_RTO_PARAMETERS = ^TCP_INITIAL_RTO_PARAMETERS;
|
|
{$EXTERNALSYM _INET_PORT_RANGE}
|
|
_INET_PORT_RANGE = record
|
|
StartPort : USHORT;
|
|
NumberOfPorts : USHORT;
|
|
end;
|
|
{$EXTERNALSYM INET_PORT_RANGE}
|
|
INET_PORT_RANGE = _INET_PORT_RANGE;
|
|
{$EXTERNALSYM PINET_PORT_RANGE}
|
|
PINET_PORT_RANGE = ^INET_PORT_RANGE;
|
|
{$EXTERNALSYM INET_PORT_RESERVATION}
|
|
INET_PORT_RESERVATION = _INET_PORT_RANGE;
|
|
{$EXTERNALSYM PINET_PORT_RESERVATION}
|
|
PINET_PORT_RESERVATION = ^INET_PORT_RESERVATION;
|
|
{$EXTERNALSYM INET_PORT_RESERVATION_TOKEN}
|
|
INET_PORT_RESERVATION_TOKEN = record
|
|
Token : ULONG64;
|
|
end;
|
|
{$EXTERNALSYM PINET_PORT_RESERVATION_TOKEN}
|
|
PINET_PORT_RESERVATION_TOKEN = ^INET_PORT_RESERVATION_TOKEN;
|
|
{$EXTERNALSYM INET_PORT_RESERVATION_INSTANCE}
|
|
INET_PORT_RESERVATION_INSTANCE = record
|
|
Reservation : INET_PORT_RESERVATION;
|
|
Token : INET_PORT_RESERVATION_TOKEN;
|
|
end;
|
|
{$EXTERNALSYM PINET_PORT_RESERVATION_INSTANCE}
|
|
PINET_PORT_RESERVATION_INSTANCE = ^INET_PORT_RESERVATION_INSTANCE;
|
|
|
|
{$EXTERNALSYM INET_PORT_RESERVATION_INFORMATION}
|
|
INET_PORT_RESERVATION_INFORMATION = record
|
|
AssignmentCount : ULONG;
|
|
OwningPid : ULONG;
|
|
end;
|
|
{$EXTERNALSYM PINET_PORT_RESERVATION_INFORMATION}
|
|
PINET_PORT_RESERVATION_INFORMATION = ^INET_PORT_RESERVATION_INFORMATION;
|
|
{$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS}
|
|
{$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_INVALID}
|
|
{$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_SOFTWARE_SLOT_ALLOCATED}
|
|
{$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_HARDWARE_SLOT_ALLOCATED}
|
|
{$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_POLICY_ERROR}
|
|
{$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR}
|
|
{$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_TRANSPORT_DISCONNECTED}
|
|
{$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_SERVICE_UNAVAILABLE}
|
|
CONTROL_CHANNEL_TRIGGER_STATUS = (
|
|
CONTROL_CHANNEL_TRIGGER_STATUS_INVALID,
|
|
CONTROL_CHANNEL_TRIGGER_STATUS_SOFTWARE_SLOT_ALLOCATED,
|
|
CONTROL_CHANNEL_TRIGGER_STATUS_HARDWARE_SLOT_ALLOCATED,
|
|
CONTROL_CHANNEL_TRIGGER_STATUS_POLICY_ERROR,
|
|
CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR,
|
|
CONTROL_CHANNEL_TRIGGER_STATUS_TRANSPORT_DISCONNECTED,
|
|
CONTROL_CHANNEL_TRIGGER_STATUS_SERVICE_UNAVAILABLE);
|
|
{$EXTERNALSYM PCONTROL_CHANNEL_TRIGGER_STATUS}
|
|
PCONTROL_CHANNEL_TRIGGER_STATUS = ^CONTROL_CHANNEL_TRIGGER_STATUS;
|
|
{$EXTERNALSYM REAL_TIME_NOTIFICATION_SETTING_INPUT}
|
|
REAL_TIME_NOTIFICATION_SETTING_INPUT = record
|
|
TransportSettingId : TRANSPORT_SETTING_ID;
|
|
BrokerEventGuid : TGUID;
|
|
end;
|
|
{$EXTERNALSYM PREAL_TIME_NOTIFICATION_SETTING_INPUT}
|
|
PREAL_TIME_NOTIFICATION_SETTING_INPUT = ^REAL_TIME_NOTIFICATION_SETTING_INPUT;
|
|
{$EXTERNALSYM REAL_TIME_NOTIFICATION_SETTING_OUTPUT}
|
|
REAL_TIME_NOTIFICATION_SETTING_OUTPUT = record
|
|
ChannelStatus : CONTROL_CHANNEL_TRIGGER_STATUS;
|
|
end;
|
|
{$EXTERNALSYM PREAL_TIME_NOTIFICATION_SETTING_OUTPUT}
|
|
PREAL_TIME_NOTIFICATION_SETTING_OUTPUT = ^REAL_TIME_NOTIFICATION_SETTING_OUTPUT;
|
|
{$EXTERNALSYM RCVALL_VALUE}
|
|
{$EXTERNALSYM RCVALL_OFF}
|
|
{$EXTERNALSYM RCVALL_ON}
|
|
{$EXTERNALSYM RCVALL_SOCKETLEVELONLY}
|
|
{$EXTERNALSYM RCVALL_IPLEVEL}
|
|
RCVALL_VALUE = (
|
|
RCVALL_OFF,
|
|
RCVALL_ON,
|
|
RCVALL_SOCKETLEVELONLY,
|
|
RCVALL_IPLEVEL
|
|
);
|
|
{$EXTERNALSYM PRCVALL_VALUE}
|
|
PRCVALL_VALUE = ^RCVALL_VALUE;
|
|
{$EXTERNALSYM RCVALL_IF}
|
|
RCVALL_IF = record
|
|
Mode : RCVALL_VALUE;
|
|
_Interface : ULONG;
|
|
end;
|
|
{$EXTERNALSYM PRCVALL_IF}
|
|
PRCVALL_IF = ^RCVALL_IF;
|
|
{$EXTERNALSYM SOCKET_SECURITY_QUERY_INFO_IPSEC2}
|
|
SOCKET_SECURITY_QUERY_INFO_IPSEC2 = record
|
|
SecurityProtocol : SOCKET_SECURITY_PROTOCOL;
|
|
Flags : ULONG;
|
|
PeerApplicationAccessTokenHandle : UINT64;
|
|
PeerMachineAccessTokenHandle : UINT64;
|
|
MmSaId : UINT64;
|
|
QmSaId : UINT64;
|
|
NegotiationWinerr : UINT32;
|
|
SaLookupContext : TGuid;
|
|
end;
|
|
{$EXTERNALSYM PSOCKET_SECURITY_QUERY_INFO_IPSEC2}
|
|
PSOCKET_SECURITY_QUERY_INFO_IPSEC2 = ^SOCKET_SECURITY_QUERY_INFO_IPSEC2;
|
|
{$EXTERNALSYM RSS_SCALABILITY_INFO}
|
|
RSS_SCALABILITY_INFO = record
|
|
RssEnabled : BOOL;
|
|
end;
|
|
{$EXTERNALSYM PRSS_SCALABILITY_INFO}
|
|
PRSS_SCALABILITY_INFO = ^RSS_SCALABILITY_INFO;
|
|
|
|
const
|
|
//
|
|
// Argument structures for SIO_QUERY_TRANSPORT_SETTING and
|
|
// SIO_QUERY_TRANSPORT_SETTING.
|
|
//
|
|
|
|
{$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_MAX}
|
|
CONTROL_CHANNEL_TRIGGER_STATUS_MAX = CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR;
|
|
|
|
//
|
|
// New WSAIoctl Options
|
|
//
|
|
{$EXTERNALSYM SIO_RCVALL}
|
|
SIO_RCVALL = (IOC_IN or IOC_VENDOR or 1);
|
|
{$EXTERNALSYM SIO_RCVALL_MCAST}
|
|
SIO_RCVALL_MCAST = (IOC_IN or IOC_VENDOR or 2);
|
|
{$EXTERNALSYM SIO_RCVALL_IGMPMCAST}
|
|
SIO_RCVALL_IGMPMCAST = (IOC_IN or IOC_VENDOR or 3);
|
|
{$EXTERNALSYM SIO_KEEPALIVE_VALS}
|
|
SIO_KEEPALIVE_VALS = (IOC_IN or IOC_VENDOR or 4);
|
|
{$EXTERNALSYM SIO_ABSORB_RTRALERT}
|
|
SIO_ABSORB_RTRALERT = (IOC_IN or IOC_VENDOR or 5);
|
|
{$EXTERNALSYM SIO_UCAST_IF}
|
|
SIO_UCAST_IF = (IOC_IN or IOC_VENDOR or 6);
|
|
{$EXTERNALSYM SIO_LIMIT_BROADCASTS}
|
|
SIO_LIMIT_BROADCASTS = (IOC_IN or IOC_VENDOR or 7);
|
|
{$EXTERNALSYM SIO_INDEX_BIND}
|
|
SIO_INDEX_BIND = (IOC_IN or IOC_VENDOR or 8);
|
|
{$EXTERNALSYM SIO_INDEX_MCASTIF}
|
|
SIO_INDEX_MCASTIF = (IOC_IN or IOC_VENDOR or 9);
|
|
{$EXTERNALSYM SIO_INDEX_ADD_MCAST}
|
|
SIO_INDEX_ADD_MCAST = (IOC_IN or IOC_VENDOR or 10);
|
|
{$EXTERNALSYM SIO_INDEX_DEL_MCAST}
|
|
SIO_INDEX_DEL_MCAST = (IOC_IN or IOC_VENDOR or 11);
|
|
// SIO_UDP_CONNRESET = _WSAIOW(IOC_VENDOR,12)
|
|
{$EXTERNALSYM SIO_RCVALL_MCAST_IF}
|
|
SIO_RCVALL_MCAST_IF = (IOC_IN or IOC_VENDOR or 13);
|
|
{$EXTERNALSYM SIO_RCVALL_IF}
|
|
SIO_RCVALL_IF = (IOC_IN or IOC_VENDOR or 14);
|
|
{$EXTERNALSYM SIO_LOOPBACK_FAST_PATH}
|
|
SIO_LOOPBACK_FAST_PATH = (IOC_IN or IOC_VENDOR or 16);
|
|
{$EXTERNALSYM SIO_TCP_INITIAL_RTO}
|
|
SIO_TCP_INITIAL_RTO = (IOC_IN or IOC_VENDOR or 17);
|
|
{$EXTERNALSYM SIO_APPLY_TRANSPORT_SETTING}
|
|
SIO_APPLY_TRANSPORT_SETTING = (IOC_IN or IOC_VENDOR or 19);
|
|
{$EXTERNALSYM SIO_QUERY_TRANSPORT_SETTING}
|
|
SIO_QUERY_TRANSPORT_SETTING = (IOC_IN or IOC_VENDOR or 20);
|
|
//
|
|
// Values for use with SIO_RCVALL* options
|
|
//
|
|
{$EXTERNALSYM RCVALL_MAX}
|
|
RCVALL_MAX = RCVALL_IPLEVEL;
|
|
//
|
|
// Parameters to configure the initial RTT.
|
|
//
|
|
{$EXTERNALSYM TCP_INITIAL_RTO_UNSPECIFIED_RTT}
|
|
TCP_INITIAL_RTO_UNSPECIFIED_RTT = USHORT(-1);
|
|
{$EXTERNALSYM TCP_INITIAL_RTO_UNSPECIFIED_MAX_SYN_RETRANSMISSIONS}
|
|
TCP_INITIAL_RTO_UNSPECIFIED_MAX_SYN_RETRANSMISSIONS = UCHAR(-1);
|
|
{$EXTERNALSYM TCP_INITIAL_RTO_DEFAULT_RTT}
|
|
TCP_INITIAL_RTO_DEFAULT_RTT = (0);
|
|
{$EXTERNALSYM TCP_INITIAL_RTO_DEFAULT_MAX_SYN_RETRANSMISSIONS}
|
|
TCP_INITIAL_RTO_DEFAULT_MAX_SYN_RETRANSMISSIONS = (0);
|
|
|
|
//
|
|
// TCP/UDP port management definitions.
|
|
//
|
|
{$EXTERNALSYM SIO_ACQUIRE_PORT_RESERVATION}
|
|
SIO_ACQUIRE_PORT_RESERVATION = (IOC_IN or IOC_VENDOR or 100);
|
|
{$EXTERNALSYM SIO_RELEASE_PORT_RESERVATION}
|
|
SIO_RELEASE_PORT_RESERVATION = (IOC_IN or IOC_VENDOR or 101);
|
|
{$EXTERNALSYM SIO_ASSOCIATE_PORT_RESERVATION}
|
|
SIO_ASSOCIATE_PORT_RESERVATION = (IOC_IN or IOC_VENDOR or 102);
|
|
|
|
{$EXTERNALSYM INVALID_PORT_RESERVATION_TOKEN}
|
|
INVALID_PORT_RESERVATION_TOKEN = ULONG64(0);
|
|
|
|
//
|
|
// Secure socket API type definitions.
|
|
//
|
|
{$EXTERNALSYM SIO_SET_SECURITY}
|
|
SIO_SET_SECURITY = (IOC_IN or IOC_VENDOR or 200);
|
|
{$EXTERNALSYM SIO_QUERY_SECURITY}
|
|
SIO_QUERY_SECURITY = (IOC_INOUT or IOC_VENDOR or 201);
|
|
{$EXTERNALSYM SIO_SET_PEER_TARGET_NAME}
|
|
SIO_SET_PEER_TARGET_NAME = (IOC_IN or IOC_VENDOR or 202);
|
|
{$EXTERNALSYM SIO_DELETE_PEER_TARGET_NAME}
|
|
SIO_DELETE_PEER_TARGET_NAME = (IOC_IN or IOC_VENDOR or 203);
|
|
|
|
//
|
|
// WFP Proxy Connection Tracking API type definitions.
|
|
//
|
|
{$EXTERNALSYM SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS}
|
|
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS = (IOC_IN or IOC_VENDOR or 220);
|
|
{$EXTERNALSYM SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT}
|
|
SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT = (IOC_IN or IOC_VENDOR or 221);
|
|
{$EXTERNALSYM SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS}
|
|
SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS = (IOC_IN or IOC_VENDOR or 222);
|
|
|
|
{$EXTERNALSYM SIO_SOCKET_USAGE_NOTIFICATION}
|
|
SIO_SOCKET_USAGE_NOTIFICATION = (IOC_IN or IOC_VENDOR or 204);
|
|
// Flags for generic security settings
|
|
{$EXTERNALSYM SOCKET_SETTINGS_GUARANTEE_ENCRYPTION}
|
|
SOCKET_SETTINGS_GUARANTEE_ENCRYPTION = $1;
|
|
{$EXTERNALSYM SOCKET_SETTINGS_ALLOW_INSECURE}
|
|
SOCKET_SETTINGS_ALLOW_INSECURE = $2;
|
|
|
|
// Flags specific to IPsec security settings.
|
|
// NOTE: these flags must be specified under the
|
|
// SOCKET_SECURITY_SETTINGS_IPSEC->IpsecFlags field.
|
|
{$EXTERNALSYM SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION}
|
|
SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION = $1;
|
|
{$EXTERNALSYM SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION}
|
|
SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION = $2;
|
|
{$EXTERNALSYM SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED}
|
|
SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED = $4;
|
|
{$EXTERNALSYM SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT}
|
|
SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT = $8;
|
|
{$EXTERNALSYM SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE}
|
|
SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE = $1;
|
|
{$EXTERNALSYM SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID}
|
|
SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID = $1;
|
|
{$EXTERNALSYM SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID}
|
|
SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID = $2;
|
|
// Flags corresponding to the security query info
|
|
{$EXTERNALSYM SOCKET_INFO_CONNECTION_SECURED}
|
|
SOCKET_INFO_CONNECTION_SECURED = $1;
|
|
{$EXTERNALSYM SOCKET_INFO_CONNECTION_ENCRYPTED}
|
|
SOCKET_INFO_CONNECTION_ENCRYPTED = $2;
|
|
{$EXTERNALSYM SOCKET_INFO_CONNECTION_IMPERSONATED}
|
|
SOCKET_INFO_CONNECTION_IMPERSONATED = $4;
|
|
//
|
|
// WFP ALE endpoint handle query type definition
|
|
//
|
|
{$EXTERNALSYM SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE}
|
|
SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE = (IOC_OUT or IOC_VENDOR or 205);
|
|
//
|
|
// Scalability type definitions
|
|
//
|
|
{$EXTERNALSYM SIO_QUERY_RSS_SCALABILITY_INFO}
|
|
SIO_QUERY_RSS_SCALABILITY_INFO = (IOC_OUT or IOC_VENDOR or 210);
|
|
// GUID definition for use with Secure Sockets API
|
|
// aec2ef9c-3a4d-4d3e-8842-239942e39a47
|
|
{$EXTERNALSYM SOCKET_DEFAULT2_QM_POLICY}
|
|
SOCKET_DEFAULT2_QM_POLICY : TGuid = (D1:$aec2ef9c;D2:$3a4d;D3:$4d3e;D4:($88,$42,$23,$99,$42,$e3,$9a,$47));
|
|
// GUID definition for use with Real Time Notification setting API.
|
|
// 6b59819a-5cae-492d-a901-2a3c2c50164f
|
|
{$EXTERNALSYM REAL_TIME_NOTIFICATION_CAPABILITY)}
|
|
REAL_TIME_NOTIFICATION_CAPABILITY : TGuid = (D1:$6b59819a;D2:$5cae;D3:$492d;D4:($a9, $01, $2a, $3c, $2c, $50, $16, $4f));
|
|
|
|
//
|
|
// Microsoft-specific IPv4 definitions.
|
|
//
|
|
{$EXTERNALSYM IN4ADDR_ANY}
|
|
IN4ADDR_ANY = INADDR_ANY;
|
|
{$EXTERNALSYM IN4ADDR_LOOPBACK}
|
|
IN4ADDR_LOOPBACK = $0100007f;
|
|
{$EXTERNALSYM IN4ADDR_BROADCAST}
|
|
IN4ADDR_BROADCAST = INADDR_BROADCAST;
|
|
{$EXTERNALSYM IN4ADDR_NONE}
|
|
IN4ADDR_NONE = INADDR_NONE;
|
|
|
|
{$EXTERNALSYM IN4ADDR_ANY_INIT}
|
|
function IN4ADDR_ANY_INIT: TInAddr;
|
|
{$EXTERNALSYM IN4ADDR_LOOPBACK_INIT}
|
|
function IN4ADDR_LOOPBACK_INIT: TInAddr;
|
|
{$EXTERNALSYM IN4ADDR_BROADCAST_INIT}
|
|
function IN4ADDR_BROADCAST_INIT: TInAddr;
|
|
{$EXTERNALSYM IN4ADDR_ALLNODESONLINK_INIT}
|
|
function IN4ADDR_ALLNODESONLINK_INIT: TInAddr;
|
|
{$EXTERNALSYM IN4ADDR_ALLROUTERSONLINK_INIT}
|
|
function IN4ADDR_ALLROUTERSONLINK_INIT: TInAddr;
|
|
{$EXTERNALSYM IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT}
|
|
function IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT: TInAddr;
|
|
{$EXTERNALSYM IN4ADDR_ALLTEREDONODESONLINK_INIT}
|
|
function IN4ADDR_ALLTEREDONODESONLINK_INIT: TInAddr;
|
|
{$EXTERNALSYM IN4ADDR_LINKLOCALPREFIX_INIT}
|
|
function IN4ADDR_LINKLOCALPREFIX_INIT: TInAddr;
|
|
{$EXTERNALSYM IN4ADDR_MULTICASTPREFIX_INIT}
|
|
function IN4ADDR_MULTICASTPREFIX_INIT: TInAddr;
|
|
|
|
const
|
|
{$EXTERNALSYM IN4ADDR_LOOPBACKPREFIX_LENGTH}
|
|
IN4ADDR_LOOPBACKPREFIX_LENGTH = 8;
|
|
{$EXTERNALSYM IN4ADDR_LINKLOCALPREFIX_LENGTH}
|
|
IN4ADDR_LINKLOCALPREFIX_LENGTH = 16;
|
|
{$EXTERNALSYM IN4ADDR_MULTICASTPREFIX_LENGTH}
|
|
IN4ADDR_MULTICASTPREFIX_LENGTH = 4;
|
|
|
|
{$EXTERNALSYM IN6ADDR_LINKLOCALPREFIX_LENGTH}
|
|
IN6ADDR_LINKLOCALPREFIX_LENGTH = 64;
|
|
{$EXTERNALSYM IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH}
|
|
IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH = 104;
|
|
{$EXTERNALSYM IN6ADDR_V4MAPPEDPREFIX_LENGTH}
|
|
IN6ADDR_V4MAPPEDPREFIX_LENGTH = 96;
|
|
{$EXTERNALSYM IN6ADDR_6TO4PREFIX_LENGTH}
|
|
IN6ADDR_6TO4PREFIX_LENGTH = 16;
|
|
{$EXTERNALSYM IN6ADDR_TEREDOPREFIX_LENGTH}
|
|
IN6ADDR_TEREDOPREFIX_LENGTH = 32;
|
|
|
|
|
|
//=============================================================
|
|
implementation
|
|
//=============================================================
|
|
|
|
uses
|
|
IdResourceStrings
|
|
{$IFDEF HAS_AnsiStrings_StrLen}, AnsiStrings{$ENDIF}
|
|
;
|
|
// (c) March 2001, "Alex Konshin"<alexk@mtgroup.ru>
|
|
|
|
var
|
|
hWinSockDll : THandle = 0; // WS2_32.DLL handle
|
|
{$IFNDEF WINCE}
|
|
hMSWSockDll : THandle = 0; // MSWSOCK.DLL handle
|
|
{$ENDIF}
|
|
|
|
function WinsockHandle : THandle;
|
|
begin
|
|
Result := hWinSockDll;
|
|
end;
|
|
|
|
function Winsock2Loaded : Boolean;
|
|
begin
|
|
Result := hWinSockDll <> 0;
|
|
end;
|
|
|
|
procedure InitializeWinSock;
|
|
var
|
|
LData: TWSAData;
|
|
LError: DWORD;
|
|
begin
|
|
if hWinSockDll = 0 then begin
|
|
hWinSockDll := SafeLoadLibrary(WINSOCK2_DLL);
|
|
if hWinSockDll <> 0 then begin
|
|
LError := WSAStartup($202, LData);
|
|
if LError = 0 then begin
|
|
Exit;
|
|
end;
|
|
Windows.FreeLibrary(hWinSockDll);
|
|
hWinSockDll := 0;
|
|
end else begin
|
|
LError := Windows.GetLastError;
|
|
end;
|
|
raise EIdWinsockStubError.Build(LError, RSWinsockLoadError, [WINSOCK2_DLL]);
|
|
end;
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
procedure LoadMSWSock;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if hMSWSockDll = 0 then begin
|
|
hMSWSockDll := SafeLoadLibrary(MSWSOCK_DLL);
|
|
if hMSWSockDll = 0 then begin
|
|
raise EIdWinsockStubError.Build(Windows.GetLastError, RSWinsockLoadError, [MSWSOCK_DLL]);
|
|
end;
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
procedure UninitializeWinSock;
|
|
begin
|
|
{$IFNDEF WINCE}
|
|
if hMSWSockDll <> 0 then
|
|
begin
|
|
FreeLibrary(hMSWSockDll);
|
|
hMSWSockDll := 0;
|
|
end;
|
|
{$ENDIF}
|
|
if hWinSockDll <> 0 then
|
|
begin
|
|
WSACleanup;
|
|
FreeLibrary(hWinSockDll);
|
|
hWinSockDll := 0;
|
|
end;
|
|
end;
|
|
|
|
constructor EIdWinsockStubError.Build(AWin32Error: DWORD; const ATitle: String; AArgs: array of const);
|
|
begin
|
|
FTitle := IndyFormat(ATitle, AArgs);
|
|
FWin32Error := AWin32Error;
|
|
if AWin32Error = 0 then begin
|
|
inherited Create(FTitle);
|
|
end else
|
|
begin
|
|
FWin32ErrorMessage := SysUtils.SysErrorMessage(AWin32Error);
|
|
inherited Create(FTitle + ': ' + FWin32ErrorMessage); {Do not Localize}
|
|
end;
|
|
end;
|
|
|
|
{ IMPORTANT!!!
|
|
|
|
WindowsCE only has a Unicode (WideChar) version of GetProcAddress. We could use
|
|
a version of GetProcAddress in the FreePascal dynlibs unit but that does a
|
|
conversion from ASCII to Unicode which might not be necessary since most calls
|
|
pass a constant anyway.
|
|
}
|
|
function FixupStub(hDll: THandle; const AName:{$IFDEF WINCE}TIdUnicodeString{$ELSE}string{$ENDIF}): Pointer;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if hDll = 0 then begin
|
|
raise EIdWinsockStubError.Build(WSANOTINITIALISED, RSWinsockCallError, [AName]);
|
|
end;
|
|
Result := Windows.GetProcAddress(hDll, {$IFDEF WINCE}PWideChar{$ELSE}PChar{$ENDIF}(AName));
|
|
if Result = nil then begin
|
|
raise EIdWinsockStubError.Build(WSAEINVAL, RSWinsockCallError, [AName]);
|
|
end;
|
|
end;
|
|
|
|
function FixupStubEx(hSocket: TSocket; const AName: string; const AGuid: TGUID): Pointer;
|
|
var
|
|
LBytesSend: DWORD;
|
|
begin
|
|
// RLebeau: in XE4+, PDWORD is NOT defined as ^DWORD, so we have to use a type-cast!
|
|
if WSAIoctl(hSocket, SIO_GET_EXTENSION_FUNCTION_POINTER, @AGuid, DWORD(SIZE_GUID),
|
|
@Result, SIZE_FARPROC, PDWORD(@LBytesSend), nil, nil) <> 0 then
|
|
begin
|
|
raise EIdWinsockStubError.Build(WSAGetLastError, RSWinsockCallError, [AName]);
|
|
end;
|
|
end;
|
|
|
|
function Stub_WSAStartup(const wVersionRequired: word; out WSData: TWSAData): Integer; stdcall;
|
|
begin
|
|
@WSAStartup := FixupStub(hWinSockDll, 'WSAStartup'); {Do not Localize}
|
|
Result := WSAStartup(wVersionRequired, WSData);
|
|
end;
|
|
|
|
function Stub_WSACleanup: Integer; stdcall;
|
|
begin
|
|
@WSACleanup := FixupStub(hWinSockDll, 'WSACleanup'); {Do not Localize}
|
|
Result := WSACleanup;
|
|
end;
|
|
|
|
function Stub_accept(const s: TSocket; AAddr: PSockAddr; addrlen: PInteger): TSocket; stdcall;
|
|
begin
|
|
@accept := FixupStub(hWinSockDll, 'accept'); {Do not Localize}
|
|
Result := accept(s, AAddr, addrlen);
|
|
end;
|
|
|
|
function Stub_bind(const s: TSocket; const name: PSockAddr; const namelen: Integer): Integer; stdcall;
|
|
begin
|
|
@bind := FixupStub(hWinSockDll, 'bind'); {Do not Localize}
|
|
Result := bind(s, name, namelen);
|
|
end;
|
|
|
|
function Stub_closesocket(const s: TSocket): Integer; stdcall;
|
|
begin
|
|
@closesocket := FixupStub(hWinSockDll, 'closesocket'); {Do not Localize}
|
|
Result := closesocket(s);
|
|
end;
|
|
|
|
function Stub_connect(const s: TSocket; const name: PSockAddr; const namelen: Integer): Integer; stdcall;
|
|
begin
|
|
@connect := FixupStub(hWinSockDll, 'connect'); {Do not Localize}
|
|
Result := connect(s, name, namelen);
|
|
end;
|
|
|
|
function Stub_ioctlsocket(const s: TSocket; const cmd: DWORD; var arg: u_long): Integer; stdcall;
|
|
begin
|
|
@ioctlsocket := FixupStub(hWinSockDll, 'ioctlsocket'); {Do not Localize}
|
|
Result := ioctlsocket(s, cmd, arg);
|
|
end;
|
|
|
|
function Stub_getpeername(const s: TSocket; const name: PSockAddr; var namelen: Integer): Integer; stdcall;
|
|
begin
|
|
@getpeername := FixupStub(hWinSockDll, 'getpeername'); {Do not Localize}
|
|
Result := getpeername(s, name, namelen);
|
|
end;
|
|
|
|
function Stub_getsockname(const s: TSocket; const name: PSockAddr; var namelen: Integer): Integer; stdcall;
|
|
begin
|
|
@getsockname := FixupStub(hWinSockDll, 'getsockname'); {Do not Localize}
|
|
Result := getsockname(s, name, namelen);
|
|
end;
|
|
|
|
function Stub_getsockopt(const s: TSocket; const level, optname: Integer; optval: PAnsiChar; var optlen: Integer): Integer; stdcall;
|
|
begin
|
|
@getsockopt := FixupStub(hWinSockDll, 'getsockopt'); {Do not Localize}
|
|
Result := getsockopt(s, level, optname, optval, optlen);
|
|
end;
|
|
|
|
function Stub_htonl(hostlong: u_long): u_long; stdcall;
|
|
begin
|
|
@htonl := FixupStub(hWinSockDll, 'htonl'); {Do not Localize}
|
|
Result := htonl(hostlong);
|
|
end;
|
|
|
|
function Stub_htons(hostshort: u_short): u_short; stdcall;
|
|
begin
|
|
@htons := FixupStub(hWinSockDll, 'htons'); {Do not Localize}
|
|
Result := htons(hostshort);
|
|
end;
|
|
|
|
function Stub_inet_addr(cp: PAnsiChar): u_long; stdcall;
|
|
begin
|
|
@inet_addr := FixupStub(hWinSockDll, 'inet_addr'); {Do not Localize}
|
|
Result := inet_addr(cp);
|
|
end;
|
|
|
|
function Stub_inet_ntoa(inaddr: TInAddr): PAnsiChar; stdcall;
|
|
begin
|
|
@inet_ntoa := FixupStub(hWinSockDll, 'inet_ntoa'); {Do not Localize}
|
|
Result := inet_ntoa(inaddr);
|
|
end;
|
|
|
|
function Stub_listen(const s: TSocket; backlog: Integer): Integer; stdcall;
|
|
begin
|
|
@listen := FixupStub(hWinSockDll, 'listen'); {Do not Localize}
|
|
Result := listen(s, backlog);
|
|
end;
|
|
|
|
function Stub_ntohl(netlong: u_long): u_long; stdcall;
|
|
begin
|
|
@ntohl := FixupStub(hWinSockDll, 'ntohl'); {Do not Localize}
|
|
Result := ntohl(netlong);
|
|
end;
|
|
|
|
function Stub_ntohs(netshort: u_short): u_short; stdcall;
|
|
begin
|
|
@ntohs := FixupStub(hWinSockDll, 'ntohs'); {Do not Localize}
|
|
Result := ntohs(netshort);
|
|
end;
|
|
|
|
function Stub_recv(const s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
|
|
begin
|
|
@recv := FixupStub(hWinSockDll, 'recv'); {Do not Localize}
|
|
Result := recv(s, Buf, len, flags);
|
|
end;
|
|
|
|
function Stub_recvfrom(const s: TSocket; var Buf; len, flags: Integer; from: PSockAddr; fromlen: PInteger): Integer; stdcall;
|
|
begin
|
|
@recvfrom := FixupStub(hWinSockDll, 'recvfrom'); {Do not Localize}
|
|
Result := recvfrom(s, Buf, len, flags, from, fromlen);
|
|
end;
|
|
|
|
function Stub_select(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Integer; stdcall;
|
|
begin
|
|
@select := FixupStub(hWinSockDll, 'select'); {Do not Localize}
|
|
Result := select(nfds, readfds, writefds, exceptfds, timeout);
|
|
end;
|
|
|
|
function Stub_send(const s: TSocket; const Buf; len, flags: Integer): Integer; stdcall;
|
|
begin
|
|
@send := FixupStub(hWinSockDll, 'send'); {Do not Localize}
|
|
Result := send(s, Buf, len, flags);
|
|
end;
|
|
|
|
function Stub_sendto(const s: TSocket; const Buf; const len, flags: Integer; const addrto: PSockAddr; const tolen: Integer): Integer; stdcall;
|
|
begin
|
|
@sendto := FixupStub(hWinSockDll, 'sendto'); {Do not Localize}
|
|
Result := sendto(s, Buf, len, flags, addrto, tolen);
|
|
end;
|
|
|
|
function Stub_setsockopt(const s: TSocket; const level, optname: Integer; optval: PAnsiChar; const optlen: Integer): Integer; stdcall;
|
|
begin
|
|
@setsockopt := FixupStub(hWinSockDll, 'setsockopt'); {Do not Localize}
|
|
Result := setsockopt(s, level, optname, optval, optlen);
|
|
end;
|
|
|
|
function Stub_shutdown(const s: TSocket; const how: Integer): Integer; stdcall;
|
|
begin
|
|
@shutdown := FixupStub(hWinSockDll, 'shutdown'); {Do not Localize}
|
|
Result := shutdown(s, how);
|
|
end;
|
|
|
|
function Stub_socket(const af, istruct, protocol: Integer): TSocket; stdcall;
|
|
begin
|
|
@socket := FixupStub(hWinSockDll, 'socket'); {Do not Localize}
|
|
Result := socket(af, istruct, protocol);
|
|
end;
|
|
|
|
function Stub_gethostbyaddr(AAddr: Pointer; const len, addrtype: Integer): PHostEnt; stdcall;
|
|
begin
|
|
@gethostbyaddr := FixupStub(hWinSockDll, 'gethostbyaddr'); {Do not Localize}
|
|
Result := gethostbyaddr(AAddr, len, addrtype);
|
|
end;
|
|
|
|
function Stub_gethostbyname(name: PAnsiChar): PHostEnt; stdcall;
|
|
begin
|
|
@gethostbyname := FixupStub(hWinSockDll, 'gethostbyname'); {Do not Localize}
|
|
Result := gethostbyname(name);
|
|
end;
|
|
|
|
{$IFDEF WINCE}
|
|
function Stub_sethostname(pName : PAnsiChar; cName : Integer) : Integer; stdcall;
|
|
begin
|
|
@sethostname := FixupStub(hWinSockDll, 'sethostname'); {Do not Localize}
|
|
Result := sethostname(pName, cName);
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function Stub_gethostname(name: PAnsiChar; len: Integer): Integer; stdcall;
|
|
begin
|
|
@gethostname := FixupStub(hWinSockDll, 'gethostname'); {Do not Localize}
|
|
Result := gethostname(name, len);
|
|
end;
|
|
|
|
function Stub_getservbyport(const port: Integer; const proto: PAnsiChar): PServEnt; stdcall;
|
|
begin
|
|
@getservbyport := FixupStub(hWinSockDll, 'getservbyport'); {Do not Localize}
|
|
Result := getservbyport(port, proto);
|
|
end;
|
|
|
|
function Stub_getservbyname(const name, proto: PAnsiChar): PServEnt; stdcall;
|
|
begin
|
|
@getservbyname := FixupStub(hWinSockDll, 'getservbyname'); {Do not Localize}
|
|
Result := getservbyname(name, proto);
|
|
end;
|
|
|
|
function Stub_getprotobynumber(const proto: Integer): PProtoEnt; stdcall;
|
|
begin
|
|
@getprotobynumber := FixupStub(hWinSockDll, 'getprotobynumber'); {Do not Localize}
|
|
Result := getprotobynumber(proto);
|
|
end;
|
|
|
|
function Stub_getprotobyname(const name: PAnsiChar): PProtoEnt; stdcall;
|
|
begin
|
|
@getprotobyname := FixupStub(hWinSockDll, 'getprotobyname'); {Do not Localize}
|
|
Result := getprotobyname(name);
|
|
end;
|
|
|
|
procedure Stub_WSASetLastError(const iError: Integer); stdcall;
|
|
begin
|
|
@WSASetLastError := FixupStub(hWinSockDll, 'WSASetLastError'); {Do not Localize}
|
|
WSASetLastError(iError);
|
|
end;
|
|
|
|
function Stub_WSAGetLastError: Integer; stdcall;
|
|
begin
|
|
@WSAGetLastError := FixupStub(hWinSockDll, 'WSAGetLastError'); {Do not Localize}
|
|
Result := WSAGetLastError;
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
function Stub_WSAIsBlocking: BOOL; stdcall;
|
|
begin
|
|
@WSAIsBlocking := FixupStub(hWinSockDll, 'WSAIsBlocking'); {Do not Localize}
|
|
Result := WSAIsBlocking;
|
|
end;
|
|
|
|
function Stub_WSAUnhookBlockingHook: Integer; stdcall;
|
|
begin
|
|
@WSAUnhookBlockingHook := FixupStub(hWinSockDll, 'WSAUnhookBlockingHook'); {Do not Localize}
|
|
Result := WSAUnhookBlockingHook;
|
|
end;
|
|
|
|
function Stub_WSASetBlockingHook(lpBlockFunc: TFarProc): TFarProc; stdcall;
|
|
begin
|
|
@WSASetBlockingHook := FixupStub(hWinSockDll, 'WSASetBlockingHook'); {Do not Localize}
|
|
Result := WSASetBlockingHook(lpBlockFunc);
|
|
end;
|
|
|
|
function Stub_WSACancelBlockingCall: Integer; stdcall;
|
|
begin
|
|
@WSACancelBlockingCall := FixupStub(hWinSockDll, 'WSACancelBlockingCall'); {Do not Localize}
|
|
Result := WSACancelBlockingCall;
|
|
end;
|
|
|
|
function Stub_WSAAsyncGetServByName(HWindow: HWND; wMsg: u_int; name, proto, buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
begin
|
|
@WSAAsyncGetServByName := FixupStub(hWinSockDll, 'WSAAsyncGetServByName'); {Do not Localize}
|
|
Result := WSAAsyncGetServByName(HWindow, wMsg, name, proto, buf, buflen);
|
|
end;
|
|
|
|
function Stub_WSAAsyncGetServByPort(HWindow: HWND; wMsg, port: u_int; proto, buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
begin
|
|
@WSAAsyncGetServByPort := FixupStub(hWinSockDll, 'WSAAsyncGetServByPort'); {Do not Localize}
|
|
Result := WSAAsyncGetServByPort(HWindow, wMsg, port, proto, buf, buflen);
|
|
end;
|
|
|
|
function Stub_WSAAsyncGetProtoByName(HWindow: HWND; wMsg: u_int; name, buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
begin
|
|
@WSAAsyncGetProtoByName := FixupStub(hWinSockDll, 'WSAAsyncGetProtoByName'); {Do not Localize}
|
|
Result := WSAAsyncGetProtoByName(HWindow, wMsg, name, buf, buflen);
|
|
end;
|
|
|
|
function Stub_WSAAsyncGetProtoByNumber(HWindow: HWND; wMsg: u_int; number: Integer; buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
begin
|
|
@WSAAsyncGetProtoByNumber := FixupStub(hWinSockDll, 'WSAAsyncGetProtoByNumber'); {Do not Localize}
|
|
Result := WSAAsyncGetProtoByNumber(HWindow, wMsg, number, buf, buflen);
|
|
end;
|
|
|
|
function Stub_WSAAsyncGetHostByName(HWindow: HWND; wMsg: u_int; name, buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
begin
|
|
@WSAAsyncGetHostByName := FixupStub(hWinSockDll, 'WSAAsyncGetHostByName'); {Do not Localize}
|
|
Result := WSAAsyncGetHostByName(HWindow, wMsg, name, buf, buflen);
|
|
end;
|
|
|
|
function Stub_WSAAsyncGetHostByAddr(HWindow: HWND; wMsg: u_int; AAddr: PAnsiChar; len, istruct: Integer; buf: PAnsiChar; buflen: Integer): THandle; stdcall;
|
|
begin
|
|
@WSAAsyncGetHostByAddr := FixupStub(hWinSockDll, 'WSAAsyncGetHostByAddr'); {Do not Localize}
|
|
Result := WSAAsyncGetHostByAddr(HWindow, wMsg, AAddr, len, istruct, buf, buflen);
|
|
end;
|
|
|
|
function Stub_WSACancelAsyncRequest(hAsyncTaskHandle: THandle): Integer; stdcall;
|
|
begin
|
|
@WSACancelAsyncRequest := FixupStub(hWinSockDll, 'WSACancelAsyncRequest'); {Do not Localize}
|
|
Result := WSACancelAsyncRequest(hAsyncTaskHandle);
|
|
end;
|
|
|
|
function Stub_WSAAsyncSelect(const s: TSocket; HWindow: HWND; wMsg: u_int; lEvent: Longint): Integer; stdcall;
|
|
begin
|
|
@WSAAsyncSelect := FixupStub(hWinSockDll, 'WSAAsyncSelect'); {Do not Localize}
|
|
Result := WSAAsyncSelect(s, HWindow, wMsg, lEvent);
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function Stub___WSAFDIsSet(const s: TSocket; var FDSet: TFDSet): Bool; stdcall;
|
|
begin
|
|
@__WSAFDIsSet := FixupStub(hWinSockDll, '__WSAFDIsSet'); {Do not Localize}
|
|
Result := __WSAFDIsSet(s, FDSet);
|
|
end;
|
|
|
|
function Stub_WSAAccept(const s: TSocket; AAddr: PSockAddr; addrlen: PInteger; lpfnCondition: LPCONDITIONPROC; const dwCallbackData: DWORD): TSocket; stdcall;
|
|
begin
|
|
@WSAAccept := FixupStub(hWinSockDll, 'WSAAccept'); {Do not Localize}
|
|
Result := WSAAccept(s, AAddr, addrlen, lpfnCondition, dwCallbackData);
|
|
end;
|
|
|
|
function Stub_WSACloseEvent(const hEvent: wsaevent): WordBool; stdcall;
|
|
begin
|
|
@WSACloseEvent := FixupStub(hWinSockDll, 'WSACloseEvent'); {Do not Localize}
|
|
Result := WSACloseEvent(hEvent);
|
|
end;
|
|
|
|
function Stub_WSAConnect(const s: TSocket; const name: PSockAddr; const namelen: Integer; lpCallerData, lpCalleeData: LPWSABUF; lpSQOS, lpGQOS: LPQOS): Integer; stdcall;
|
|
begin
|
|
@WSAConnect := FixupStub(hWinSockDll, 'WSAConnect'); {Do not Localize}
|
|
Result := WSAConnect(s, name, namelen, lpCallerData, lpCalleeData, lpSQOS, lpGQOS);
|
|
end;
|
|
|
|
function Stub_WSACreateEvent: wsaevent; stdcall;
|
|
begin
|
|
@WSACreateEvent := FixupStub(hWinSockDll, 'WSACreateEvent'); {Do not Localize}
|
|
Result := WSACreateEvent;
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
function Stub_WSADuplicateSocketA(const s: TSocket; const dwProcessId: DWORD; lpProtocolInfo: LPWSAPROTOCOL_INFOA): Integer; stdcall;
|
|
begin
|
|
@WSADuplicateSocketA := FixupStub(hWinSockDll, 'WSADuplicateSocketA'); {Do not Localize}
|
|
Result := WSADuplicateSocketA(s, dwProcessId, lpProtocolInfo);
|
|
end;
|
|
|
|
function Stub_WSADuplicateSocketW(const s: TSocket; const dwProcessId: DWORD; lpProtocolInfo: LPWSAPROTOCOL_INFOW): Integer; stdcall;
|
|
begin
|
|
@WSADuplicateSocketW := FixupStub(hWinSockDll, 'WSADuplicateSocketW'); {Do not Localize}
|
|
Result := WSADuplicateSocketW(s, dwProcessId, lpProtocolInfo);
|
|
end;
|
|
|
|
function Stub_WSADuplicateSocket(const s: TSocket; const dwProcessId: DWORD; lpProtocolInfo: LPWSAPROTOCOL_INFO): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSADuplicateSocket := FixupStub(hWinSockDll, 'WSADuplicateSocketW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSADuplicateSocket := FixupStub(hWinSockDll, 'WSADuplicateSocketA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSADuplicateSocket(s, dwProcessId, lpProtocolInfo);
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function Stub_WSAEnumNetworkEvents(const s: TSocket; const hEventObject: WSAEVENT; lpNetworkEvents: LPWSANETWORKEVENTS): Integer; stdcall;
|
|
begin
|
|
@WSAEnumNetworkEvents := FixupStub(hWinSockDll, 'WSAEnumNetworkEvents'); {Do not Localize}
|
|
Result := WSAEnumNetworkEvents(s, hEventObject, lpNetworkEvents);
|
|
end;
|
|
|
|
function Stub_WSAEnumProtocolsA(lpiProtocols: PInteger; lpProtocolBuffer: LPWSAPROTOCOL_INFOA; var lpdwBufferLength: DWORD): Integer; stdcall;
|
|
begin
|
|
@WSAEnumProtocolsA := FixupStub(hWinSockDll, 'WSAEnumProtocolsA'); {Do not Localize}
|
|
Result := WSAEnumProtocolsA(lpiProtocols, lpProtocolBuffer, lpdwBufferLength);
|
|
end;
|
|
|
|
function Stub_WSAEnumProtocolsW(lpiProtocols: PInteger; lpProtocolBuffer: LPWSAPROTOCOL_INFOW; var lpdwBufferLength: DWORD): Integer; stdcall;
|
|
begin
|
|
@WSAEnumProtocolsW := FixupStub(hWinSockDll, 'WSAEnumProtocolsW'); {Do not Localize}
|
|
Result := WSAEnumProtocolsW(lpiProtocols, lpProtocolBuffer, lpdwBufferLength);
|
|
end;
|
|
|
|
function Stub_WSAEnumProtocols(lpiProtocols: PInteger; lpProtocolBuffer: LPWSAPROTOCOL_INFO; var lpdwBufferLength: DWORD): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSAEnumProtocols := FixupStub(hWinSockDll, 'WSAEnumProtocolsW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSAEnumProtocols := FixupStub(hWinSockDll, 'WSAEnumProtocolsA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSAEnumProtocols(lpiProtocols, lpProtocolBuffer, lpdwBufferLength);
|
|
end;
|
|
|
|
function Stub_WSAEventSelect(const s: TSocket; const hEventObject: WSAEVENT; lNetworkEvents: LongInt): Integer; stdcall;
|
|
begin
|
|
@WSAEventSelect := FixupStub(hWinSockDll, 'WSAEventSelect'); {Do not Localize}
|
|
Result := WSAEventSelect(s, hEventObject, lNetworkEvents);
|
|
end;
|
|
|
|
function Stub_WSAGetOverlappedResult(const s: TSocket; AOverlapped: Pointer; lpcbTransfer: LPDWORD; fWait: BOOL; var lpdwFlags: DWORD): WordBool; stdcall;
|
|
begin
|
|
@WSAGetOverlappedResult := FixupStub(hWinSockDll, 'WSAGetOverlappedResult'); {Do not Localize}
|
|
Result := WSAGetOverlappedResult(s, AOverlapped, lpcbTransfer, fWait, lpdwFlags);
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
function Stub_WSAGetQOSByName(const s: TSocket; lpQOSName: LPWSABUF; lpQOS: LPQOS): WordBool; stdcall;
|
|
begin
|
|
@WSAGetQOSByName := FixupStub(hWinSockDll, 'WSAGetQOSByName'); {Do not Localize}
|
|
Result := WSAGetQOSByName(s, lpQOSName, lpQOS);
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function Stub_WSAHtonl(const s: TSocket; hostlong: u_long; var lpnetlong: DWORD): Integer; stdcall;
|
|
begin
|
|
@WSAHtonl := FixupStub(hWinSockDll, 'WSAHtonl'); {Do not Localize}
|
|
Result := WSAHtonl(s, hostlong, lpnetlong);
|
|
end;
|
|
|
|
function Stub_WSAHtons(const s: TSocket; hostshort: u_short; var lpnetshort: WORD): Integer; stdcall;
|
|
begin
|
|
@WSAHtons := FixupStub(hWinSockDll, 'WSAHtons'); {Do not Localize}
|
|
Result := WSAHtons(s, hostshort, lpnetshort);
|
|
end;
|
|
|
|
function Stub_WSAIoctl(const s: TSocket; dwIoControlCode: DWORD; lpvInBuffer: Pointer; cbInBuffer: DWORD; lpvOutBuffer: Pointer; cbOutBuffer: DWORD; lpcbBytesReturned: LPDWORD; AOverlapped: Pointer; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
begin
|
|
@WSAIoctl := FixupStub(hWinSockDll, 'WSAIoctl'); {Do not Localize}
|
|
Result := WSAIoctl(s, dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, AOverlapped, lpCompletionRoutine);
|
|
end;
|
|
|
|
function Stub_WSAJoinLeaf(const s: TSocket; name: PSockAddr; namelen: Integer; lpCallerData, lpCalleeData: LPWSABUF; lpSQOS, lpGQOS: LPQOS; dwFlags: DWORD): TSocket; stdcall;
|
|
begin
|
|
@WSAJoinLeaf := FixupStub(hWinSockDll, 'WSAJoinLeaf'); {Do not Localize}
|
|
Result := WSAJoinLeaf(s, name, namelen, lpCallerData, lpCalleeData, lpSQOS, lpGQOS, dwFlags);
|
|
end;
|
|
|
|
function Stub_WSANtohl(const s: TSocket; netlong: u_long; var lphostlong: DWORD): Integer; stdcall;
|
|
begin
|
|
@WSANtohl := FixupStub(hWinSockDll, 'WSANtohl'); {Do not Localize}
|
|
Result := WSANtohl(s, netlong, lphostlong);
|
|
end;
|
|
|
|
function Stub_WSANtohs(const s: TSocket; netshort: u_short; var lphostshort: WORD): Integer; stdcall;
|
|
begin
|
|
@WSANtohs := FixupStub(hWinSockDll, 'WSANtohs'); {Do not Localize}
|
|
Result := WSANtohs(s, netshort, lphostshort);
|
|
end;
|
|
|
|
function Stub_WSARecv(const s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD; AOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
begin
|
|
@WSARecv := FixupStub(hWinSockDll, 'WSARecv'); {Do not Localize}
|
|
Result := WSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, AOverlapped, lpCompletionRoutine);
|
|
end;
|
|
|
|
function Stub_WSARecvDisconnect(const s: TSocket; lpInboundDisconnectData: LPWSABUF): Integer; stdcall;
|
|
begin
|
|
@WSARecvDisconnect := FixupStub(hWinSockDll, 'WSARecvDisconnect'); {Do not Localize}
|
|
Result := WSARecvDisconnect(s, lpInboundDisconnectData);
|
|
end;
|
|
|
|
function Stub_WSARecvFrom(const s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD; lpFrom: PSockAddr; lpFromlen: PInteger; AOverlapped: Pointer; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
begin
|
|
@WSARecvFrom := FixupStub(hWinSockDll, 'WSARecvFrom'); {Do not Localize}
|
|
Result := WSARecvFrom(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpFrom, lpFromlen, AOverlapped, lpCompletionRoutine);
|
|
end;
|
|
|
|
function Stub_WSAResetEvent(hEvent: wsaevent): WordBool; stdcall;
|
|
begin
|
|
@WSAResetEvent := FixupStub(hWinSockDll, 'WSAResetEvent'); {Do not Localize}
|
|
Result := WSAResetEvent(hEvent);
|
|
end;
|
|
|
|
function Stub_WSASend(const s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var lpNumberOfBytesSent: DWORD; dwFlags: DWORD; AOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
begin
|
|
@WSASend := FixupStub(hWinSockDll, 'WSASend'); {Do not Localize}
|
|
Result := WSASend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, AOverlapped, lpCompletionRoutine);
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
function Stub_WSASendDisconnect(const s: TSocket; lpOutboundDisconnectData: LPWSABUF): Integer; stdcall;
|
|
begin
|
|
@WSASendDisconnect := FixupStub(hWinSockDll, 'WSASendDisconnect'); {Do not Localize}
|
|
Result := WSASendDisconnect(s, lpOutboundDisconnectData);
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function Stub_WSASendTo(const s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var lpNumberOfBytesSent: DWORD; dwFlags: DWORD; lpTo: PSOCKADDR; iTolen: Integer; AOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
begin
|
|
@WSASendTo := FixupStub(hWinSockDll, 'WSASendTo'); {Do not Localize}
|
|
Result := WSASendTo(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpTo, iTolen, AOverlapped, lpCompletionRoutine);
|
|
end;
|
|
|
|
function Stub_WSASetEvent(hEvent: WSAEVENT): WordBool; stdcall;
|
|
begin
|
|
@WSASetEvent := FixupStub(hWinSockDll, 'WSASetEvent'); {Do not Localize}
|
|
Result := WSASetEvent(hEvent);
|
|
end;
|
|
|
|
function Stub_WSASocketA(af, iType, protocol: Integer; lpProtocolInfo: LPWSAPROTOCOL_INFOA; g: GROUP; dwFlags: DWORD): TSocket; stdcall;
|
|
begin
|
|
@WSASocketA := FixupStub(hWinSockDll, 'WSASocketA'); {Do not Localize}
|
|
Result := WSASocketA(af, iType, protocol, lpProtocolInfo, g, dwFlags);
|
|
end;
|
|
|
|
function Stub_WSASocketW(af, iType, protocol: Integer; lpProtocolInfo: LPWSAPROTOCOL_INFOW; g: GROUP; dwFlags: DWORD): TSocket; stdcall;
|
|
begin
|
|
@WSASocketW := FixupStub(hWinSockDll, 'WSASocketW'); {Do not Localize}
|
|
Result := WSASocketW(af, iType, protocol, lpProtocolInfo, g, dwFlags);
|
|
end;
|
|
|
|
function Stub_WSASocket(af, iType, protocol: Integer; lpProtocolInfo: LPWSAPROTOCOL_INFO; g: GROUP; dwFlags: DWORD): TSocket; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSASocket := FixupStub(hWinSockDll, 'WSASocketW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSASocket := FixupStub(hWinSockDll, 'WSASocketA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSASocket(af, iType, protocol, lpProtocolInfo, g, dwFlags);
|
|
end;
|
|
|
|
function Stub_WSAWaitForMultipleEvents(cEvents: DWORD; lphEvents: Pwsaevent; fWaitAll: LongBool; dwTimeout: DWORD; fAlertable: LongBool): DWORD; stdcall;
|
|
begin
|
|
@WSAWaitForMultipleEvents := FixupStub(hWinSockDll, 'WSAWaitForMultipleEvents'); {Do not Localize}
|
|
Result := WSAWaitForMultipleEvents(cEvents, lphEvents, fWaitAll, dwTimeout, fAlertable);
|
|
end;
|
|
|
|
function Stub_WSAAddressToStringA(lpsaAddress: PSockAddr; const dwAddressLength: DWORD; const lpProtocolInfo: LPWSAPROTOCOL_INFOA; const lpszAddressString: PAnsiChar; var lpdwAddressStringLength: DWORD): Integer; stdcall;
|
|
begin
|
|
@WSAAddressToStringA := FixupStub(hWinSockDll, 'WSAAddressToStringA'); {Do not Localize}
|
|
Result := WSAAddressToStringA(lpsaAddress, dwAddressLength, lpProtocolInfo, lpszAddressString, lpdwAddressStringLength);
|
|
end;
|
|
|
|
function Stub_WSAAddressToStringW(lpsaAddress: PSockAddr; const dwAddressLength: DWORD; const lpProtocolInfo: LPWSAPROTOCOL_INFOW; const lpszAddressString: PWideChar; var lpdwAddressStringLength: DWORD): Integer; stdcall;
|
|
begin
|
|
@WSAAddressToStringW := FixupStub(hWinSockDll, 'WSAAddressToStringW'); {Do not Localize}
|
|
Result := WSAAddressToStringW(lpsaAddress, dwAddressLength, lpProtocolInfo, lpszAddressString, lpdwAddressStringLength);
|
|
end;
|
|
|
|
function Stub_WSAAddressToString(lpsaAddress: PSockAddr; const dwAddressLength: DWORD; const lpProtocolInfo: LPWSAPROTOCOL_INFO;
|
|
const lpszAddressString: {$IFDEF UNICODE}PWideChar{$ELSE}PAnsiChar{$ENDIF}; var lpdwAddressStringLength: DWORD): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSAAddressToString := FixupStub(hWinSockDll, 'WSAAddressToStringW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSAAddressToString := FixupStub(hWinSockDll, 'WSAAddressToStringA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSAAddressToString(lpsaAddress, dwAddressLength, lpProtocolInfo, lpszAddressString, lpdwAddressStringLength);
|
|
end;
|
|
|
|
function Stub_WSAStringToAddressA(const AddressString: PAnsiChar; const AddressFamily: Integer; const lpProtocolInfo: LPWSAPROTOCOL_INFOA; var lpAddress: TSockAddr; var lpAddressLength: Integer): Integer; stdcall;
|
|
begin
|
|
@WSAStringToAddressA := FixupStub(hWinSockDll, 'WSAStringToAddressA'); {Do not Localize}
|
|
Result := WSAStringToAddressA(AddressString, AddressFamily, lpProtocolInfo, lpAddress, lpAddressLength);
|
|
end;
|
|
|
|
function Stub_WSAStringToAddressW(const AddressString: PWideChar; const AddressFamily: Integer; const lpProtocolInfo: LPWSAPROTOCOL_INFOW; var lpAddress: TSockAddr; var lpAddressLength: Integer): Integer; stdcall;
|
|
begin
|
|
@WSAStringToAddressW := FixupStub(hWinSockDll, 'WSAStringToAddressW'); {Do not Localize}
|
|
Result := WSAStringToAddressW(AddressString, AddressFamily, lpProtocolInfo, lpAddress, lpAddressLength);
|
|
end;
|
|
|
|
function Stub_WSAStringToAddress (const AddressString: {$IFDEF UNICODE}PWideChar{$ELSE}PAnsiChar{$ENDIF};
|
|
const AddressFamily: Integer; const lpProtocolInfo: LPWSAProtocol_Info;
|
|
var lpAddress: TSockAddr; var lpAddressLength: Integer): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSAStringToAddress := FixupStub(hWinSockDll, 'WSAStringToAddressW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSAStringToAddress := FixupStub(hWinSockDll, 'WSAStringToAddressA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSAStringToAddress(AddressString, AddressFamily, lpProtocolInfo, lpAddress, lpAddressLength);
|
|
end;
|
|
|
|
function Stub_WSALookupServiceBeginA(var qsRestrictions: TWSAQuerySetA; const dwControlFlags: DWORD; var hLookup: THandle): Integer; stdcall;
|
|
begin
|
|
@WSALookupServiceBeginA := FixupStub(hWinSockDll, 'WSALookupServiceBeginA'); {Do not Localize}
|
|
Result := WSALookupServiceBeginA(qsRestrictions, dwControlFlags, hLookup);
|
|
end;
|
|
|
|
function Stub_WSALookupServiceBeginW(var qsRestrictions: TWSAQuerySetW; const dwControlFlags: DWORD; var hLookup: THandle): Integer; stdcall;
|
|
begin
|
|
@WSALookupServiceBeginW := FixupStub(hWinSockDll, 'WSALookupServiceBeginW'); {Do not Localize}
|
|
Result := WSALookupServiceBeginW(qsRestrictions, dwControlFlags, hLookup);
|
|
end;
|
|
|
|
function Stub_WSALookupServiceBegin(var qsRestrictions: TWSAQuerySet; const dwControlFlags: DWORD; var hLookup: THandle): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSALookupServiceBegin := FixupStub(hWinSockDll, 'WSALookupServiceBeginW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSALookupServiceBegin := FixupStub(hWinSockDll, 'WSALookupServiceBeginA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSALookupServiceBegin(qsRestrictions, dwControlFlags, hLookup);
|
|
end;
|
|
|
|
function Stub_WSALookupServiceNextA(const hLookup: THandle; const dwControlFlags: DWORD; var dwBufferLength: DWORD; lpqsResults: LPWSAQUERYSETA): Integer; stdcall;
|
|
begin
|
|
@WSALookupServiceNextA := FixupStub(hWinSockDll, 'WSALookupServiceNextA'); {Do not Localize}
|
|
Result := WSALookupServiceNextA(hLookup, dwControlFlags, dwBufferLength, lpqsResults);
|
|
end;
|
|
|
|
function Stub_WSALookupServiceNextW(const hLookup: THandle; const dwControlFlags: DWORD; var dwBufferLength: DWORD; lpqsResults: LPWSAQUERYSETW): Integer; stdcall;
|
|
begin
|
|
@WSALookupServiceNextW := FixupStub(hWinSockDll, 'WSALookupServiceNextW'); {Do not Localize}
|
|
Result := WSALookupServiceNextW(hLookup, dwControlFlags, dwBufferLength, lpqsResults);
|
|
end;
|
|
|
|
function Stub_WSALookupServiceNext(const hLookup: THandle; const dwControlFlags: DWORD; var dwBufferLength: DWORD; lpqsResults: LPWSAQUERYSET): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSALookupServiceNext := FixupStub(hWinSockDll, 'WSALookupServiceNextW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSALookupServiceNext := FixupStub(hWinSockDll, 'WSALookupServiceNextA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSALookupServiceNext(hLookup, dwControlFlags, dwBufferLength, lpqsResults);
|
|
end;
|
|
|
|
function Stub_WSALookupServiceEnd(const hLookup: THandle): Integer; stdcall;
|
|
begin
|
|
@WSALookupServiceEnd := FixupStub(hWinSockDll, 'WSALookupServiceEnd'); {Do not Localize}
|
|
Result := WSALookupServiceEnd(hLookup);
|
|
end;
|
|
|
|
|
|
function Stub_WSANSPIoctl(const hLookup : THANDLE; const dwControlCode : DWORD;
|
|
lpvInBuffer : Pointer; var cbInBuffer : DWORD; lpvOutBuffer : Pointer;
|
|
var cbOutBuffer : DWORD; var lpcbBytesReturned : DWORD;
|
|
lpCompletion : LPWSACOMPLETION) : Integer; stdcall;
|
|
begin
|
|
@WSANSPIoctl := FixupStub(hWinSockDLL, 'WSANSPIoctl'); {Do not Localize}
|
|
Result := WSANSPIoctl(hLookup,dwControlCode,lpvInBuffer,cbInBuffer,lpvOutBuffer,
|
|
cbOutBuffer, lpcbBytesReturned,lpCompletion);
|
|
end;
|
|
|
|
function Stub_WSAInstallServiceClassA(const lpServiceClassInfo: LPWSASERVICECLASSINFOA): Integer; stdcall;
|
|
begin
|
|
@WSAInstallServiceClassA := FixupStub(hWinSockDll, 'WSAInstallServiceClassA'); {Do not Localize}
|
|
Result := WSAInstallServiceClassA(lpServiceClassInfo);
|
|
end;
|
|
|
|
function Stub_WSAInstallServiceClassW(const lpServiceClassInfo: LPWSASERVICECLASSINFOW): Integer; stdcall;
|
|
begin
|
|
@WSAInstallServiceClassW := FixupStub(hWinSockDll, 'WSAInstallServiceClassW'); {Do not Localize}
|
|
Result := WSAInstallServiceClassW(lpServiceClassInfo);
|
|
end;
|
|
|
|
function Stub_WSAInstallServiceClass(const lpServiceClassInfo: LPWSASERVICECLASSINFO): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSAInstallServiceClass := FixupStub(hWinSockDll, 'WSAInstallServiceClassW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSAInstallServiceClass := FixupStub(hWinSockDll, 'WSAInstallServiceClassA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSAInstallServiceClass(lpServiceClassInfo);
|
|
end;
|
|
|
|
function Stub_WSARemoveServiceClass(const lpServiceClassId: PGUID): Integer; stdcall;
|
|
begin
|
|
@WSARemoveServiceClass := FixupStub(hWinSockDll, 'WSARemoveServiceClass'); {Do not Localize}
|
|
Result := WSARemoveServiceClass(lpServiceClassId);
|
|
end;
|
|
|
|
function Stub_WSAGetServiceClassInfoA(const lpProviderId: PGUID; const lpServiceClassId: PGUID; var lpdwBufSize: DWORD; lpServiceClassInfo: LPWSASERVICECLASSINFOA): Integer; stdcall;
|
|
begin
|
|
@WSAGetServiceClassInfoA := FixupStub(hWinSockDll, 'WSAGetServiceClassInfoA'); {Do not Localize}
|
|
Result := WSAGetServiceClassInfoA(lpProviderId, lpServiceClassId, lpdwBufSize, lpServiceClassInfo);
|
|
end;
|
|
|
|
function Stub_WSAGetServiceClassInfoW(const lpProviderId: PGUID; const lpServiceClassId: PGUID; var lpdwBufSize: DWORD; lpServiceClassInfo: LPWSASERVICECLASSINFOW): Integer; stdcall;
|
|
begin
|
|
@WSAGetServiceClassInfoW := FixupStub(hWinSockDll, 'WSAGetServiceClassInfoW'); {Do not Localize}
|
|
Result := WSAGetServiceClassInfoW(lpProviderId, lpServiceClassId, lpdwBufSize, lpServiceClassInfo);
|
|
end;
|
|
|
|
function Stub_WSAGetServiceClassInfo(const lpProviderId: PGUID; const lpServiceClassId: PGUID; var lpdwBufSize: DWORD; lpServiceClassInfo: LPWSASERVICECLASSINFO): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSAGetServiceClassInfo := FixupStub(hWinSockDll, 'WSAGetServiceClassInfoW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSAGetServiceClassInfo := FixupStub(hWinSockDll, 'WSAGetServiceClassInfoA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSAGetServiceClassInfo(lpProviderId, lpServiceClassId, lpdwBufSize, lpServiceClassInfo);
|
|
end;
|
|
|
|
function Stub_WSAEnumNameSpaceProvidersA(var lpdwBufferLength: DWORD; const lpnspBuffer: LPWSANAMESPACE_INFOA): Integer; stdcall;
|
|
begin
|
|
@WSAEnumNameSpaceProvidersA := FixupStub(hWinSockDll, 'WSAEnumNameSpaceProvidersA'); {Do not Localize}
|
|
Result := WSAEnumNameSpaceProvidersA(lpdwBufferLength, lpnspBuffer);
|
|
end;
|
|
|
|
function Stub_WSAEnumNameSpaceProvidersW(var lpdwBufferLength: DWORD; const lpnspBuffer: LPWSANAMESPACE_INFOW): Integer; stdcall;
|
|
begin
|
|
@WSAEnumNameSpaceProvidersW := FixupStub(hWinSockDll, 'WSAEnumNameSpaceProvidersW'); {Do not Localize}
|
|
Result := WSAEnumNameSpaceProvidersW(lpdwBufferLength, lpnspBuffer);
|
|
end;
|
|
|
|
function Stub_WSAEnumNameSpaceProviders(var lpdwBufferLength: DWORD; const lpnspBuffer: LPWSANAMESPACE_INFO): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSAEnumNameSpaceProviders := FixupStub(hWinSockDll, 'WSAEnumNameSpaceProvidersW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSAEnumNameSpaceProviders := FixupStub(hWinSockDll, 'WSAEnumNameSpaceProvidersA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSAEnumNameSpaceProviders(lpdwBufferLength, lpnspBuffer);
|
|
end;
|
|
|
|
function Stub_WSAGetServiceClassNameByClassIdA(const lpServiceClassId: PGUID; lpszServiceClassName: PAnsiChar; var lpdwBufferLength: DWORD): Integer; stdcall;
|
|
begin
|
|
@WSAGetServiceClassNameByClassIdA := FixupStub(hWinSockDll, 'WSAGetServiceClassNameByClassIdA'); {Do not Localize}
|
|
Result := WSAGetServiceClassNameByClassIdA(lpServiceClassId, lpszServiceClassName, lpdwBufferLength);
|
|
end;
|
|
|
|
function Stub_WSAGetServiceClassNameByClassIdW(const lpServiceClassId: PGUID; lpszServiceClassName: PWideChar; var lpdwBufferLength: DWORD): Integer; stdcall;
|
|
begin
|
|
@WSAGetServiceClassNameByClassIdW := FixupStub(hWinSockDll, 'WSAGetServiceClassNameByClassIdW'); {Do not Localize}
|
|
Result := WSAGetServiceClassNameByClassIdW(lpServiceClassId, lpszServiceClassName, lpdwBufferLength);
|
|
end;
|
|
|
|
function Stub_WSAGetServiceClassNameByClassId(const lpServiceClassId: PGUID;
|
|
lpszServiceClassName: {$IFDEF UNICODE}PWideChar{$ELSE}PAnsiChar{$ENDIF};
|
|
var lpdwBufferLength: DWORD): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSAGetServiceClassNameByClassId := FixupStub(hWinSockDll, 'WSAGetServiceClassNameByClassIdW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSAGetServiceClassNameByClassId := FixupStub(hWinSockDll, 'WSAGetServiceClassNameByClassIdA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSAGetServiceClassNameByClassId(lpServiceClassId, lpszServiceClassName, lpdwBufferLength);
|
|
end;
|
|
|
|
function Stub_WSASetServiceA(const lpqsRegInfo: LPWSAQUERYSETA; const essoperation: WSAESETSERVICEOP; const dwControlFlags: DWORD): Integer; stdcall;
|
|
begin
|
|
@WSASetServiceA := FixupStub(hWinSockDll, 'WSASetServiceA'); {Do not Localize}
|
|
Result := WSASetServiceA(lpqsRegInfo, essoperation, dwControlFlags);
|
|
end;
|
|
|
|
function Stub_WSASetServiceW(const lpqsRegInfo: LPWSAQUERYSETW; const essoperation: WSAESETSERVICEOP; const dwControlFlags: DWORD): Integer; stdcall;
|
|
begin
|
|
@WSASetServiceW := FixupStub(hWinSockDll, 'WSASetServiceW'); {Do not Localize}
|
|
Result := WSASetServiceW(lpqsRegInfo, essoperation, dwControlFlags);
|
|
end;
|
|
|
|
function Stub_WSASetService(const lpqsRegInfo: LPWSAQUERYSET; const essoperation: WSAESETSERVICEOP; const dwControlFlags: DWORD): Integer; stdcall;
|
|
begin
|
|
{$IFDEF UNICODE}
|
|
@WSASetService := FixupStub(hWinSockDll, 'WSASetServiceW'); {Do not Localize}
|
|
{$ELSE}
|
|
@WSASetService := FixupStub(hWinSockDll, 'WSASetServiceA'); {Do not Localize}
|
|
{$ENDIF}
|
|
Result := WSASetService(lpqsRegInfo, essoperation, dwControlFlags);
|
|
end;
|
|
|
|
function Stub_WSAProviderConfigChange(var lpNotificationHandle: THandle; AOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
begin
|
|
@WSAProviderConfigChange := FixupStub(hWinSockDll, 'WSAProviderConfigChange'); {Do not Localize}
|
|
Result := WSAProviderConfigChange(lpNotificationHandle, AOverlapped, lpCompletionRoutine);
|
|
end;
|
|
|
|
function Stub_TransmitFile(hSocket: TSocket; hFile: THandle; nNumberOfBytesToWrite: DWORD;
|
|
nNumberOfBytesPerSend: DWORD; lpOverlapped: POverlapped;
|
|
lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS; dwReserved: DWORD): BOOL; stdcall;
|
|
begin
|
|
@TransmitFile := FixupStubEx(hSocket, 'TransmitFile', WSAID_TRANSMITFILE); {Do not localize}
|
|
Result := TransmitFile(hSocket, hFile, nNumberOfBytesToWrite, nNumberOfBytesPerSend, lpOverlapped, lpTransmitBuffers, dwReserved);
|
|
end;
|
|
|
|
{RLebeau 1/26/2006 - loading GetAcceptExSockaddrs() at the same time as AcceptEx().
|
|
This is because GetAcceptExSockaddrs() is not passed a SOCKET that can be passed to
|
|
WSAIoCtrl() to get the function pointer. Also, GetAcceptExSockaddrs() is needed to
|
|
parse AcceptEx()'s return data, so there is no point in calling AcceptEx() unless
|
|
its data can be parsed afterwards.}
|
|
function Stub_AcceptEx(sListenSocket, sAcceptSocket: TSocket;
|
|
lpOutputBuffer: Pointer; dwReceiveDataLength, dwLocalAddressLength,
|
|
dwRemoteAddressLength: DWORD; var lpdwBytesReceived: DWORD;
|
|
lpOverlapped: POverlapped): BOOL; stdcall;
|
|
begin
|
|
{RLebeau - loading GetAcceptExSockaddrs() first in case it fails}
|
|
@GetAcceptExSockaddrs := FixupStubEx(sListenSocket, 'GetAcceptExSockaddrs', WSAID_GETACCEPTEXSOCKADDRS); {Do not localize}
|
|
@AcceptEx := FixupStubEx(sListenSocket, 'AcceptEx', WSAID_ACCEPTEX); {Do not localize}
|
|
Result := AcceptEx(sListenSocket, sAcceptSocket, lpOutputBuffer, dwReceiveDataLength,
|
|
dwLocalAddressLength, dwRemoteAddressLength, lpdwBytesReceived, lpOverlapped);
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
function Stub_WSARecvEx(s: TSocket; var buf; len: Integer; var flags: Integer): Integer; stdcall;
|
|
begin
|
|
LoadMSWSock;
|
|
@WSARecvEx := FixupStub(hMSWSockDll, 'WSARecvEx'); {Do not localize}
|
|
Result := WSARecvEx(s, buf, len, flags);
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function Stub_ConnectEx(const s : TSocket; const name: PSockAddr; const namelen: Integer; lpSendBuffer : Pointer;
|
|
dwSendDataLength : DWORD; var lpdwBytesSent : DWORD; lpOverlapped : LPWSAOVERLAPPED) : BOOL; stdcall;
|
|
begin
|
|
@ConnectEx := FixupStubEx(s, 'ConnectEx', WSAID_CONNECTEX); {Do not localize}
|
|
Result := ConnectEx(s, name, namelen, lpSendBuffer, dwSendDataLength, lpdwBytesSent, lpOverlapped);
|
|
end;
|
|
|
|
function Stub_DisconnectEx(const s : TSocket; AOverlapped: Pointer; const dwFlags : DWord; const dwReserved : DWORD) : BOOL; stdcall;
|
|
begin
|
|
@DisconnectEx := FixupStubEx(s, 'DisconnectEx', WSAID_DISCONNECTEX); {Do not localize}
|
|
Result := DisconnectEx(s, AOverlapped, dwFlags, dwReserved);
|
|
end;
|
|
|
|
function Stub_WSARecvMsg(const s : TSocket; lpMsg : LPWSAMSG; var lpNumberOfBytesRecvd : DWORD; AOverlapped: Pointer; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
|
|
begin
|
|
@WSARecvMsg := FixupStubEx(s, 'WSARecvMsg', WSAID_WSARECVMSG); {Do not localize}
|
|
Result := WSARecvMsg(s, lpMsg, lpNumberOfBytesRecvd, AOverlapped, lpCompletionRoutine);
|
|
end;
|
|
|
|
function Stub_TransmitPackets(s: TSocket; lpPacketArray: LPTRANSMIT_PACKETS_ELEMENT;
|
|
nElementCount: DWORD; nSendSize: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: DWORD): BOOL; stdcall;
|
|
begin
|
|
@TransmitPackets := FixupStubEx(s, 'TransmitPackets', WSAID_TRANSMITPACKETS); {Do not localize}
|
|
Result := TransmitPackets(s, lpPacketArray, nElementCount, nSendSize, lpOverlapped, dwFlags);
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
function Stub_WSASendMsg(const s : TSocket; lpMsg : LPWSAMSG; const dwFlags : DWORD; var lpNumberOfBytesSent : DWORD; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) : Integer; stdcall;
|
|
begin
|
|
@WSASendMsg := FixupStubEx(s, 'WSASendMsg', WSAID_WSASENDMSG); {Do not localize}
|
|
Result := WSASendMsg(s, lpMsg, dwFlags, lpNumberOfBytesSent, lpOverlapped, lpCompletionRoutine);
|
|
end;
|
|
|
|
function Stub_WSAPoll(fdarray : LPWSAPOLLFD; const nfds : u_long; const timeout : Integer) : Integer; stdcall;
|
|
begin
|
|
@WSAPoll := FixupStubEx(fdarray.fd, 'WSAPoll', WSAID_WSAPOLL); {Do not localize}
|
|
Result := WSAPoll(fdarray, nfds, timeout);
|
|
end;
|
|
{$ENDIF}
|
|
|
|
procedure InitializeStubs;
|
|
{Alphabetize these so we can more easily determine what's available on a platform.
|
|
by section in Winsock SDK reference}
|
|
begin
|
|
accept := Stub_accept;
|
|
bind := Stub_bind;
|
|
closesocket := Stub_closesocket;
|
|
connect := Stub_connect;
|
|
ioctlsocket := Stub_ioctlsocket;
|
|
getpeername := Stub_getpeername;
|
|
getsockname := Stub_getsockname;
|
|
getsockopt := Stub_getsockopt;
|
|
htonl := Stub_htonl;
|
|
htons := Stub_htons;
|
|
inet_addr := Stub_inet_addr;
|
|
inet_ntoa := Stub_inet_ntoa;
|
|
listen := Stub_listen;
|
|
ntohl := Stub_ntohl;
|
|
ntohs := Stub_ntohs;
|
|
recv := Stub_recv;
|
|
recvfrom := Stub_recvfrom;
|
|
select := Stub_select;
|
|
send := Stub_send;
|
|
sendto := Stub_sendto;
|
|
{$IFDEF WINCE}
|
|
sethostname := Stub_sethostname;
|
|
{$ENDIF}
|
|
setsockopt := Stub_setsockopt;
|
|
shutdown := Stub_shutdown;
|
|
socket := Stub_socket;
|
|
gethostbyaddr := Stub_gethostbyaddr;
|
|
gethostbyname := Stub_gethostbyname;
|
|
gethostname := Stub_gethostname;
|
|
getservbyport := Stub_getservbyport;
|
|
getservbyname := Stub_getservbyname;
|
|
getprotobynumber := Stub_getprotobynumber;
|
|
getprotobyname := Stub_getprotobyname;
|
|
//extensions
|
|
__WSAFDIsSet := Stub___WSAFDIsSet;
|
|
{$IFNDEF WINCE}
|
|
AcceptEx := Stub_AcceptEx;
|
|
//GetAcceptExSockaddrs is loaded by Stub_AcceptEx
|
|
ConnectEx := Stub_ConnectEx;
|
|
DisconnectEx := Stub_DisconnectEx;
|
|
TransmitFile := Stub_TransmitFile;
|
|
TransmitPackets := Stub_TransmitPackets;
|
|
{$ENDIF}
|
|
WSAAccept := Stub_WSAAccept;
|
|
{$IFNDEF WINCE}
|
|
WSACancelAsyncRequest := Stub_WSACancelAsyncRequest;
|
|
WSAAsyncGetHostByAddr := Stub_WSAAsyncGetHostByAddr;
|
|
WSAAsyncGetHostByName := Stub_WSAAsyncGetHostByName;
|
|
WSAAsyncGetProtoByName := Stub_WSAAsyncGetProtoByName;
|
|
WSAAsyncGetProtoByNumber := Stub_WSAAsyncGetProtoByNumber;
|
|
WSAAsyncGetServByName := Stub_WSAAsyncGetServByName;
|
|
WSAAsyncGetServByPort := Stub_WSAAsyncGetServByPort;
|
|
WSAAsyncSelect := Stub_WSAAsyncSelect;
|
|
{$ENDIF}
|
|
WSAAddressToStringA := Stub_WSAAddressToStringA;
|
|
WSAAddressToStringW := Stub_WSAAddressToStringW;
|
|
WSAAddressToString := Stub_WSAAddressToString;
|
|
{$IFNDEF WINCE}
|
|
WSACancelBlockingCall := Stub_WSACancelBlockingCall;
|
|
{$ENDIF}
|
|
WSACleanup := Stub_WSACleanup;
|
|
WSACloseEvent := Stub_WSACloseEvent;
|
|
WSAConnect := Stub_WSAConnect;
|
|
WSACreateEvent := Stub_WSACreateEvent;
|
|
{$IFNDEF WINCE}
|
|
WSADuplicateSocketA := Stub_WSADuplicateSocketA;
|
|
WSADuplicateSocketW := Stub_WSADuplicateSocketW;
|
|
WSADuplicateSocket := Stub_WSADuplicateSocket;
|
|
{$ENDIF}
|
|
WSAEnumNameSpaceProvidersA := Stub_WSAEnumNameSpaceProvidersA;
|
|
WSAEnumNameSpaceProvidersW := Stub_WSAEnumNameSpaceProvidersW;
|
|
WSAEnumNameSpaceProviders := Stub_WSAEnumNameSpaceProviders;
|
|
WSAEnumNetworkEvents := Stub_WSAEnumNetworkEvents;
|
|
WSAEnumProtocolsA := Stub_WSAEnumProtocolsA;
|
|
WSAEnumProtocolsW := Stub_WSAEnumProtocolsW;
|
|
WSAEnumProtocols := Stub_WSAEnumProtocols;
|
|
WSAEventSelect := Stub_WSAEventSelect;
|
|
WSAGetLastError := Stub_WSAGetLastError;
|
|
WSAGetOverlappedResult := Stub_WSAGetOverlappedResult;
|
|
{$IFNDEF WINCE}
|
|
WSAGetQOSByName := Stub_WSAGetQOSByName;
|
|
WSAGetServiceClassInfoA := Stub_WSAGetServiceClassInfoA;
|
|
WSAGetServiceClassInfoW := Stub_WSAGetServiceClassInfoW;
|
|
WSAGetServiceClassInfo := Stub_WSAGetServiceClassInfo;
|
|
WSAGetServiceClassNameByClassIdA := Stub_WSAGetServiceClassNameByClassIdA;
|
|
WSAGetServiceClassNameByClassIdW := Stub_WSAGetServiceClassNameByClassIdW;
|
|
WSAGetServiceClassNameByClassId := Stub_WSAGetServiceClassNameByClassId;
|
|
{$ENDIF}
|
|
WSAHtonl := Stub_WSAHtonl;
|
|
WSAHtons := Stub_WSAHtons;
|
|
{$IFNDEF WINCE}
|
|
WSAInstallServiceClassA := Stub_WSAInstallServiceClassA;
|
|
WSAInstallServiceClassW := Stub_WSAInstallServiceClassW;
|
|
WSAInstallServiceClass := Stub_WSAInstallServiceClass;
|
|
{$ENDIF}
|
|
WSAIoctl := Stub_WSAIoctl;
|
|
{$IFNDEF WINCE}
|
|
WSAIsBlocking := Stub_WSAIsBlocking;
|
|
{$ENDIF}
|
|
WSAJoinLeaf := Stub_WSAJoinLeaf;
|
|
WSALookupServiceBeginA := Stub_WSALookupServiceBeginA;
|
|
WSALookupServiceBeginW := Stub_WSALookupServiceBeginW;
|
|
WSALookupServiceBegin := Stub_WSALookupServiceBegin;
|
|
WSALookupServiceEnd := Stub_WSALookupServiceEnd;
|
|
WSALookupServiceNextA := Stub_WSALookupServiceNextA;
|
|
WSALookupServiceNextW := Stub_WSALookupServiceNextW;
|
|
WSALookupServiceNext := Stub_WSALookupServiceNext;
|
|
|
|
// WSANSPIoctl is not supported in WinCE 4.20 but is in later versions.
|
|
WSANSPIoctl := Stub_WSANSPIoctl;
|
|
|
|
WSANtohl := Stub_WSANtohl;
|
|
WSANtohs := Stub_WSANtohs;
|
|
{$IFNDEF WINCE}
|
|
WSAPoll := Stub_WSAPoll;
|
|
WSAProviderConfigChange := Stub_WSAProviderConfigChange;
|
|
{$ENDIF}
|
|
WSARecv := Stub_WSARecv;
|
|
{$IFNDEF WINCE}
|
|
WSARecvDisconnect := Stub_WSARecvDisconnect;
|
|
WSARecvEx := Stub_WSARecvEx;
|
|
{$ENDIF}
|
|
WSARecvFrom := Stub_WSARecvFrom;
|
|
WSARecvMsg := Stub_WSARecvMsg;
|
|
WSARemoveServiceClass := Stub_WSARemoveServiceClass;
|
|
WSAResetEvent := Stub_WSAResetEvent;
|
|
WSASend := Stub_WSASend;
|
|
{$IFNDEF WINCE}
|
|
WSASendDisconnect := Stub_WSASendDisconnect;
|
|
WSASendMsg := Stub_WSASendMsg;
|
|
{$ENDIF}
|
|
WSASendTo := Stub_WSASendTo;
|
|
{$IFNDEF WINCE}
|
|
WSASetBlockingHook := Stub_WSASetBlockingHook;
|
|
{$ENDIF}
|
|
WSASetEvent := Stub_WSASetEvent;
|
|
WSASetLastError := Stub_WSASetLastError;
|
|
WSASetServiceA := Stub_WSASetServiceA;
|
|
WSASetServiceW := Stub_WSASetServiceW;
|
|
WSASetService := Stub_WSASetService;
|
|
WSASocketA := Stub_WSASocketA;
|
|
WSASocketW := Stub_WSASocketW;
|
|
WSASocket := Stub_WSASocket;
|
|
WSAStartup := Stub_WSAStartup;
|
|
WSAStringToAddressA := Stub_WSAStringToAddressA;
|
|
WSAStringToAddressW := Stub_WSAStringToAddressW;
|
|
WSAStringToAddress := Stub_WSAStringToAddress;
|
|
{$IFNDEF WINCE}
|
|
WSAUnhookBlockingHook := Stub_WSAUnhookBlockingHook;
|
|
{$ENDIF}
|
|
WSAWaitForMultipleEvents := Stub_WSAWaitForMultipleEvents;
|
|
end;
|
|
|
|
function WSAMakeSyncReply(Buflen, AError: Word): Longint;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := MakeLong(Buflen, AError);
|
|
end;
|
|
|
|
function WSAMakeSelectReply(Event, AError: Word): Longint;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := MakeLong(Event, AError);
|
|
end;
|
|
|
|
function WSAGetAsyncBuflen(Param: LPARAM): Word;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := LOWORD(Param);
|
|
end;
|
|
|
|
function WSAGetAsyncError(Param: LPARAM): Word;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := HIWORD(Param);
|
|
end;
|
|
|
|
function WSAGetSelectEvent(Param: LPARAM): Word;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := LOWORD(Param);
|
|
end;
|
|
|
|
function WSAGetSelectError(Param: LPARAM): Word;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
WSAGetSelectError := HIWORD(Param);
|
|
end;
|
|
|
|
procedure FD_CLR(ASocket: TSocket; var FDSet: TFDSet);
|
|
var
|
|
i: u_int;
|
|
begin
|
|
i := 0;
|
|
while i < FDSet.fd_count do
|
|
begin
|
|
if FDSet.fd_array[i] = ASocket then
|
|
begin
|
|
while i < FDSet.fd_count - 1 do
|
|
begin
|
|
FDSet.fd_array[i] := FDSet.fd_array[i+1];
|
|
Inc(i);
|
|
end;
|
|
Dec(FDSet.fd_count);
|
|
Break;
|
|
end;
|
|
Inc(i);
|
|
end;
|
|
end;
|
|
|
|
function FD_ISSET(ASocket: TSocket; var FDSet: TFDSet): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := __WSAFDIsSet(ASocket, FDSet);
|
|
end;
|
|
|
|
procedure FD_SET(ASocket: TSocket; var FDSet: TFDSet);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if FDSet.fd_count < fd_setsize then
|
|
begin
|
|
FDSet.fd_array[FDSet.fd_count] := ASocket;
|
|
Inc(FDSet.fd_count);
|
|
end;
|
|
end;
|
|
|
|
procedure FD_ZERO(var FDSet: TFDSet);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
FDSet.fd_count := 0;
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
|
|
//Posix aliases
|
|
// #define CMSGHDR_ALIGN WSA_CMSGHDR_ALIGN
|
|
function CMSGHDR_ALIGN(const Alength: SIZE_T): SIZE_T;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := WSA_CMSGHDR_ALIGN(Alength);
|
|
end;
|
|
|
|
// #define CMSGDATA_ALIGN WSA_CMSGDATA_ALIGN
|
|
function CMSGDATA_ALIGN(const Alength: PtrUInt): PtrUInt;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := WSA_CMSGDATA_ALIGN(Alength);
|
|
end;
|
|
|
|
//#define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
|
|
function CMSG_FIRSTHDR(const msg: LPWSAMSG): LPWSACMSGHDR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := WSA_CMSG_FIRSTHDR(msg);
|
|
end;
|
|
|
|
// #define CMSG_NXTHDR WSA_CMSG_NXTHDR
|
|
function CMSG_NXTHDR(const msg: LPWSAMSG; const cmsg: LPWSACMSGHDR): LPWSACMSGHDR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := WSA_CMSG_NXTHDR(msg, cmsg);
|
|
end;
|
|
|
|
// #define CMSG_SPACE WSA_CMSG_SPACE
|
|
function CMSG_SPACE(const Alength: PtrUInt): PtrUInt;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := WSA_CMSG_SPACE(ALength);
|
|
end;
|
|
|
|
// #define CMSG_LEN WSA_CMSG_LEN
|
|
function CMSG_LEN(const Alength: SIZE_T): SIZE_T;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := WSA_CMSG_LEN(ALength);
|
|
end;
|
|
|
|
//
|
|
function WSA_CMSGHDR_ALIGN(const Alength: SIZE_T): SIZE_T;
|
|
type
|
|
{$IFDEF WIN32}
|
|
{$ALIGN ON}
|
|
TempRec = record
|
|
x: AnsiChar;
|
|
test: WSACMSGHDR;
|
|
end;
|
|
{$ALIGN OFF}
|
|
{$ELSE}
|
|
//Win64 and WinCE seem to require alignment for API records
|
|
TempRec = record
|
|
x: AnsiChar;
|
|
test: WSACMSGHDR;
|
|
end;
|
|
{$ENDIF}
|
|
var
|
|
Alignment: SIZE_T;
|
|
Tmp: ^TempRec;
|
|
begin
|
|
Tmp := nil;
|
|
Alignment := PtrUInt(@(Tmp^.test));
|
|
Result := (Alength + (Alignment-1)) and not (Alignment-1);
|
|
end;
|
|
|
|
function WSA_CMSGDATA_ALIGN(const Alength: PtrUInt): PtrUInt;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := (Alength + MAX_NATURAL_ALIGNMENT_SUB_1) and not (MAX_NATURAL_ALIGNMENT_SUB_1);
|
|
end;
|
|
|
|
function WSA_CMSG_FIRSTHDR(const msg: LPWSAMSG): LPWSACMSGHDR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (msg <> nil) and (msg^.Control.len >= SIZE_WSACMSGHDR) then begin
|
|
Result := LPWSACMSGHDR(msg^.Control.buf);
|
|
end else begin
|
|
Result := nil;
|
|
end;
|
|
end;
|
|
|
|
function WSA_CMSG_NXTHDR(const msg: LPWSAMSG; const cmsg: LPWSACMSGHDR): LPWSACMSGHDR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if cmsg = nil then begin
|
|
Result := WSA_CMSG_FIRSTHDR(msg);
|
|
end else begin
|
|
if (PtrUInt(cmsg) + WSA_CMSGHDR_ALIGN(cmsg^.cmsg_len) + SIZE_WSACMSGHDR) > (PtrUInt(msg^.Control.buf) + msg^.Control.len) then begin
|
|
Result := nil;
|
|
end else begin
|
|
Result := LPWSACMSGHDR(PtrUInt(cmsg) + WSA_CMSGHDR_ALIGN(cmsg^.cmsg_len));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function WSA_CMSG_DATA(const cmsg: LPWSACMSGHDR): PByte;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := PByte(PtrUInt(cmsg) + WSA_CMSGDATA_ALIGN(SIZE_WSACMSGHDR));
|
|
end;
|
|
|
|
function WSA_CMSG_SPACE(const Alength: PtrUInt): PtrUInt;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := WSA_CMSGDATA_ALIGN(PtrUInt(SIZE_WSACMSGHDR + WSA_CMSGHDR_ALIGN(Alength)));
|
|
end;
|
|
|
|
function WSA_CMSG_LEN(const Alength: SIZE_T): SIZE_T;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := (WSA_CMSGDATA_ALIGN(SizeOf(WSACMSGHDR)) + Alength);
|
|
end;
|
|
|
|
function RIO_CMSG_BASE_SIZE : SIZE_T;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := WSA_CMSGHDR_ALIGN(sizeof(RIO_CMSG_BUFFER));
|
|
end;
|
|
|
|
function RIO_CMSG_FIRSTHDR(buffer : PRIO_CMSG_BUFFER) : PWSACMSGHDR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if ((buffer)^.TotalLength >= RIO_CMSG_BASE_SIZE) then
|
|
begin
|
|
if (((buffer)^.TotalLength - RIO_CMSG_BASE_SIZE) >= sizeof(WSACMSGHDR)) then begin
|
|
Result := PWSACMSGHDR((PAnsiChar(buffer)) + RIO_CMSG_BASE_SIZE);
|
|
end else begin
|
|
Result := PWSACMSGHDR(nil);
|
|
end;
|
|
end else begin
|
|
Result := PWSACMSGHDR(nil);
|
|
end;
|
|
end;
|
|
|
|
function RIO_CMSG_NEXTHDR(buffer : PRIO_CMSG_BUFFER; cmsg : PWSACMSGHDR) : PWSACMSGHDR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if ((cmsg) = nil) then begin
|
|
Result := RIO_CMSG_FIRSTHDR(buffer);
|
|
end else begin
|
|
if (PAnsiChar(cmsg) + WSA_CMSGHDR_ALIGN((cmsg^.cmsg_len) + sizeof(WSACMSGHDR)) > (PAnsiChar(buffer) + (buffer)^.TotalLength)) then begin
|
|
Result := (PWSACMSGHDR(nil));
|
|
end else begin
|
|
Result :=(PWSACMSGHDR(PAnsiChar(cmsg) + WSA_CMSGHDR_ALIGN(cmsg^.cmsg_len)));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{$ENDIF} // {$IFNDEF WINCE}
|
|
|
|
function IP_MSFILTER_SIZE(const numsrc: DWORD): PtrUInt;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := SIZE_IP_MSFILTER - SIZE_TINADDR + (numsrc*SIZE_TINADDR);
|
|
end;
|
|
|
|
function SS_PORT(ssp: PSockAddrIn): u_short;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if ssp <> nil then begin
|
|
Result := ssp^.sin_port;
|
|
end else begin
|
|
Result := 0;
|
|
end;
|
|
end;
|
|
|
|
//
|
|
// Microsoft-specific IPv4 definitions.
|
|
//
|
|
function IN4_CLASSA(const i : UInt32) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((i and $00000080) = 0);
|
|
end;
|
|
|
|
function IN4_CLASSB(const i : UInt32) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((i and $000000c0) = $00000080);
|
|
end;
|
|
|
|
function IN4_CLASSC(const i : UInt32) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((i and $000000e0) = $000000c0);
|
|
end;
|
|
|
|
function IN4_CLASSD(const i : UInt32) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((i and $000000f0) = $000000e0);
|
|
end;
|
|
|
|
function IN4_MULTICAST(const i : UInt32) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := IN4_CLASSD(i);
|
|
end;
|
|
|
|
function IN4_ADDR_EQUAL(const a, b : PInAddr ) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := a^.S_addr = b^.S_addr;
|
|
end;
|
|
|
|
function IN4_UNALIGNED_ADDR_EQUAL(const a, b : PInAddr ) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := a^.S_addr = b^.S_addr
|
|
end;
|
|
|
|
function IN4_IS_ADDR_UNSPECIFIED(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := a^.S_addr = IN4ADDR_ANY;
|
|
end;
|
|
|
|
function IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := a^.S_addr = IN4ADDR_ANY;
|
|
end;
|
|
|
|
function IN4_IS_ADDR_LOOPBACK(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := PByte(a)^ = $7f; // 127/8
|
|
end;
|
|
|
|
function IN4_IS_UNALIGNED_ADDR_LOOPBACK(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := PByte(a)^ = $7f; // 127/8
|
|
end;
|
|
|
|
function IN4_IS_ADDR_BROADCAST(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := a^.S_addr = IN4ADDR_BROADCAST;
|
|
end;
|
|
|
|
function IN4_IS_UNALIGNED_ADDR_BROADCAST(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := a^.S_addr = IN4ADDR_BROADCAST;
|
|
end;
|
|
|
|
function IN4_IS_ADDR_MULTICAST(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := IN4_MULTICAST(a^.S_addr);
|
|
end;
|
|
|
|
function IN4_IS_UNALIGNED_ADDR_MULTICAST(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := IN4_MULTICAST(a^.S_addr);
|
|
end;
|
|
|
|
function IN4_IS_ADDR_LINKLOCAL(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((a^.s_addr and $ffff) = $fea9); // 169.254/16
|
|
end;
|
|
|
|
function IN4_IS_UNALIGNED_ADDR_LINKLOCAL(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((a^.s_addr and $ffff) = $fea9); // 169.254/16
|
|
end;
|
|
|
|
function IN4_IS_ADDR_SITELOCAL(const a :PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
//UNREFERENCED_PARAMETER(a);
|
|
//
|
|
// For existing scenarios (e.g. ICS) to work as expected, RFC-1918 prefixes
|
|
// are deemed to be global scoped. When appropriate, site border routers
|
|
// must explicitly filter packets with these addresses.
|
|
//
|
|
Result := False;
|
|
end;
|
|
|
|
function IN4_IS_UNALIGNED_ADDR_SITELOCAL(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := IN4_IS_ADDR_SITELOCAL(a);
|
|
end;
|
|
|
|
function IN4_IS_ADDR_RFC1918(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := (((a^.s_addr and $00ff) = $0a) or // 10/8
|
|
((a^.s_addr and $f0ff) = $10ac) or // 172.16/12
|
|
((a^.s_addr and $ffff) = $a8c0)); // 192.168/16
|
|
end;
|
|
|
|
function IN4_IS_UNALIGNED_ADDR_RFC1918(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
Ipv4Address : IN_ADDR;
|
|
begin
|
|
//JPM Notes: Done this way because pointers may not be aligned at all.
|
|
Ipv4Address := a^;
|
|
Result := IN4_IS_ADDR_RFC1918( @Ipv4Address );
|
|
end;
|
|
|
|
function IN4_IS_ADDR_MC_LINKLOCAL(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((a^.s_addr and $ffffff) = $e0); // 224.0.0/24
|
|
end;
|
|
|
|
function IN4_IS_ADDR_MC_ADMINLOCAL(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((a^.s_addr and $ffff) = $ffef); // 239.255/16
|
|
end;
|
|
|
|
function IN4_IS_ADDR_MC_SITELOCAL(const a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((a^.s_addr and $ff) = $ef) and
|
|
(not IN4_IS_ADDR_MC_ADMINLOCAL(a));
|
|
end;
|
|
|
|
function SCOPEID_UNSPECIFIED_INIT: {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result{$IFNDEF WINCE}.Value{$ENDIF} := 0;
|
|
end;
|
|
|
|
function IN4ADDR_ANY_INIT: TInAddr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result.S_addr := 0;
|
|
end;
|
|
|
|
function IN4ADDR_LOOPBACK_INIT: TInAddr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result.S_un_b.s_b1 := $7f;
|
|
Result.S_un_b.s_b2 := $00;
|
|
Result.S_un_b.s_b3 := $00;
|
|
Result.S_un_b.s_b4 := $01;
|
|
end;
|
|
|
|
function IN4ADDR_BROADCAST_INIT: TInAddr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result.S_un_b.s_b1 := $ff;
|
|
Result.S_un_b.s_b2 := $ff;
|
|
Result.S_un_b.s_b3 := $ff;
|
|
Result.S_un_b.s_b4 := $ff;
|
|
end;
|
|
|
|
function IN4ADDR_ALLNODESONLINK_INIT: TInAddr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result.S_un_b.s_b1 := $e0;
|
|
Result.S_un_b.s_b2 := $00;
|
|
Result.S_un_b.s_b3 := $00;
|
|
Result.S_un_b.s_b4 := $01;
|
|
end;
|
|
|
|
function IN4ADDR_ALLROUTERSONLINK_INIT: TInAddr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result.S_un_b.s_b1 := $e0;
|
|
Result.S_un_b.s_b2 := $00;
|
|
Result.S_un_b.s_b3 := $00;
|
|
Result.S_un_b.s_b4 := $02;
|
|
end;
|
|
|
|
function IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT: TInAddr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result.S_un_b.s_b1 := $e0;
|
|
Result.S_un_b.s_b2 := $00;
|
|
Result.S_un_b.s_b3 := $00;
|
|
Result.S_un_b.s_b4 := $16;
|
|
end;
|
|
|
|
function IN4ADDR_ALLTEREDONODESONLINK_INIT: TInAddr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result.S_un_b.s_b1 := $e0;
|
|
Result.S_un_b.s_b2 := $00;
|
|
Result.S_un_b.s_b3 := $00;
|
|
Result.S_un_b.s_b4 := $fd;
|
|
end;
|
|
|
|
function IN4ADDR_LINKLOCALPREFIX_INIT: TInAddr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result.S_un_b.s_b1 := $a9;
|
|
Result.S_un_b.s_b2 := $fe;
|
|
Result.S_un_b.s_b3 := $00;
|
|
Result.S_un_b.s_b4 := $00;
|
|
end;
|
|
|
|
function IN4ADDR_MULTICASTPREFIX_INIT: TInAddr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result.S_un_b.s_b1 := $e0;
|
|
Result.S_un_b.s_b2 := $00;
|
|
Result.S_un_b.s_b3 := $00;
|
|
Result.S_un_b.s_b4 := $00;
|
|
end;
|
|
|
|
procedure IN4ADDR_SETSOCKADDR(a : PSockAddrIn; const addr : PInAddr; const port : USHORT);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
a^.sin_family := AF_INET;
|
|
a^.sin_port := port;
|
|
a^.sin_addr.S_addr := addr^.S_addr;
|
|
FillChar(a^.sin_zero,SizeOf(a^.sin_zero),0);
|
|
end;
|
|
|
|
procedure IN4ADDR_SETANY(a : PSockAddrIn);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
a^.sin_family := AF_INET;
|
|
a^.sin_port := 0;
|
|
a^.sin_addr.S_addr := IN4ADDR_ANY;
|
|
FillChar(a^.sin_zero,SizeOf(a^.sin_zero),0);
|
|
end;
|
|
|
|
procedure IN4ADDR_SETLOOPBACK(a : PSockAddrIn);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
a^.sin_family := AF_INET;
|
|
a^.sin_port := 0;
|
|
a^.sin_addr.S_addr := IN4ADDR_LOOPBACK;
|
|
FillChar(a^.sin_zero,SizeOf(a^.sin_zero),0);
|
|
end;
|
|
|
|
function IN4ADDR_ISANY(const a : PSockAddrIn) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
ASSERT(a^.sin_family = AF_INET);
|
|
Result := IN4_IS_ADDR_UNSPECIFIED(@a^.sin_addr );
|
|
end;
|
|
|
|
function IN4ADDR_ISLOOPBACK(const a : PSockAddrIn) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
ASSERT(a^.sin_family = AF_INET);
|
|
Result := IN4_IS_ADDR_LOOPBACK(@a^.sin_addr);
|
|
end;
|
|
|
|
function IN4ADDR_SCOPE_ID(const a : PSockAddrIn) : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
//SCOPE_ID UnspecifiedScopeId = {0};
|
|
//UNREFERENCED_PARAMETER(a);
|
|
//return UnspecifiedScopeId;
|
|
Result{$IFNDEF WINCE}.Value{$ENDIF} := 0;
|
|
end;
|
|
|
|
function IN4ADDR_ISEQUAL(a, b : PSockAddrIn) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
ASSERT(a^.sin_family = AF_INET);
|
|
Result := (IN4ADDR_SCOPE_ID(a){$IFNDEF WINCE}.Value{$ENDIF} = IN4ADDR_SCOPE_ID(b){$IFNDEF WINCE}.Value{$ENDIF}) and
|
|
IN4_ADDR_EQUAL(@a^.sin_addr , @b^.sin_addr);
|
|
end;
|
|
|
|
function IN4ADDR_ISUNSPECIFIED(a : PSockAddrIn) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
ASSERT(a^.sin_family = AF_INET);
|
|
Result := (IN4ADDR_SCOPE_ID(a){$IFNDEF WINCE}.Value{$ENDIF} = 0) and
|
|
IN4_IS_ADDR_UNSPECIFIED(@a^.sin_addr);
|
|
end;
|
|
|
|
{Important!!! INET_IS_ALIGNED doesn't seem to translate well to
|
|
Delphi. The best I could think of is to make a function
|
|
for testing with specific types. I wish Pascal had an AlignOf function}
|
|
|
|
//#define INET_IS_ALIGNED(Pointer, Type) \
|
|
// (((ULONG_PTR)Pointer & (__builtin_alignof(Type)-1)) == 0)
|
|
|
|
|
|
function INET_IS_ALIGNED_IN_ADDR(Ptr : Pointer) : Boolean;
|
|
type
|
|
{$IFDEF WIN32}
|
|
{$ALIGN ON}
|
|
TempRec = record
|
|
test: IN_ADDR;
|
|
end;
|
|
{$ALIGN OFF}
|
|
{$ELSE}
|
|
//Win64 and WinCE seem to require alignment for API records
|
|
TempRec = record
|
|
test: IN_ADDR;
|
|
end;
|
|
{$ENDIF}
|
|
var
|
|
Alignment : SIZE_T;
|
|
begin
|
|
Alignment := SizeOf(TempRec);
|
|
Result := ((ULONG_PTR(Ptr) and (Alignment - 1)) = 0);
|
|
end;
|
|
|
|
|
|
function INET_IS_ALIGNED_IN6_ADDR(Ptr : Pointer) : Boolean;
|
|
type
|
|
{$IFDEF WIN32}
|
|
{$ALIGN ON}
|
|
TempRec = record
|
|
test: IN6_ADDR;
|
|
end;
|
|
{$ALIGN OFF}
|
|
{$ELSE}
|
|
//Win64 and WinCE seem to require alignment for API records
|
|
TempRec = record
|
|
test: IN6_ADDR;
|
|
end;
|
|
{$ENDIF}
|
|
var
|
|
Alignment : SIZE_T;
|
|
begin
|
|
Alignment := SizeOf(TempRec);
|
|
Result := ((ULONG_PTR(Ptr) and (Alignment - 1)) = 0);
|
|
end;
|
|
|
|
{
|
|
|
|
Routine Description:
|
|
|
|
Determines the scope of an IPv4 unicast address.
|
|
|
|
For existing scenarios (e.g. ICS) to work as expected, RFC-1918 prefixes
|
|
are deemed to be global scoped. When appropriate, site border routers
|
|
must explicitly filter packets with these addresses.
|
|
|
|
Arguments:
|
|
|
|
Address - Supplies the IPv4 unicast address.
|
|
|
|
Return Value:
|
|
|
|
Returns the scope level of the address.
|
|
|
|
Caller IRQL:
|
|
|
|
May be called at PASSIVE through DISPATCH level.
|
|
|
|
--*/
|
|
}
|
|
|
|
function Ipv4UnicastAddressScope(const Address : PUChar) : SCOPE_LEVEL;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
Ipv4Address : IN_ADDR;
|
|
AddrPtr: PInAddr;
|
|
begin
|
|
if not INET_IS_ALIGNED_IN_ADDR(Address) then begin
|
|
Ipv4Address := PInAddr(Address)^;
|
|
AddrPtr := @Ipv4Address;
|
|
end else begin
|
|
AddrPtr := PInAddr(Address);
|
|
end;
|
|
if IN4_IS_ADDR_LINKLOCAL(AddrPtr) or
|
|
IN4_IS_ADDR_LOOPBACK(AddrPtr) then
|
|
begin
|
|
Result := ScopeLevelLink;
|
|
end else begin
|
|
Result := ScopeLevelGlobal;
|
|
end;
|
|
end;
|
|
|
|
{
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Determines the scope of an IPv4 multicast address.
|
|
See RFC 2365.
|
|
|
|
Arguments:
|
|
|
|
Address - Supplies the IPv4 multicast address.
|
|
|
|
Return Value:
|
|
|
|
Returns the scope level of the multicast address.
|
|
|
|
Caller IRQL:
|
|
|
|
May be called at PASSIVE through DISPATCH level.
|
|
|
|
--*/
|
|
}
|
|
function Ipv4MulticastAddressScope(const Address : PUCHAR) : SCOPE_LEVEL;
|
|
var
|
|
Ipv4Address : IN_ADDR;
|
|
AddrPtr : PInAddr;
|
|
begin
|
|
if not INET_IS_ALIGNED_IN_ADDR(Address) then begin
|
|
Ipv4Address := PInAddr(Address)^;
|
|
AddrPtr := @Ipv4Address;
|
|
end else begin
|
|
AddrPtr := PInAddr(Address);
|
|
end;
|
|
if IN4_IS_ADDR_MC_LINKLOCAL(AddrPtr) then begin
|
|
Result := ScopeLevelLink;
|
|
end
|
|
else if IN4_IS_ADDR_MC_ADMINLOCAL(AddrPtr) then begin
|
|
Result := ScopeLevelAdmin;
|
|
end
|
|
else if IN4_IS_ADDR_MC_SITELOCAL(AddrPtr) then begin
|
|
Result := ScopeLevelSite;
|
|
end else begin
|
|
Result := ScopeLevelGlobal;
|
|
end;
|
|
end;
|
|
|
|
{
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Examines an IPv4 address and determines its scope.
|
|
|
|
Arguments:
|
|
|
|
Address - Supplies the address to test.
|
|
|
|
Return Value:
|
|
|
|
Returns the scope level of the address.
|
|
|
|
Caller IRQL:
|
|
|
|
May be called at PASSIVE through DISPATCH level.
|
|
|
|
--*/
|
|
}
|
|
function Ipv4AddressScope(Address : PUChar) : SCOPE_LEVEL;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
Ipv4Address : IN_ADDR;
|
|
begin
|
|
Ipv4Address := PInAddr(Address)^;
|
|
if IN4_IS_ADDR_BROADCAST(@Ipv4Address) then begin
|
|
Result := ScopeLevelLink;
|
|
end
|
|
else if IN4_IS_ADDR_MULTICAST(@Ipv4Address) then begin
|
|
Result := Ipv4MulticastAddressScope(PUCHAR(@Ipv4Address));
|
|
end else begin
|
|
Result := Ipv4UnicastAddressScope(PUCHAR(@Ipv4Address));
|
|
end;
|
|
end;
|
|
|
|
function Ipv4AddressType(Address : PUChar) : NL_ADDRESS_TYPE;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
Ipv4Address : TInAddr;
|
|
begin
|
|
Ipv4Address := PInAddr(Address)^;
|
|
if IN4_IS_ADDR_MULTICAST(@Ipv4Address) then begin
|
|
Result := NlatMulticast;
|
|
Exit;
|
|
end;
|
|
if IN4_IS_ADDR_BROADCAST(@Ipv4Address) then begin
|
|
Result := NlatBroadcast;
|
|
Exit;
|
|
end;
|
|
if IN4_IS_ADDR_UNSPECIFIED(@Ipv4Address) then begin
|
|
Result := NlatUnspecified;
|
|
Exit;
|
|
end;
|
|
//
|
|
// Following prefixes are invalid:
|
|
// 1. 0.0.0.0/8 (except 0.0.0.0/32).
|
|
// 2. 240.0.0.0/4 (except 255.255.255.255/32).
|
|
//
|
|
if ((Ipv4Address.s_addr and $000000ff) = 0) or
|
|
((Ipv4Address.s_addr and $000000f0) = 240) then
|
|
begin
|
|
Result := NlatInvalid;
|
|
Exit;
|
|
end;
|
|
//
|
|
// Loopback and anycast addresses are treated as unicast.
|
|
//
|
|
Result := NlatUnicast;
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
// SCOPE_ID = record
|
|
// union {
|
|
// struct {
|
|
// ULONG Zone : 28;
|
|
// ULONG Level : 4;
|
|
// };
|
|
// ULONG Value;
|
|
// };
|
|
// Value : ULONG;
|
|
// end;
|
|
|
|
function SCOPE_ID_GetZone(const ScopeId : SCOPE_ID) : ULONG;
|
|
begin
|
|
Result := (ScopeId.Value and $FFFFFFF0) shr 4;
|
|
end;
|
|
|
|
procedure SCOPE_ID_SetZone(var ScopeId : SCOPE_ID; Value: ULONG);
|
|
begin
|
|
ScopeId.Value := ((Value and $0FFFFFFF) shl 4) or (ScopeId.Value and $F);
|
|
end;
|
|
|
|
function SCOPE_ID_GetLevel(const ScopeId : SCOPE_ID) : SCOPE_LEVEL;
|
|
begin
|
|
Result := SCOPE_LEVEL(ScopeId.Value and $F);
|
|
end;
|
|
|
|
procedure SCOPE_ID_SetLevel(var ScopeId : SCOPE_ID; Value: ULONG);
|
|
begin
|
|
ScopeId.Value := (ScopeId.Value and $FFFFFFF0) or (Value and $F);
|
|
end;
|
|
|
|
procedure IN4_UNCANONICALIZE_SCOPE_ID(Address : PInAddr; ScopeId : PSCOPE_ID);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
ScopeLevel : SCOPE_LEVEL;
|
|
begin
|
|
ScopeLevel := Ipv4AddressScope(PUCHAR(Address));
|
|
if IN4_IS_ADDR_LOOPBACK(Address) or (ScopeLevel = ScopeLevelGlobal) then begin
|
|
ScopeId^.Value := 0;
|
|
end;
|
|
if SCOPE_ID_GetLevel(ScopeId^) = ScopeLevel then begin
|
|
SCOPE_ID_SetLevel(ScopeId^, 0);
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function IN4_IS_ADDR_6TO4ELIGIBLE(a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := (Ipv4AddressType(PUChar(a)) = NlatUnicast) and
|
|
(not (IN4_IS_ADDR_LOOPBACK(a) or
|
|
IN4_IS_ADDR_LINKLOCAL(a) or
|
|
IN4_IS_ADDR_SITELOCAL(a) or
|
|
IN4_IS_ADDR_RFC1918(a)));
|
|
end;
|
|
|
|
function IN4_IS_UNALIGNED_ADDR_6TO4ELIGIBLE(a : PInAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
Ipv4Address : TInAddr;
|
|
begin
|
|
Ipv4Address := a^;
|
|
Result := IN4_IS_ADDR_6TO4ELIGIBLE(@Ipv4Address);
|
|
end;
|
|
|
|
//
|
|
// Microsoft-specific IPv6 definitions.
|
|
//
|
|
|
|
function IN6_PREFIX_EQUAL(const a, b : PIN6_ADDR; const len : UINT8) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
Bytes : UINT8;
|
|
Bits : UINT8;
|
|
Mask : UINT8;
|
|
begin
|
|
Bytes := len div 8;
|
|
Bits := len mod 8;
|
|
Mask := $ff shl (8 - Bits);
|
|
ASSERT(len <= (SizeOf(IN6_ADDR) * 8));
|
|
Result := CompareMem(a,b,len) and ((Bits = 0) or ((a^.s6_bytes[Bytes] or Mask) = (b^.s6_bytes[Bytes] or Mask)));
|
|
end;
|
|
|
|
function IN6_IS_ADDR_ALLNODESONNODE(a : PIN6_ADDR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := IN6_ADDR_EQUAL(a, @in6addr_allnodesonnode);
|
|
end;
|
|
|
|
function IN6_IS_ADDR_ALLNODESONLINK(a : PIN6_ADDR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := IN6_ADDR_EQUAL(a, @in6addr_allnodesonlink);
|
|
end;
|
|
|
|
function IN6_IS_ADDR_ALLROUTERSONLINK(a : PIN6_ADDR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := IN6_ADDR_EQUAL(a, @in6addr_allroutersonlink);
|
|
end;
|
|
|
|
function IN6_IS_ADDR_SOLICITEDNODE(a : PIN6_ADDR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := IN6_PREFIX_EQUAL(
|
|
a,
|
|
@in6addr_solicitednodemulticastprefix,
|
|
IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH);
|
|
end;
|
|
|
|
function IN6_IS_ADDR_ISATAP(a : PIN6_ADDR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
//
|
|
// Disregard the u/g bit and compare the first byte of the interface id.
|
|
//
|
|
Result := ((a^.s6_words[4] and $fffd) = $0000) and (a^.s6_words[5] = $fe5e);
|
|
end;
|
|
|
|
function IN6_IS_ADDR_6TO4(a : PIN6_ADDR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
//C_ASSERT(IN6ADDR_6TO4PREFIX_LENGTH = RTL_BITS_OF(USHORT));
|
|
Result := (a^.s6_words[0] = in6addr_6to4prefix.s6_words[0]);
|
|
end;
|
|
|
|
function IN6_IS_ADDR_TEREDO(a : PIN6_ADDR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
//C_ASSERT(IN6ADDR_TEREDOPREFIX_LENGTH == 2 * RTL_BITS_OF(USHORT));
|
|
Result := (a^.s6_words[0] = in6addr_teredoprefix.s6_words[0]) and
|
|
(a^.s6_words[1] = in6addr_teredoprefix.s6_words[1]);
|
|
end;
|
|
|
|
function IN6ADDR_ISV4MAPPED(a : PSOCKADDR_IN6) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
ASSERT(a^.sin6_family = AF_INET6);
|
|
Result := IN6_IS_ADDR_V4MAPPED(@a^.sin6_addr);
|
|
end;
|
|
|
|
function IN6ADDR_ISISATAP(a : PSOCKADDR_IN6) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
ASSERT(a^.sin6_family = AF_INET6);
|
|
Result := IN6_IS_ADDR_ISATAP(@a^.sin6_addr);;
|
|
end;
|
|
|
|
function IN6ADDR_IS6TO4(a : PSOCKADDR_IN6) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
ASSERT(a^.sin6_family = AF_INET6);
|
|
Result := IN6_IS_ADDR_6TO4(@a^.sin6_addr);
|
|
end;
|
|
|
|
function IN6ADDR_ISTEREDO(a : PSOCKADDR_IN6) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
ASSERT(a^.sin6_family = AF_INET6);
|
|
Result := IN6_IS_ADDR_TEREDO(@a^.sin6_addr);
|
|
end;
|
|
|
|
function IN6_GET_ADDR_V4MAPPED(Ipv6Address : PIN6_ADDR) : PUCHAR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := PUChar(@Ipv6Address^.s6_words[6]);
|
|
end;
|
|
|
|
function IN6_GET_ADDR_V4COMPAT(Ipv6Address : PIN6_ADDR) : PUCHAR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := PUChar(@Ipv6Address^.s6_words[6]);
|
|
end;
|
|
|
|
function IN6_EXTRACT_V4ADDR_FROM_ISATAP(Ipv6Address : PIN6_ADDR) : PUCHAR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := PUChar(@Ipv6Address^.s6_words[6]);
|
|
end;
|
|
|
|
function IN6_EXTRACT_V4ADDR_FROM_6TO4(Ipv6Address : PIN6_ADDR) : PUCHAR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := PUChar(@Ipv6Address^.s6_words[1]);
|
|
end;
|
|
|
|
procedure IN6_SET_ADDR_V4MAPPED(out a6 : IN6_ADDR; a4 : PInAddr );
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
a6 := in6addr_v4mappedprefix;
|
|
a6.s6_bytes[12] := a4^.S_un_b.s_b1;
|
|
a6.s6_bytes[13] := a4^.S_un_b.s_b2;
|
|
a6.s6_bytes[14] := a4^.S_un_b.s_b3;
|
|
a6.s6_bytes[15] := a4^.S_un_b.s_b4;
|
|
end;
|
|
|
|
procedure IN6_SET_ADDR_V4COMPAT(out a6 : IN6_ADDR; a4 : PInAddr );
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
a6 := in6addr_any;
|
|
a6.s6_bytes[12] := a4^.S_un_b.s_b1;
|
|
a6.s6_bytes[13] := a4^.S_un_b.s_b2;
|
|
a6.s6_bytes[14] := a4^.S_un_b.s_b3;
|
|
a6.s6_bytes[15] := a4^.S_un_b.s_b4;
|
|
end;
|
|
|
|
procedure IN6_SET_ADDR_SOLICITEDNODE(out Multicast : IN6_ADDR; Unicast : PIN6_ADDR);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Multicast := in6addr_solicitednodemulticastprefix;
|
|
Multicast.s6_bytes[13] := Unicast^.s6_bytes[13];
|
|
Multicast.s6_bytes[14] := Unicast^.s6_bytes[14];
|
|
Multicast.s6_bytes[15] := Unicast^.s6_bytes[15];
|
|
end;
|
|
|
|
procedure IN6_SET_ISATAP_IDENTIFIER(Ipv6Address : PIN6_ADDR; Ipv4Address : PInAddr);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if IN4_IS_ADDR_6TO4ELIGIBLE(Ipv4Address) then begin
|
|
Ipv6Address^.s6_words[4] := $0002;
|
|
end else begin
|
|
Ipv6Address^.s6_words[4] := $0000;
|
|
end;
|
|
//
|
|
// 24-bit IANA OUI 00-00-5E and the 8-bit hex value 0xFE.
|
|
// See section 6.1 of RFC 4214.
|
|
//
|
|
Ipv6Address^.s6_words[5] := $FE5E;
|
|
PInAddr(@Ipv6Address^.s6_words[6])^ := Ipv4Address^;
|
|
end;
|
|
|
|
procedure IN6_SET_6TO4_PREFIX(Ipv6Address : PIN6_ADDR; Ipv4Address : PInAddr);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Ipv6Address^.s6_words[0] := $0220;
|
|
PInAddr(@Ipv6Address^.s6_words[1])^ := Ipv4Address^;
|
|
Ipv6Address^.s6_words[3] := $0000;
|
|
end;
|
|
|
|
function Ipv6UnicastAddressScope(const Address : PUChar) : SCOPE_LEVEL;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
{*++
|
|
|
|
Routine Description:
|
|
|
|
Examines a unicast address and determines its scope.
|
|
|
|
Note that v4-compatible and 6to4 addresses are deemed to have global scope;
|
|
it is not legal to derive them from non IN4_IS_ADDR_6TO4ELIGIBLE addresses
|
|
(IPv4 loopback, link-local, site-local, and RFC-1918 addresses).
|
|
|
|
Arguments:
|
|
|
|
Address - Supplies an IPv6 unicast address.
|
|
|
|
Return Value:
|
|
|
|
Returns the scope level of the address.
|
|
|
|
Caller IRQL:
|
|
|
|
May be called at PASSIVE through DISPATCH level.
|
|
|
|
--*}
|
|
var
|
|
Ipv6Address : TIn6Addr;
|
|
AddrPtr : PIn6Addr;
|
|
begin
|
|
if not INET_IS_ALIGNED_IN6_ADDR(Address) then begin
|
|
Ipv6Address := PIn6Addr(Address)^;
|
|
AddrPtr := @Ipv6Address;
|
|
end else begin
|
|
AddrPtr := PIn6Addr(Address);
|
|
end;
|
|
if IN6_IS_ADDR_LINKLOCAL(AddrPtr) or
|
|
IN6_IS_ADDR_LOOPBACK(AddrPtr) then
|
|
begin
|
|
Result := ScopeLevelLink;
|
|
end
|
|
else if IN6_IS_ADDR_SITELOCAL(AddrPtr) then begin
|
|
Result := ScopeLevelSite;
|
|
end else begin
|
|
Result := ScopeLevelGlobal;
|
|
end;
|
|
end;
|
|
|
|
function IN6_MULTICAST_SCOPE(Address : PUCHAR ) : SCOPE_LEVEL;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
Ipv6Address : PIN6_ADDR;
|
|
begin
|
|
Ipv6Address := PIN6_ADDR(Address);
|
|
Result := SCOPE_LEVEL(Ipv6Address^.s6_bytes[1] and $f);
|
|
end;
|
|
|
|
function Ipv6AddressScope(Address : PUCHAR ) : SCOPE_LEVEL;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
{*++
|
|
|
|
Routine Description:
|
|
|
|
Examines an IPv6 address and determines its scope.
|
|
|
|
Arguments:
|
|
|
|
Address - Supplies an IPv6 address.
|
|
|
|
Return Value:
|
|
|
|
Returns the scope level of the address.
|
|
|
|
Caller IRQL:
|
|
|
|
May be called at PASSIVE through DISPATCH level.
|
|
|
|
--*}
|
|
begin
|
|
if IN6_IS_ADDR_MULTICAST(PIn6Addr(Address)) then begin
|
|
Result := IN6_MULTICAST_SCOPE(Address);
|
|
end else begin
|
|
Result := Ipv6UnicastAddressScope(Address);
|
|
end;
|
|
end;
|
|
|
|
function Ipv6AddressType( Address : PUCHAR) : NL_ADDRESS_TYPE;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
Ipv6Address : PIN6_ADDR;
|
|
Ipv4Address : PUCHAR;
|
|
begin
|
|
Ipv6Address := PIN6_ADDR(Address);
|
|
if IN6_IS_ADDR_MULTICAST(Ipv6Address) then begin
|
|
Result := NlatMulticast;
|
|
Exit;
|
|
end;
|
|
if IN6_IS_ADDR_UNSPECIFIED(Ipv6Address) then begin
|
|
Result := NlatUnspecified;
|
|
Exit;
|
|
end;
|
|
|
|
//
|
|
// Extract embedded IPv4 address, if any.
|
|
//
|
|
if IN6_IS_ADDR_ISATAP(Ipv6Address) or
|
|
IN6_IS_ADDR_V4COMPAT(Ipv6Address) or
|
|
IN6_IS_ADDR_V4MAPPED(Ipv6Address) or
|
|
IN6_IS_ADDR_V4TRANSLATED(Ipv6Address) then
|
|
begin
|
|
Ipv4Address := IN6_EXTRACT_V4ADDR_FROM_ISATAP(Ipv6Address);
|
|
end
|
|
else if IN6_IS_ADDR_6TO4(Ipv6Address) then begin
|
|
Ipv4Address := IN6_EXTRACT_V4ADDR_FROM_6TO4(Ipv6Address);
|
|
end else begin
|
|
//
|
|
// Anycast and loopback addresses are treated unicast address.
|
|
//
|
|
Result := NlatUnicast;
|
|
Exit;
|
|
end;
|
|
//
|
|
// Ensure that the embedded IPv4 address is unicast.
|
|
//
|
|
if Ipv4AddressType(Ipv4Address) <> NlatUnicast then begin
|
|
Result := NlatInvalid;
|
|
Exit;
|
|
end;
|
|
Result := NlatUnicast;
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
procedure IN6_UNCANONICALIZE_SCOPE_ID(Address : PIN6_ADDR; ScopeId : PSCOPE_ID);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
ScopeLevel : SCOPE_LEVEL;
|
|
begin
|
|
ScopeLevel := Ipv6AddressScope(PUCHAR(Address));
|
|
if IN6_IS_ADDR_LOOPBACK(Address) or (ScopeLevel = ScopeLevelGlobal) then begin
|
|
ScopeId^.Value := 0;
|
|
end;
|
|
if (SCOPE_LEVEL(ScopeId^.Value shr 28) = ScopeLevel) then begin
|
|
SCOPE_ID_SetLevel(ScopeId^, 0);
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
procedure IN6ADDR_SETSOCKADDR(a : PSOCKADDR_IN6; addr : PIN6_ADDR;
|
|
const scope : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF}; const port : USHORT );
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
a^.sin6_family := AF_INET6;
|
|
a^.sin6_port := port;
|
|
a^.sin6_flowinfo := 0;
|
|
a^.sin6_addr := addr^;
|
|
{$IFDEF WINCE}
|
|
a^.sin6_scope_id := scope;
|
|
{$ELSE}
|
|
a^.a.sin6_scope_struct := scope;
|
|
IN6_UNCANONICALIZE_SCOPE_ID(@a^.sin6_addr, @a^.a.sin6_scope_struct);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
procedure IN6ADDR_SETV4MAPPED(a6 : PSOCKADDR_IN6; a4 : PInAddr;
|
|
const scope : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF}; const port : USHORT );
|
|
begin
|
|
a6^.sin6_family := AF_INET6;
|
|
a6^.sin6_port := port;
|
|
a6^.sin6_flowinfo := 0;
|
|
IN6_SET_ADDR_V4MAPPED(a6^.sin6_addr, a4);
|
|
{$IFDEF WINCE}
|
|
a6^.sin6_scope_id := scope;
|
|
{$ELSE}
|
|
a6^.a.sin6_scope_struct := scope;
|
|
IN4_UNCANONICALIZE_SCOPE_ID(a4, @a6^.a.sin6_scope_struct);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
//
|
|
// Define address-family-independent routines.
|
|
//
|
|
function INET_ADDR_EQUAL(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
const a, b : Pointer) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
Result := IN6_ADDR_EQUAL(PIN6_ADDR(a), PIN6_ADDR(b));
|
|
end else begin
|
|
ASSERT(af = AF_INET);
|
|
Result := IN4_ADDR_EQUAL(PInAddr(a), PInAddr(b));
|
|
end;
|
|
end;
|
|
|
|
function INET_UNALIGNED_ADDR_EQUAL(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
const a, b : Pointer ) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
Result := IN6_ADDR_EQUAL(PIN6_ADDR(a), PIN6_ADDR(b));
|
|
end else begin
|
|
ASSERT(af = AF_INET);
|
|
Result := IN4_UNALIGNED_ADDR_EQUAL(PInAddr(a), PInAddr(b));
|
|
end;
|
|
end;
|
|
|
|
function INET_IS_ADDR_UNSPECIFIED(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
const a : Pointer) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
Result := IN6_IS_ADDR_UNSPECIFIED(PIN6_ADDR(a));
|
|
end else begin
|
|
ASSERT(af = AF_INET);
|
|
Result := IN4_IS_ADDR_UNSPECIFIED(PInAddr(a));
|
|
end;
|
|
end;
|
|
|
|
function INET_IS_UNALIGNED_ADDR_UNSPECIFIED(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
const a : Pointer) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
Result := IN6_IS_ADDR_LOOPBACK(PIN6_ADDR(a));
|
|
end else begin
|
|
ASSERT(af = AF_INET);
|
|
Result := IN4_IS_ADDR_LOOPBACK(PInAddr(a));
|
|
end;
|
|
end;
|
|
|
|
function INET_IS_ADDR_LOOPBACK(const af: {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
const a: Pointer): Boolean;
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
Result := IN6_IS_ADDR_LOOPBACK(PIn6Addr(a));
|
|
end else begin
|
|
ASSERT(af = AF_INET);
|
|
Result := IN4_IS_ADDR_LOOPBACK(PInAddr(a));
|
|
end;
|
|
end;
|
|
|
|
function INET_IS_ADDR_BROADCAST(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
const a : Pointer) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
Result := False;
|
|
end else begin
|
|
ASSERT(af = AF_INET);
|
|
Result := IN4_IS_ADDR_BROADCAST(PInAddr(a));
|
|
end;
|
|
end;
|
|
|
|
function INET_IS_ADDR_MULTICAST(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
const a : Pointer) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
Result := IN6_IS_ADDR_MULTICAST(PIN6_ADDR(a));
|
|
end else begin
|
|
ASSERT(af = AF_INET);
|
|
Result := IN4_IS_ADDR_MULTICAST(PInAddr(a));
|
|
end;
|
|
end;
|
|
|
|
function INET_ADDR_UNSPECIFIED(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF}) : PUCHAR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
Result := PUCHAR(@in6addr_any);
|
|
end else begin
|
|
ASSERT(af = AF_INET);
|
|
Result := PUCHAR(@_in4addr_any);
|
|
end;
|
|
end;
|
|
|
|
procedure INET_SET_ADDRESS( Family : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
Address : PUCHAR; Value : PUCHAR);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (Family = AF_INET6) then begin
|
|
PIn6Addr(Address)^ := PIn6Addr(Value)^;
|
|
end else begin
|
|
ASSERT(Family = AF_INET);
|
|
PInAddr(Address)^ := PInAddr(Value)^;
|
|
end;
|
|
end;
|
|
|
|
function INET_ADDR_LENGTH(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF} ) : Size_t;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
Result := SizeOf(IN6_ADDR);
|
|
end else begin
|
|
ASSERT(af = AF_INET);
|
|
Result := SizeOf(IN_ADDR);
|
|
end;
|
|
end;
|
|
|
|
function INET_SOCKADDR_LENGTH(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF}) : Size_t;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
Result := SizeOf(SOCKADDR_IN6);
|
|
end else begin
|
|
ASSERT(af = AF_INET);
|
|
Result := SizeOf(SOCKADDR_IN);
|
|
end;
|
|
end;
|
|
//
|
|
function IN6ADDR_ANY_INIT: TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
end;
|
|
|
|
function IN6ADDR_LOOPBACK_INIT: TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
Result.s6_bytes[15] := 1;
|
|
end;
|
|
|
|
function IN6ADDR_ALLNODESONNODE_INIT : TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
|
|
Result.s6_bytes[0] := $ff;
|
|
Result.s6_bytes[1] := $01;
|
|
Result.s6_bytes[15] := $01;
|
|
end;
|
|
|
|
function IN6ADDR_ALLNODESONLINK_INIT : TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
|
|
Result.s6_bytes[0] := $ff;
|
|
Result.s6_bytes[1] := $02;
|
|
Result.s6_bytes[15] := $01;
|
|
end;
|
|
|
|
function IN6ADDR_ALLROUTERSONLINK_INIT : TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
|
|
Result.s6_bytes[0] := $ff;
|
|
Result.s6_bytes[1] := $02;
|
|
Result.s6_bytes[15] := $02;
|
|
end;
|
|
|
|
function IN6ADDR_ALLMLDV2ROUTERSONLINK_INIT : TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
|
|
Result.s6_bytes[0] := $ff;
|
|
Result.s6_bytes[1] := $02;
|
|
Result.s6_bytes[15] := $16;
|
|
end;
|
|
|
|
function IN6ADDR_TEREDOINITIALLINKLOCALADDRESS_INIT : TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
|
|
Result.s6_bytes[0] := $fe;
|
|
Result.s6_bytes[1] := $80;
|
|
|
|
Result.s6_bytes[10] := $ff;
|
|
Result.s6_bytes[11] := $ff;
|
|
Result.s6_bytes[12] := $ff;
|
|
Result.s6_bytes[13] := $ff;
|
|
Result.s6_bytes[14] := $ff;
|
|
Result.s6_bytes[15] := $fe;
|
|
end;
|
|
|
|
//
|
|
// The old link local address for XP-SP2/Win2K3 machines.
|
|
//
|
|
function IN6ADDR_TEREDOOLDLINKLOCALADDRESSXP_INIT : TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
|
|
Result.s6_bytes[0] := $fe;
|
|
Result.s6_bytes[1] := $80;
|
|
|
|
Result.s6_bytes[10] := Ord('T');
|
|
Result.s6_bytes[11] := Ord('E');
|
|
Result.s6_bytes[12] := Ord('R');
|
|
Result.s6_bytes[13] := Ord('E');
|
|
Result.s6_bytes[14] := Ord('D');
|
|
Result.s6_bytes[15] := Ord('O');
|
|
end;
|
|
|
|
//
|
|
// The old link local address for Vista Beta-2 and earlier machines.
|
|
//
|
|
function IN6ADDR_TEREDOOLDLINKLOCALADDRESSVISTA_INIT : TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
|
|
Result.s6_bytes[0] := $fe;
|
|
Result.s6_bytes[1] := $80;
|
|
|
|
Result.s6_bytes[10] := $ff;
|
|
Result.s6_bytes[11] := $ff;
|
|
Result.s6_bytes[12] := $ff;
|
|
Result.s6_bytes[13] := $ff;
|
|
Result.s6_bytes[14] := $ff;
|
|
Result.s6_bytes[15] := $ff;
|
|
end;
|
|
|
|
function IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_INIT : IN6_ADDR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
Result.s6_bytes[0] := $FF;
|
|
Result.s6_bytes[1] := $02;
|
|
Result.s6_bytes[11] := $01;
|
|
Result.s6_bytes[12] := $ff;
|
|
end;
|
|
|
|
function IN6ADDR_V4MAPPEDPREFIX_INIT : TIn6Addr;
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
Result.s6_bytes[10] := $ff;
|
|
Result.s6_bytes[11] := $ff;
|
|
end;
|
|
|
|
function IN6ADDR_6TO4PREFIX_INIT : TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
|
|
Result.s6_bytes[0] := $20;
|
|
Result.s6_bytes[1] := $02;
|
|
end;
|
|
|
|
function IN6ADDR_TEREDOPREFIX_INIT : TIn6Addr;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
|
|
Result.s6_bytes[0] := $20;
|
|
Result.s6_bytes[0] := $01;
|
|
end;
|
|
|
|
procedure IN6ADDR_SETANY(sa: PSockAddrIn6);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if sa <> nil then begin
|
|
sa^.sin6_family := AF_INET6;
|
|
sa^.sin6_port := 0;
|
|
sa^.sin6_flowinfo := 0;
|
|
PULONG(@sa^.sin6_addr.s6_bytes[0])^ := 0;
|
|
PULONG(@sa^.sin6_addr.s6_bytes[4])^ := 0;
|
|
PULONG(@sa^.sin6_addr.s6_bytes[8])^ := 0;
|
|
PULONG(@sa^.sin6_addr.s6_bytes[12])^ := 0;
|
|
end;
|
|
end;
|
|
|
|
procedure IN6ADDR_SETLOOPBACK(sa: PSockAddrIn6);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if sa <> nil then begin
|
|
sa^.sin6_family := AF_INET6;
|
|
sa^.sin6_port := 0;
|
|
sa^.sin6_flowinfo := 0;
|
|
PULONG(@sa^.sin6_addr.s6_bytes[0])^ := 0;
|
|
PULONG(@sa^.sin6_addr.s6_bytes[4])^ := 0;
|
|
PULONG(@sa^.sin6_addr.s6_bytes[8])^ := 0;
|
|
PULONG(@sa^.sin6_addr.s6_bytes[12])^ := 1;
|
|
end;
|
|
end;
|
|
|
|
function IN6ADDR_ISANY(sa: PSockAddrIn6): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if sa <> nil then begin
|
|
Result := (sa^.sin6_family = AF_INET6) and
|
|
(PULONG(@sa^.sin6_addr.s6_bytes[0])^ = 0) and
|
|
(PULONG(@sa^.sin6_addr.s6_bytes[4])^ = 0) and
|
|
(PULONG(@sa^.sin6_addr.s6_bytes[8])^ = 0) and
|
|
(PULONG(@sa^.sin6_addr.s6_bytes[12])^ = 0);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6ADDR_ISLOOPBACK(sa: PSockAddrIn6): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if sa <> nil then begin
|
|
Result := (sa^.sin6_family = AF_INET6) and
|
|
(PULONG(@sa^.sin6_addr.s6_bytes[0])^ = 0) and
|
|
(PULONG(@sa^.sin6_addr.s6_bytes[4])^ = 0) and
|
|
(PULONG(@sa^.sin6_addr.s6_bytes[8])^ = 0) and
|
|
(PULONG(@sa^.sin6_addr.s6_bytes[12])^ = 1);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_ADDR_EQUAL(const a: PIn6Addr; const b: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := SysUtils.CompareMem(a, b, SIZE_TIN6ADDR);
|
|
end;
|
|
|
|
function IN6_IS_ADDR_UNSPECIFIED(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := IN6_ADDR_EQUAL(a, @in6addr_any);
|
|
end;
|
|
|
|
function IN6_IS_ADDR_LOOPBACK(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := IN6_ADDR_EQUAL(a, @in6addr_loopback);
|
|
end;
|
|
|
|
function IN6_IS_ADDR_MULTICAST(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := (a^.s6_bytes[0] = $FF);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_EUI64(const a : PIn6Addr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
//
|
|
// Format prefixes 001 through 111, except for multicast.
|
|
//
|
|
begin
|
|
if a <> nil then begin
|
|
Result := ((a^.s6_bytes[0] and $e0) <> 0 ) and (not IN6_IS_ADDR_MULTICAST(a));
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_SUBNET_ROUTER_ANYCAST(const a : PIn6Addr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
//
|
|
// Is this the subnet router anycast address?
|
|
// See RFC 2373.
|
|
//
|
|
begin
|
|
if a <> nil then begin
|
|
Result := IN6_IS_ADDR_EUI64(a) and (a^.s6_words[4] = 0) and
|
|
(a^.s6_words[5] = 0) and (a^.s6_words[6]=0) and (a^.s6_words[7]=0);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_SUBNET_RESERVED_ANYCAST(const a: PIn6Addr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := IN6_IS_ADDR_EUI64(a) and (a^.s6_words[4] = $fffd) and
|
|
(a^.s6_words[5] = $ffff) and (a^.s6_words[6] = $ffff) and
|
|
((a^.s6_words[7] and $80ff) = $80ff);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_ANYCAST(const a: PIn6Addr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := IN6_IS_ADDR_SUBNET_RESERVED_ANYCAST(a) or IN6_IS_ADDR_SUBNET_ROUTER_ANYCAST(a);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_LINKLOCAL(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := (a^.s6_bytes[0] = $FE) and ((a^.s6_bytes[1] and $C0) = $80);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_SITELOCAL(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := (a^.s6_bytes[0] = $FE) and ((a^.s6_bytes[1] and $C0) = $C0);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_V4MAPPED(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := (a^.s6_words[0] = 0) and
|
|
(a^.s6_words[1] = 0) and
|
|
(a^.s6_words[2] = 0) and
|
|
(a^.s6_words[3] = 0) and
|
|
(a^.s6_words[4] = 0) and
|
|
(a^.s6_words[5] = $FFFF);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_V4COMPAT(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := (a^.s6_words[0] = 0) and
|
|
(a^.s6_words[1] = 0) and
|
|
(a^.s6_words[2] = 0) and
|
|
(a^.s6_words[3] = 0) and
|
|
(a^.s6_words[4] = 0) and
|
|
(a^.s6_words[5] = 0) and
|
|
not ((a^.s6_words[6] = 0) and (a^.s6_bytes[14] = 0) and
|
|
((a^.s6_bytes[15] = 0) or (a^.s6_bytes[15] = 1)));
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_V4TRANSLATED(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((a^.s6_words[0] = 0) and
|
|
(a^.s6_words[1] = 0) and
|
|
(a^.s6_words[2] = 0) and
|
|
(a^.s6_words[3] = 0) and
|
|
(a^.s6_words[4] = $ffff) and
|
|
(a^.s6_words[5] = 0));
|
|
end;
|
|
|
|
procedure INETADDR_SETSOCKADDR(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
a : PSOCKADDR; addr : Pointer; const scope : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF}; const port : USHORT);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
var
|
|
addr4 : IN_ADDR;
|
|
begin
|
|
if (af = AF_INET6) then begin
|
|
IN6ADDR_SETSOCKADDR(PSOCKADDR_IN6( a), PIN6_ADDR( addr ), scope, port);
|
|
end else begin
|
|
addr4 := PInAddr(addr)^;
|
|
ASSERT(af = AF_INET);
|
|
IN4ADDR_SETSOCKADDR(PSockAddrIn(a),PInAddr( @addr4), port);
|
|
end;
|
|
end;
|
|
|
|
procedure INETADDR_SETANY(a : PSOCKADDR);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
IN6ADDR_SETANY(PSOCKADDR_IN6(a));
|
|
end else begin
|
|
ASSERT(a^.sa_family = AF_INET);
|
|
IN4ADDR_SETANY(PSockAddrIn(a));
|
|
end;
|
|
end;
|
|
|
|
procedure INETADDR_SETLOOPBACK(a : PSOCKADDR);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
IN6ADDR_SETLOOPBACK(PSOCKADDR_IN6(a));
|
|
end else begin
|
|
ASSERT(a^.sa_family = AF_INET);
|
|
IN4ADDR_SETLOOPBACK(PSockAddrIn(a));
|
|
end;
|
|
end;
|
|
|
|
function INETADDR_ISANY(const a : PSOCKADDR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
Result := IN6ADDR_ISANY(PSOCKADDR_IN6(a));
|
|
end else begin
|
|
ASSERT(a^.sa_family = AF_INET);
|
|
Result := IN4ADDR_ISANY(PSockAddrIn(a));
|
|
end;
|
|
end;
|
|
|
|
function INETADDR_ISLOOPBACK(const a : PSockAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
Result := IN6ADDR_ISLOOPBACK(PSOCKADDR_IN6(a));
|
|
end else begin
|
|
ASSERT(a^.sa_family = AF_INET);
|
|
Result := IN4ADDR_ISLOOPBACK(PSockAddrIn(a));
|
|
end;
|
|
end;
|
|
|
|
function INETADDR_ISV4MAPPED(const a : PSockAddr) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
Result := IN6ADDR_ISV4MAPPED(PSOCKADDR_IN6(a));
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function NL_ADDR_EQUAL(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
const sa : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
|
|
const aa : PUCHAR;
|
|
const sb : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
|
|
const ab : PUCHAR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((sa{$IFNDEF WINCE}.Value{$ENDIF} = sb{$IFNDEF WINCE}.Value{$ENDIF}) and
|
|
INET_ADDR_EQUAL(af, aa, ab));
|
|
end;
|
|
|
|
function NL_IS_ADDR_UNSPECIFIED(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
|
|
const s : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
|
|
const a : PUCHAR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := ((s{$IFNDEF WINCE}.Value{$ENDIF} = 0) and INET_IS_ADDR_UNSPECIFIED(af, a));
|
|
end;
|
|
|
|
function IN6ADDR_ISEQUAL(const a,b : PSOCKADDR_IN6 ) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
ASSERT(a^.sin6_family = AF_INET6);
|
|
Result := (a^.{$IFNDEF WINCE}a.{$ENDIF}sin6_scope_id = b^.{$IFNDEF WINCE}a.{$ENDIF}sin6_scope_id) and
|
|
IN6_ADDR_EQUAL(@a^.sin6_addr, @b^.sin6_addr);
|
|
end;
|
|
|
|
function INETADDR_ISEQUAL(const a,b : PSOCKADDR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
Result := (b^.sa_family = AF_INET6) and
|
|
IN6ADDR_ISEQUAL(PSOCKADDR_IN6(a), PSOCKADDR_IN6(b));
|
|
end else begin
|
|
ASSERT(a^.sa_family = AF_INET);
|
|
Result := (b^.sa_family = AF_INET) and
|
|
IN4ADDR_ISEQUAL(PSOCKADDR_IN(a), PSOCKADDR_IN(b));
|
|
end;
|
|
end;
|
|
|
|
function IN6ADDR_ISUNSPECIFIED(a : PSOCKADDR_IN6) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
ASSERT(a^.sin6_family = AF_INET6);
|
|
Result := (a^.{$IFNDEF WINCE}a.{$ENDIF}sin6_scope_id = 0) and
|
|
IN6_IS_ADDR_UNSPECIFIED(@a^.sin6_addr);
|
|
end;
|
|
|
|
function INETADDR_ISUNSPECIFIED(const a : PSOCKADDR) : Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
Result := IN6ADDR_ISUNSPECIFIED( PSOCKADDR_IN6(a));
|
|
end else begin
|
|
ASSERT(a^.sa_family = AF_INET);
|
|
Result := IN4ADDR_ISUNSPECIFIED(PSOCKADDR_IN(a));
|
|
end;
|
|
end;
|
|
|
|
function INETADDR_SCOPE_ID(const a : PSOCKADDR) : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
Result := PSOCKADDR_IN6(a)^.{$IFDEF WINCE}sin6_scope_id{$ELSE}a.sin6_scope_struct{$ENDIF};
|
|
end else begin
|
|
ASSERT(a^.sa_family = AF_INET);
|
|
Result := IN4ADDR_SCOPE_ID(PSOCKADDR_IN(a));
|
|
end;
|
|
end;
|
|
|
|
function INETADDR_PORT(const a : PSOCKADDR) : USHORT;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
Result := PSOCKADDR_IN6(a)^.sin6_port;
|
|
end else begin
|
|
ASSERT(a^.sa_family = AF_INET);
|
|
Result := PSOCKADDR_IN(a)^.sin_port;
|
|
end;
|
|
end;
|
|
|
|
function INETADDR_ADDRESS(const a : PSOCKADDR) : PUCHAR;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
Result := PUCHAR(@(PSOCKADDR_IN6(a))^.sin6_addr);
|
|
end else begin
|
|
ASSERT(a^.sa_family = AF_INET);
|
|
Result := PUCHAR(@(PSOCKADDR_IN(a))^.sin_addr);
|
|
end;
|
|
end;
|
|
|
|
procedure INETADDR_SET_PORT(const a : PSOCKADDR; Port : USHORT);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
a^.sin_port := Port;
|
|
end;
|
|
|
|
procedure INETADDR_SET_ADDRESS(const a : PSOCKADDR; Address : PUCHAR);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (a^.sa_family = AF_INET6) then begin
|
|
PSOCKADDR_IN6(a)^.sin6_addr := PIN6_ADDR(Address)^;
|
|
end else begin
|
|
ASSERT(PSOCKADDR_IN(a)^.sa_family = AF_INET);
|
|
PSOCKADDR_IN(a)^.sin_addr := PInAddr(Address)^;
|
|
end;
|
|
end;
|
|
|
|
{$IFNDEF WINCE}
|
|
procedure INET_UNCANONICALIZE_SCOPE_ID( AddressFamily : ADDRESS_FAMILY;
|
|
Address : PUCHAR; ScopeId : PSCOPE_ID);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if (AddressFamily = AF_INET6) then begin
|
|
IN6_UNCANONICALIZE_SCOPE_ID(PIn6Addr( Address), ScopeId);
|
|
end else begin
|
|
IN4_UNCANONICALIZE_SCOPE_ID(PInAddr( Address), ScopeId);
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function IN6_IS_ADDR_MC_NODELOCAL(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := IN6_IS_ADDR_MULTICAST(a) and ((a^.s6_bytes[1] and $F) = 1);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_MC_LINKLOCAL(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := IN6_IS_ADDR_MULTICAST(a) and ((a^.s6_bytes[1] and $F) = 2);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_MC_SITELOCAL(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := IN6_IS_ADDR_MULTICAST(a) and ((a^.s6_bytes[1] and $F) = 5);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_MC_ORGLOCAL(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := IN6_IS_ADDR_MULTICAST(a) and ((a^.s6_bytes[1] and $F) = 8);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function IN6_IS_ADDR_MC_GLOBAL(const a: PIn6Addr): Boolean;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
if a <> nil then begin
|
|
Result := IN6_IS_ADDR_MULTICAST(a) and ((a^.s6_bytes[1] and $F) = $E);
|
|
end else begin
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
procedure IN6_SET_ADDR_UNSPECIFIED(a : PIN6_ADDR);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(a^.s6_bytes, SizeOf(IN6_ADDR), 0 );
|
|
end;
|
|
|
|
procedure IN6_SET_ADDR_LOOPBACK(a : PIN6_ADDR);
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
System.FillChar(a^.s6_bytes, SizeOf(IN6_ADDR), 0 );
|
|
a^.s6_bytes[15] := 1;
|
|
end;
|
|
|
|
// A macro convenient for setting up NETBIOS SOCKADDRs.
|
|
procedure SET_NETBIOS_SOCKADDR(snb : PSockAddrNB; const SnbType : Word; const Name : PAnsiChar; const Port : AnsiChar);
|
|
var
|
|
len : {$IFDEF FPC}sizeint{$ELSE}DWord{$ENDIF};
|
|
begin
|
|
if snb <> nil then begin
|
|
snb^.snb_family := AF_NETBIOS;
|
|
snb^.snb_type := SnbType;
|
|
len := {$IFDEF HAS_AnsiStrings_StrLen}AnsiStrings.{$ENDIF}StrLen(Name);
|
|
if len >= NETBIOS_NAME_LENGTH-1 then begin
|
|
System.Move(Name^, snb^.snb_name, NETBIOS_NAME_LENGTH-1);
|
|
end else begin
|
|
if len > 0 then begin
|
|
System.Move(Name^, snb^.snb_name, LongInt(len));
|
|
end;
|
|
System.FillChar((PAnsiChar(@snb^.snb_name)+len)^, NETBIOS_NAME_LENGTH-1-len, ' '); {Do not Localize}
|
|
end;
|
|
snb^.snb_name[NETBIOS_NAME_LENGTH-1] := Port;
|
|
end;
|
|
end;
|
|
|
|
function GROUP_FILTER_SIZE(const numsrc : DWord) : PtrUInt;
|
|
{$IFDEF USE_INLINE}inline;{$ENDIF}
|
|
begin
|
|
Result := (SIZE_GROUP_FILTER - SIZE_SOCKADDR_STORAGE) + (numsrc * SIZE_SOCKADDR_STORAGE);
|
|
end;
|
|
|
|
initialization
|
|
scopeid_unspecified := SCOPEID_UNSPECIFIED_INIT;
|
|
|
|
_in4addr_any := IN4ADDR_ANY_INIT;
|
|
_in4addr_loopback := IN4ADDR_LOOPBACK_INIT;
|
|
_in4addr_broadcast := IN4ADDR_BROADCAST_INIT;
|
|
in4addr_allnodesonlink := IN4ADDR_ALLNODESONLINK_INIT;
|
|
in4addr_allroutersonlink := IN4ADDR_ALLROUTERSONLINK_INIT;
|
|
in4addr_alligmpv3routersonlink := IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT;
|
|
in4addr_allteredohostsonlink := IN4ADDR_ALLTEREDONODESONLINK_INIT;
|
|
in4addr_linklocalprefix := IN4ADDR_LINKLOCALPREFIX_INIT;
|
|
in4addr_multicastprefix := IN4ADDR_MULTICASTPREFIX_INIT;
|
|
|
|
in6addr_any := IN6ADDR_ANY_INIT;
|
|
in6addr_loopback := IN6ADDR_LOOPBACK_INIT;
|
|
in6addr_allnodesonnode := IN6ADDR_ALLNODESONNODE_INIT;
|
|
in6addr_allnodesonlink := IN6ADDR_ALLNODESONLINK_INIT;
|
|
in6addr_allroutersonlink := IN6ADDR_ALLROUTERSONLINK_INIT;
|
|
in6addr_solicitednodemulticastprefix := IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_INIT;
|
|
in6addr_v4mappedprefix := IN6ADDR_V4MAPPEDPREFIX_INIT;
|
|
in6addr_6to4prefix := IN6ADDR_6TO4PREFIX_INIT;
|
|
in6addr_teredoprefix := IN6ADDR_TEREDOPREFIX_INIT;
|
|
|
|
InitializeStubs;
|
|
|
|
end.
|
|
|