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