1 {******************************************************************************}
2 { }
3 { Winsock2 Options and Extensions API interface Unit for Object Pascal }
4 { }
5 { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft }
6 { Corporation. All Rights Reserved. }
7 { }
8 { The original file is: mswsock.h, released June 2000. The original Pascal }
9 { code is: MSWSock.pas, released December 2000. The initial developer of the }
10 { Pascal code is Marcel van Brakel (brakelm att chello dott nl). }
11 { }
12 { Portions created by Marcel van Brakel are Copyright (C) 1999-2001 }
13 { Marcel van Brakel. All Rights Reserved. }
14 { }
15 { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
16 { }
17 { You may retrieve the latest version of this file at the Project JEDI }
18 { APILIB home page, located at http://jedi-apilib.sourceforge.net }
19 { }
20 { The contents of this file are used with permission, subject to the Mozilla }
21 { Public License Version 1.1 (the "License"); you may not use this file except }
22 { in compliance with the License. You may obtain a copy of the License at }
23 { http://www.mozilla.org/MPL/MPL-1.1.html }
24 { }
25 { Software distributed under the License is distributed on an "AS IS" basis, }
26 { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
27 { the specific language governing rights and limitations under the License. }
28 { }
29 { Alternatively, the contents of this file may be used under the terms of the }
30 { GNU Lesser General Public License (the "LGPL License"), in which case the }
31 { provisions of the LGPL License are applicable instead of those above. }
32 { If you wish to allow use of your version of this file only under the terms }
33 { of the LGPL License and not to allow others to use your version of this file }
34 { under the MPL, indicate your decision by deleting the provisions above and }
35 { replace them with the notice and other provisions required by the LGPL }
36 { License. If you do not delete the provisions above, a recipient may use }
37 { your version of this file under either the MPL or the LGPL License. }
38 { }
39 { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
40 { }
41 {******************************************************************************}
42
43 // $Id: JwaMSWSock.pas,v 1.10 2007/09/05 11:58:51 dezipaitor Exp $
44
45 {$IFNDEF JWA_OMIT_SECTIONS}
46 unit JwaMSWSock;
47
48 {$WEAKPACKAGEUNIT}
49 {$ENDIF JWA_OMIT_SECTIONS}
50
51 {$HPPEMIT ''}
52 {$HPPEMIT '#include "mswsock.h"'}
53 {$HPPEMIT ''}
54
55 {$IFNDEF JWA_OMIT_SECTIONS}
56 {$I jediapilib.inc}
57
58 interface
59
60 uses
61 JwaWinType, JwaWinBase, JwaWinSock2;
62 {$ENDIF JWA_OMIT_SECTIONS}
63
64 {$IFNDEF JWA_IMPLEMENTATIONSECTION}
65
66 //
67 // Options for connect and disconnect data and options. Used only by
68 // non-TCP/IP transports such as DECNet, OSI TP4, etc.
69 //
70
71 const
72 SO_CONNDATA = $7000;
73 {$EXTERNALSYM SO_CONNDATA}
74 SO_CONNOPT = $7001;
75 {$EXTERNALSYM SO_CONNOPT}
76 SO_DISCDATA = $7002;
77 {$EXTERNALSYM SO_DISCDATA}
78 SO_DISCOPT = $7003;
79 {$EXTERNALSYM SO_DISCOPT}
80 SO_CONNDATALEN = $7004;
81 {$EXTERNALSYM SO_CONNDATALEN}
82 SO_CONNOPTLEN = $7005;
83 {$EXTERNALSYM SO_CONNOPTLEN}
84 SO_DISCDATALEN = $7006;
85 {$EXTERNALSYM SO_DISCDATALEN}
86 SO_DISCOPTLEN = $7007;
87 {$EXTERNALSYM SO_DISCOPTLEN}
88
89 //
90 // Option for opening sockets for synchronous access.
91 //
92
93 const
94 SO_OPENTYPE = $7008;
95 {$EXTERNALSYM SO_OPENTYPE}
96
97 SO_SYNCHRONOUS_ALERT = $10;
98 {$EXTERNALSYM SO_SYNCHRONOUS_ALERT}
99 SO_SYNCHRONOUS_NONALERT = $20;
100 {$EXTERNALSYM SO_SYNCHRONOUS_NONALERT}
101
102 //
103 // Other NT-specific options.
104 //
105
106 const
107 SO_MAXDG = $7009;
108 {$EXTERNALSYM SO_MAXDG}
109 SO_MAXPATHDG = $700A;
110 {$EXTERNALSYM SO_MAXPATHDG}
111 SO_UPDATE_ACCEPT_CONTEXT = $700B;
112 {$EXTERNALSYM SO_UPDATE_ACCEPT_CONTEXT}
113 SO_CONNECT_TIME = $700C;
114 {$EXTERNALSYM SO_CONNECT_TIME}
115 SO_UPDATE_CONNECT_CONTEXT = $7010;
116 {$EXTERNALSYM SO_UPDATE_CONNECT_CONTEXT}
117
118 //
119 // TCP options.
120 //
121
122 const
123 TCP_BSDURGENT = $7000;
124 {$EXTERNALSYM TCP_BSDURGENT}
125
126 //
127 // MS Transport Provider IOCTL to control
128 // reporting PORT_UNREACHABLE messages
129 // on UDP sockets via recv/WSARecv/etc.
130 // Path TRUE in input buffer to enable (default if supported),
131 // FALSE to disable.
132 //
133
134 SIO_UDP_CONNRESET = IOC_IN or IOC_VENDOR or 12;
135 {$EXTERNALSYM SIO_UDP_CONNRESET}
136
137 //
138 // Microsoft extended APIs.
139 //
140
WSARecvExnull141 function WSARecvEx(s: TSocket; buf: PChar; len: Integer; var flags: Integer): Integer; stdcall;
142 {$EXTERNALSYM WSARecvEx}
143
144 type
145 _TRANSMIT_FILE_BUFFERS = record
146 Head: LPVOID;
147 HeadLength: DWORD;
148 Tail: LPVOID;
149 TailLength: DWORD;
150 end;
151 {$EXTERNALSYM _TRANSMIT_FILE_BUFFERS}
152 TRANSMIT_FILE_BUFFERS = _TRANSMIT_FILE_BUFFERS;
153 {$EXTERNALSYM TRANSMIT_FILE_BUFFERS}
154 PTRANSMIT_FILE_BUFFERS = ^TRANSMIT_FILE_BUFFERS;
155 {$EXTERNALSYM PTRANSMIT_FILE_BUFFERS}
156 LPTRANSMIT_FILE_BUFFERS = ^TRANSMIT_FILE_BUFFERS;
157 {$EXTERNALSYM LPTRANSMIT_FILE_BUFFERS}
158 TTransmitFileBuffers = TRANSMIT_FILE_BUFFERS;
159 PTransmitFileBuffers = LPTRANSMIT_FILE_BUFFERS;
160
161 const
162 TF_DISCONNECT = $01;
163 {$EXTERNALSYM TF_DISCONNECT}
164 TF_REUSE_SOCKET = $02;
165 {$EXTERNALSYM TF_REUSE_SOCKET}
166 TF_WRITE_BEHIND = $04;
167 {$EXTERNALSYM TF_WRITE_BEHIND}
168 TF_USE_DEFAULT_WORKER = $00;
169 {$EXTERNALSYM TF_USE_DEFAULT_WORKER}
170 TF_USE_SYSTEM_THREAD = $10;
171 {$EXTERNALSYM TF_USE_SYSTEM_THREAD}
172 TF_USE_KERNEL_APC = $20;
173 {$EXTERNALSYM TF_USE_KERNEL_APC}
174
TransmitFilenull175 function TransmitFile(hSocket: TSocket; hFile: HANDLE; nNumberOfBytesToWrite,
176 nNumberOfBytesPerSend: DWORD; lpOverlapped: POVERLAPPED;
177 lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS; dwReserved: DWORD): BOOL; stdcall;
178 {$EXTERNALSYM TransmitFile}
179
AcceptExnull180 function AcceptEx(sListenSocket, sAcceptSocket: TSocket; lpOutputBuffer: LPVOID;
181 dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
182 var lpdwBytesReceived: DWORD; lpOverlapped: POVERLAPPED): BOOL; stdcall;
183 {$EXTERNALSYM AcceptEx}
184
185 procedure GetAcceptExSockaddrs(lpOutputBuffer: LPVOID; dwReceiveDataLength,
186 dwLocalAddressLength, dwRemoteAddressLength: DWORD; var LocalSockaddr: LPSOCKADDR;
187 var LocalSockaddrLength: Integer; var RemoteSockaddr: LPSOCKADDR;
188 var RemoteSockaddrLength: Integer); stdcall;
189 {$EXTERNALSYM GetAcceptExSockaddrs}
190
191 //
192 // "QueryInterface" versions of the above APIs.
193 //
194
195 type
Socketnull196 LPFN_TRANSMITFILE = function(hSocket: TSocket; hFile: HANDLE; nNumberOfBytesToWrite,
197 nNumberOfBytesPerSend: DWORD; lpOverlapped: POVERLAPPED;
198 lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS; dwReserved: DWORD): BOOL; stdcall;
199 {$EXTERNALSYM LPFN_TRANSMITFILE}
200 TFnTransmitFile = LPFN_TRANSMITFILE;
201
202 const
203 WSAID_TRANSMITFILE: TGUID = (
204 D1:$b5367df0; D2:$cbac; D3:$11cf; D4:($95, $ca, $00, $80, $5f, $48, $a1, $92));
205 {$EXTERNALSYM WSAID_TRANSMITFILE}
206
207 type
ListenSocketnull208 LPFN_ACCEPTEX = function(sListenSocket, sAcceptSocket: TSocket; lpOutputBuffer: LPVOID;
209 dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
210 var lpdwBytesReceived: DWORD; lpOverlapped: POVERLAPPED): BOOL; stdcall;
211 {$EXTERNALSYM LPFN_ACCEPTEX}
212 TFnAcceptEx = LPFN_ACCEPTEX;
213
214 const
215 WSAID_ACCEPTEX: TGUID = (
216 D1:$b5367df1; D2:$cbac; D3:$11cf; D4:($95, $ca, $00, $80, $5f, $48, $a1, $92));
217 {$EXTERNALSYM WSAID_ACCEPTEX}
218
219 type
220 LPFN_GETACCEPTEXSOCKADDRS = procedure(lpOutputBuffer: LPVOID; dwReceiveDataLength,
221 dwLocalAddressLength, dwRemoteAddressLength: DWORD; var LocalSockaddr: LPSOCKADDR;
222 var LocalSockaddrLength: Integer; var RemoteSockaddr: LPSOCKADDR;
223 var RemoteSockaddrLength: Integer); stdcall;
224 {$EXTERNALSYM LPFN_GETACCEPTEXSOCKADDRS}
225 TFnGetAcceptExSockAddrs = LPFN_GETACCEPTEXSOCKADDRS;
226
227 const
228 WSAID_GETACCEPTEXSOCKADDRS: TGUID = (
229 D1: $b5367df2; D2:$cbac; D3:$11cf; D4:($95, $ca, $00, $80, $5f, $48, $a1, $92));
230 {$EXTERNALSYM WSAID_GETACCEPTEXSOCKADDRS}
231
232 TP_ELEMENT_MEMORY = 1;
233 {$EXTERNALSYM TP_ELEMENT_MEMORY}
234 TP_ELEMENT_FILE = 2;
235 {$EXTERNALSYM TP_ELEMENT_FILE}
236 TP_ELEMENT_EOP = 4;
237 {$EXTERNALSYM TP_ELEMENT_EOP}
238
239 type
240 _TRANSMIT_PACKETS_ELEMENT = record
241 dwElFlags: ULONG;
242 cLength: ULONG;
243 case Integer of
244 0: (
245 nFileOffset: LARGE_INTEGER;
246 hFile: HANDLE);
247 1: (
248 pBuffer: LPVOID);
249 end;
250 {$EXTERNALSYM _TRANSMIT_PACKETS_ELEMENT}
251 TRANSMIT_PACKETS_ELEMENT = _TRANSMIT_PACKETS_ELEMENT;
252 {$EXTERNALSYM TRANSMIT_PACKETS_ELEMENT}
253 PTRANSMIT_PACKETS_ELEMENT = ^TRANSMIT_PACKETS_ELEMENT;
254 {$EXTERNALSYM PTRANSMIT_PACKETS_ELEMENT}
255 LPTRANSMIT_PACKETS_ELEMENT = ^TRANSMIT_PACKETS_ELEMENT;
256 {$EXTERNALSYM LPTRANSMIT_PACKETS_ELEMENT}
257 TTransmitPacketElement = TRANSMIT_PACKETS_ELEMENT;
258 PTransmitPacketElement = PTRANSMIT_PACKETS_ELEMENT;
259
260 const
261 TP_DISCONNECT = TF_DISCONNECT;
262 {$EXTERNALSYM TP_DISCONNECT}
263 TP_REUSE_SOCKET = TF_REUSE_SOCKET;
264 {$EXTERNALSYM TP_REUSE_SOCKET}
265 TP_USE_DEFAULT_WORKER = TF_USE_DEFAULT_WORKER;
266 {$EXTERNALSYM TP_USE_DEFAULT_WORKER}
267 TP_USE_SYSTEM_THREAD = TF_USE_SYSTEM_THREAD;
268 {$EXTERNALSYM TP_USE_SYSTEM_THREAD}
269 TP_USE_KERNEL_APC = TF_USE_KERNEL_APC;
270 {$EXTERNALSYM TP_USE_KERNEL_APC}
271
272 type
ocketnull273 LPFN_TRANSMITPACKETS = function(Socket: TSocket; lpPacketArray: LPTRANSMIT_PACKETS_ELEMENT; ElementCount: DWORD;
274 nSendSize: DWORD; lpOverlapped: LPOVERLAPPED; dwFlags: DWORD): BOOL; stdcall;
275 {$EXTERNALSYM LPFN_TRANSMITPACKETS}
276
277 const
278 WSAID_TRANSMITPACKETS: TGUID = (
279 D1: $d9689da0; D2:$1f90; D3:$11d3; D4:($99, $71, $00, $c0, $4f, $68, $c8, $76));
280 {$EXTERNALSYM WSAID_TRANSMITPACKETS}
281
282 type
283 LPFN_CONNECTEX = function(s: TSocket; name: PSockAddr; namelen: Integer; lpSendBuffer: PVOID; dwSendDataLength: DWORD;
284 lpdwBytesSent: LPDWORD; lpOverlapped: LPOVERLAPPED): BOOL; stdcall;
285 {$EXTERNALSYM LPFN_CONNECTEX}
286
287 const
288 WSAID_CONNECTEX: TGUID = (
289 D1: $25a207b9; D2:$ddf3; D3:$4660; D4:($8e, $e9, $76, $e5, $8c, $74, $06, $3e));
290 {$EXTERNALSYM WSAID_CONNECTEX}
291
292 type
293 LPFN_DISCONNECTEX = function(s: TSocket; lpOverlapped: LPOVERLAPPED; dwFlags: DWORD; dwReserved: DWORD): BOOL; stdcall;
294 {$EXTERNALSYM LPFN_DISCONNECTEX}
295
296 const
297 WSAID_DISCONNECTEX: TGUID = (
298 D1: $7fda2e11; D2:$8630; D3:$436f; D4:($a0, $31, $f5, $36, $a6, $ee, $c1, $57));
299 {$EXTERNALSYM WSAID_DISCONNECTEX}
300
301 DE_REUSE_SOCKET = TF_REUSE_SOCKET;
302 {$EXTERNALSYM DE_REUSE_SOCKET}
303
304 //
305 // Network-location awareness -- Name registration values for use
306 // with WSASetService and other structures.
307 //
308
309 // {6642243A-3BA8-4aa6-BAA5-2E0BD71FDD83}
310
311 NLA_NAMESPACE_GUID: TGUID = (
312 D1: $6642243a; D2:$3ba8; D3:$4aa6; D4:($ba, $a5, $2e, $0b, $d7, $1f, $dd, $83));
313 {$EXTERNALSYM NLA_NAMESPACE_GUID}
314
315 // {6642243A-3BA8-4aa6-BAA5-2E0BD71FDD83}
316
317 NLA_SERVICE_CLASS_GUID: TGUID = (
318 D1: $37e515; D2:$b5c9; D3:$4a43; D4:($ba, $da, $8b, $48, $a8, $7a, $d2, $39));
319 {$EXTERNALSYM NLA_SERVICE_CLASS_GUID}
320
321 NLA_ALLUSERS_NETWORK = $00000001;
322 {$EXTERNALSYM NLA_ALLUSERS_NETWORK}
323 NLA_FRIENDLY_NAME = $00000002;
324 {$EXTERNALSYM NLA_FRIENDLY_NAME}
325
326 type
327 _NLA_BLOB_DATA_TYPE = (
328 NLA_RAW_DATA,
329 NLA_INTERFACE,
330 NLA_802_1X_LOCATION,
331 NLA_CONNECTIVITY,
332 NLA_ICS);
333 {$EXTERNALSYM _NLA_BLOB_DATA_TYPE}
334 NLA_BLOB_DATA_TYPE = _NLA_BLOB_DATA_TYPE;
335 {$EXTERNALSYM NLA_BLOB_DATA_TYPE}
336 PNLA_BLOB_DATA_TYPE = ^NLA_BLOB_DATA_TYPE;
337 {$EXTERNALSYM PNLA_BLOB_DATA_TYPE}
338 TNlaBlobDataType = NLA_BLOB_DATA_TYPE;
339 PNlaBlobDataType = PNLA_BLOB_DATA_TYPE;
340
341 _NLA_CONNECTIVITY_TYPE = (
342 NLA_NETWORK_AD_HOC,
343 NLA_NETWORK_MANAGED,
344 NLA_NETWORK_UNMANAGED,
345 NLA_NETWORK_UNKNOWN);
346 {$EXTERNALSYM _NLA_CONNECTIVITY_TYPE}
347 NLA_CONNECTIVITY_TYPE = _NLA_CONNECTIVITY_TYPE;
348 {$EXTERNALSYM NLA_CONNECTIVITY_TYPE}
349 PNLA_CONNECTIVITY_TYPE = ^NLA_CONNECTIVITY_TYPE;
350 {$EXTERNALSYM PNLA_CONNECTIVITY_TYPE}
351 TNlaConnectivityType = NLA_CONNECTIVITY_TYPE;
352 PNlaConnectivityType = PNLA_CONNECTIVITY_TYPE;
353
354 _NLA_INTERNET = (
355 NLA_INTERNET_UNKNOWN,
356 NLA_INTERNET_NO,
357 NLA_INTERNET_YES);
358 {$EXTERNALSYM _NLA_INTERNET}
359 NLA_INTERNET = _NLA_INTERNET;
360 {$EXTERNALSYM NLA_INTERNET}
361 PNLA_INTERNET = ^NLA_INTERNET;
362 {$EXTERNALSYM PNLA_INTERNET}
363 TNlaInternet = NLA_INTERNET;
364 PNlaInternet = PNLA_INTERNET;
365
366 _NLA_BLOB = record
367 header: record
368 type_: NLA_BLOB_DATA_TYPE;
369 dwSize: DWORD;
370 nextOffset: DWORD;
371 end;
372 case Integer of
373 0: (
374 // header.type -> NLA_RAW_DATA
375 rawData: array [0..0] of CHAR);
376 1: (
377 // header.type -> NLA_INTERFACE
378 dwType: DWORD;
379 dwSpeed: DWORD;
380 adapterName: array [0..0] of CHAR);
381 2: (
382 // header.type -> NLA_802_1X_LOCATION
383 information: array [0..0] of CHAR);
384 3: (
385 // header.type -> NLA_CONNECTIVITY
386 type_: NLA_CONNECTIVITY_TYPE;
387 internet: NLA_INTERNET);
388 4: (
389 // header.type -> NLA_ICS
390 remote: record
391 speed: DWORD;
392 type_: DWORD;
393 state: DWORD;
394 machineName: array [0..255] of WCHAR;
395 sharedAdapterName: array [0..255] of WCHAR;
396 end);
397 end;
398 {$EXTERNALSYM _NLA_BLOB}
399 NLA_BLOB = _NLA_BLOB;
400 {$EXTERNALSYM NLA_BLOB}
401 PNLA_BLOB = ^NLA_BLOB;
402 {$EXTERNALSYM PNLA_BLOB}
403 LPNLA_BLOB = ^NLA_BLOB;
404 {$EXTERNALSYM LPNLA_BLOB}
405 TNlaBlob = NLA_BLOB;
406 PNlaBlob = PNLA_BLOB;
407
408 _WSAMSG = record
409 name: LPSOCKADDR; // Remote address
410 namelen: INT; // Remote address length
411 lpBuffers: LPWSABUF; // Data buffer array
412 dwBufferCount: DWORD; // Number of elements in the array
413 Control: WSABUF; // Control buffer
414 dwFlags: DWORD; // Flags
415 end;
416 {$EXTERNALSYM _WSAMSG}
417 WSAMSG = _WSAMSG;
418 {$EXTERNALSYM WSAMSG}
419 PWSAMSG = ^WSAMSG;
420 {$EXTERNALSYM PWSAMSG}
421 LPWSAMSG = ^WSAMSG;
422 {$EXTERNALSYM LPWSAMSG}
423 TWsaMsg = WSAMSG;
424
425 //
426 // Layout of ancillary data objects in the control buffer
427 //
428
429 _WSACMSGHDR = record
430 cmsg_len: SIZE_T;
431 cmsg_level: INT;
432 cmsg_type: INT;
433 // followed by UCHAR cmsg_data[]
434 end;
435 {$EXTERNALSYM _WSACMSGHDR}
436 WSACMSGHDR = _WSACMSGHDR;
437 {$EXTERNALSYM WSACMSGHDR}
438 PWSACMSGHDR = ^WSACMSGHDR;
439 {$EXTERNALSYM PWSACMSGHDR}
440 LPWSACMSGHDR = ^WSACMSGHDR;
441 {$EXTERNALSYM LPWSACMSGHDR}
442 TWsaCMsgHdr = WSACMSGHDR;
443
444 //
445 // Alignment macros for header and data members of
446 // the control buffer.
447 //
448
449 { TODO
450 #define WSA_CMSGHDR_ALIGN(length) \
451 ( ((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) & \
452 (~(TYPE_ALIGNMENT(WSACMSGHDR)-1)) ) \
453
454 #define WSA_CMSGDATA_ALIGN(length) \
455 ( ((length) + MAX_NATURAL_ALIGNMENT-1) & \
456 (~(MAX_NATURAL_ALIGNMENT-1)) )
457 }
458
459 //
460 // WSA_CMSG_FIRSTHDR
461 //
462 // Returns a pointer to the first ancillary data object,
463 // or a null pointer if there is no ancillary data in the
464 // control buffer of the WSAMSG structure.
465 //
466 // LPCMSGHDR
467 // WSA_CMSG_FIRSTHDR (
468 // LPWSAMSG msg
469 // );
470 //
471
472 (* TODO
473 #define WSA_CMSG_FIRSTHDR(msg) \
474 ( ((msg)->Control.len >= sizeof(WSACMSGHDR)) \
475 ? (LPWSACMSGHDR)(msg)->Control.buf \
476 : (LPWSACMSGHDR)NULL )
477 *)
478
479 //
480 // WSA_CMSG_NXTHDR
481 //
482 // Returns a pointer to the next ancillary data object,
483 // or a null if there are no more data objects.
484 //
485 // LPCMSGHDR
486 // WSA_CMSG_NEXTHDR (
487 // LPWSAMSG msg,
488 // LPWSACMSGHDR cmsg
489 // );
490 //
491
492 { TODO
493 #define WSA_CMSG_NXTHDR(msg, cmsg) \
494 ( ((cmsg) == NULL) \
495 ? WSA_CMSG_FIRSTHDR(msg) \
496 : ( ( ((u_char *)(cmsg) + \
497 WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) + \
498 sizeof(WSACMSGHDR) ) > \
499 (u_char *)((msg)->Control.buf) + \
500 (msg)->Control.len ) \
501 ? (LPWSACMSGHDR)NULL \
502 : (LPWSACMSGHDR)((u_char *)(cmsg) + \
503 WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)) ) )
504 }
505
506 //
507 // WSA_CMSG_DATA
508 //
509 // Returns a pointer to the first byte of data (what is referred
510 // to as the cmsg_data member though it is not defined in
511 // the structure).
512 //
513 // u_char *
514 // WSA_CMSG_DATA (
515 // LPWSACMSGHDR pcmsg
516 // );
517 //
518
519 { TODO
520 #define WSA_CMSG_DATA(cmsg) \
521 ( (u_char *)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) )
522 }
523
524 //
525 // WSA_CMSG_SPACE
526 //
527 // Returns total size of an ancillary data object given
528 // the amount of data. Used to allocate the correct amount
529 // of space.
530 //
531 // SIZE_T
532 // WSA_CMSG_SPACE (
533 // SIZE_T length
534 // );
535 //
536
537 { TODO
538 #define WSA_CMSG_SPACE(length) \
539 (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length)))
540 }
541
542 //
543 // WSA_CMSG_LEN
544 //
545 // Returns the value to store in cmsg_len given the amount of data.
546 //
547 // SIZE_T
548 // WSA_CMSG_LEN (
549 // SIZE_T length
550 // );
551 //
552
553 { TODO
554 #define WSA_CMSG_LEN(length) \
555 (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length)
556 }
557
558 //
559 // Definition for flags member of the WSAMSG structure
560 // This is in addition to other MSG_xxx flags defined
561 // for recv/recvfrom/send/sendto.
562 //
563
564 const
565 MSG_TRUNC = $0100;
566 {$EXTERNALSYM MSG_TRUNC}
567 MSG_CTRUNC = $0200;
568 {$EXTERNALSYM MSG_CTRUNC}
569 MSG_BCAST = $0400;
570 {$EXTERNALSYM MSG_BCAST}
571 MSG_MCAST = $0800;
572 {$EXTERNALSYM MSG_MCAST}
573
574 type
575 LPFN_WSARECVMSG = function(s: TSocket; lpMsg: LPWSAMSG; lpdwNumberOfBytesRecvd: LPDWORD; lpOverlapped: LPWSAOVERLAPPED;
576 lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): INT; stdcall;
577 {$EXTERNALSYM LPFN_WSARECVMSG}
578
579 const
580 WSAID_WSARECVMSG: TGUID = (
581 D1: $f689d7c8; D2:$6f1f; D3:$436b; D4:($8a, $53, $e5, $4f, $e3, $51, $c3, $22));
582 {$EXTERNALSYM WSAID_WSARECVMSG}
583
584 {$ENDIF JWA_IMPLEMENTATIONSECTION}
585
586
587
588 {$IFNDEF JWA_OMIT_SECTIONS}
589 implementation
590 //uses ...
591 {$ENDIF JWA_OMIT_SECTIONS}
592
593
594
595 {$IFNDEF JWA_INTERFACESECTION}
596
597 {$IFNDEF JWA_INCLUDEMODE}
598 const
599 mswsocklib = 'mswsock.dll';
600 {$ENDIF JWA_INCLUDEMODE}
601
602 {$IFDEF DYNAMIC_LINK}
603
604 var
605 _WSARecvEx: Pointer;
606
WSARecvExnull607 function WSARecvEx;
608 begin
609 GetProcedureAddress(_WSARecvEx, mswsocklib, 'WSARecvEx');
610 asm
611 MOV ESP, EBP
612 POP EBP
613 JMP [_WSARecvEx]
614 end;
615 end;
616
617 var
618 _TransmitFile: Pointer;
619
TransmitFilenull620 function TransmitFile;
621 begin
622 GetProcedureAddress(_TransmitFile, mswsocklib, 'TransmitFile');
623 asm
624 MOV ESP, EBP
625 POP EBP
626 JMP [_TransmitFile]
627 end;
628 end;
629
630 var
631 _AcceptEx: Pointer;
632
AcceptExnull633 function AcceptEx;
634 begin
635 GetProcedureAddress(_AcceptEx, mswsocklib, 'AcceptEx');
636 asm
637 MOV ESP, EBP
638 POP EBP
639 JMP [_AcceptEx]
640 end;
641 end;
642
643 var
644 _GetAcceptExSockaddrs: Pointer;
645
646 procedure GetAcceptExSockaddrs;
647 begin
648 GetProcedureAddress(_GetAcceptExSockaddrs, mswsocklib, 'GetAcceptExSockaddrs');
649 asm
650 MOV ESP, EBP
651 POP EBP
652 JMP [_GetAcceptExSockaddrs]
653 end;
654 end;
655
656 {$ELSE}
657
WSARecvExnull658 function WSARecvEx; external mswsocklib name 'WSARecvEx';
TransmitFilenull659 function TransmitFile; external mswsocklib name 'TransmitFile';
AcceptExnull660 function AcceptEx; external mswsocklib name 'AcceptEx';
661 procedure GetAcceptExSockaddrs; external mswsocklib name 'GetAcceptExSockaddrs';
662
663 {$ENDIF DYNAMIC_LINK}
664
665 {$ENDIF JWA_INTERFACESECTION}
666
667
668
669 {$IFNDEF JWA_OMIT_SECTIONS}
670 end.
671 {$ENDIF JWA_OMIT_SECTIONS}
672