jwamswsock.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  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. // $Id: JwaMSWSock.pas,v 1.8 2005/09/06 16:36:50 marquardt Exp $
  43. unit JwaMSWSock;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "mswsock.h"'}
  47. {$HPPEMIT ''}
  48. {$I jediapilib.inc}
  49. interface
  50. uses
  51. JwaWindows, JwaWinSock2;
  52. //
  53. // Options for connect and disconnect data and options. Used only by
  54. // non-TCP/IP transports such as DECNet, OSI TP4, etc.
  55. //
  56. const
  57. SO_CONNDATA = $7000;
  58. {$EXTERNALSYM SO_CONNDATA}
  59. SO_CONNOPT = $7001;
  60. {$EXTERNALSYM SO_CONNOPT}
  61. SO_DISCDATA = $7002;
  62. {$EXTERNALSYM SO_DISCDATA}
  63. SO_DISCOPT = $7003;
  64. {$EXTERNALSYM SO_DISCOPT}
  65. SO_CONNDATALEN = $7004;
  66. {$EXTERNALSYM SO_CONNDATALEN}
  67. SO_CONNOPTLEN = $7005;
  68. {$EXTERNALSYM SO_CONNOPTLEN}
  69. SO_DISCDATALEN = $7006;
  70. {$EXTERNALSYM SO_DISCDATALEN}
  71. SO_DISCOPTLEN = $7007;
  72. {$EXTERNALSYM SO_DISCOPTLEN}
  73. //
  74. // Option for opening sockets for synchronous access.
  75. //
  76. const
  77. SO_OPENTYPE = $7008;
  78. {$EXTERNALSYM SO_OPENTYPE}
  79. SO_SYNCHRONOUS_ALERT = $10;
  80. {$EXTERNALSYM SO_SYNCHRONOUS_ALERT}
  81. SO_SYNCHRONOUS_NONALERT = $20;
  82. {$EXTERNALSYM SO_SYNCHRONOUS_NONALERT}
  83. //
  84. // Other NT-specific options.
  85. //
  86. const
  87. SO_MAXDG = $7009;
  88. {$EXTERNALSYM SO_MAXDG}
  89. SO_MAXPATHDG = $700A;
  90. {$EXTERNALSYM SO_MAXPATHDG}
  91. SO_UPDATE_ACCEPT_CONTEXT = $700B;
  92. {$EXTERNALSYM SO_UPDATE_ACCEPT_CONTEXT}
  93. SO_CONNECT_TIME = $700C;
  94. {$EXTERNALSYM SO_CONNECT_TIME}
  95. SO_UPDATE_CONNECT_CONTEXT = $7010;
  96. {$EXTERNALSYM SO_UPDATE_CONNECT_CONTEXT}
  97. //
  98. // TCP options.
  99. //
  100. const
  101. TCP_BSDURGENT = $7000;
  102. {$EXTERNALSYM TCP_BSDURGENT}
  103. //
  104. // MS Transport Provider IOCTL to control
  105. // reporting PORT_UNREACHABLE messages
  106. // on UDP sockets via recv/WSARecv/etc.
  107. // Path TRUE in input buffer to enable (default if supported),
  108. // FALSE to disable.
  109. //
  110. SIO_UDP_CONNRESET = IOC_IN or IOC_VENDOR or 12;
  111. {$EXTERNALSYM SIO_UDP_CONNRESET}
  112. //
  113. // Microsoft extended APIs.
  114. //
  115. function WSARecvEx(s: TSocket; buf: PChar; len: Integer; var flags: Integer): Integer; stdcall;
  116. {$EXTERNALSYM WSARecvEx}
  117. type
  118. _TRANSMIT_FILE_BUFFERS = record
  119. Head: LPVOID;
  120. HeadLength: DWORD;
  121. Tail: LPVOID;
  122. TailLength: DWORD;
  123. end;
  124. {$EXTERNALSYM _TRANSMIT_FILE_BUFFERS}
  125. TRANSMIT_FILE_BUFFERS = _TRANSMIT_FILE_BUFFERS;
  126. {$EXTERNALSYM TRANSMIT_FILE_BUFFERS}
  127. PTRANSMIT_FILE_BUFFERS = ^TRANSMIT_FILE_BUFFERS;
  128. {$EXTERNALSYM PTRANSMIT_FILE_BUFFERS}
  129. LPTRANSMIT_FILE_BUFFERS = ^TRANSMIT_FILE_BUFFERS;
  130. {$EXTERNALSYM LPTRANSMIT_FILE_BUFFERS}
  131. TTransmitFileBuffers = TRANSMIT_FILE_BUFFERS;
  132. PTransmitFileBuffers = LPTRANSMIT_FILE_BUFFERS;
  133. const
  134. TF_DISCONNECT = $01;
  135. {$EXTERNALSYM TF_DISCONNECT}
  136. TF_REUSE_SOCKET = $02;
  137. {$EXTERNALSYM TF_REUSE_SOCKET}
  138. TF_WRITE_BEHIND = $04;
  139. {$EXTERNALSYM TF_WRITE_BEHIND}
  140. TF_USE_DEFAULT_WORKER = $00;
  141. {$EXTERNALSYM TF_USE_DEFAULT_WORKER}
  142. TF_USE_SYSTEM_THREAD = $10;
  143. {$EXTERNALSYM TF_USE_SYSTEM_THREAD}
  144. TF_USE_KERNEL_APC = $20;
  145. {$EXTERNALSYM TF_USE_KERNEL_APC}
  146. function TransmitFile(hSocket: TSocket; hFile: HANDLE; nNumberOfBytesToWrite,
  147. nNumberOfBytesPerSend: DWORD; lpOverlapped: POVERLAPPED;
  148. lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS; dwReserved: DWORD): BOOL; stdcall;
  149. {$EXTERNALSYM TransmitFile}
  150. function AcceptEx(sListenSocket, sAcceptSocket: TSocket; lpOutputBuffer: LPVOID;
  151. dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
  152. var lpdwBytesReceived: DWORD; lpOverlapped: POVERLAPPED): BOOL; stdcall;
  153. {$EXTERNALSYM AcceptEx}
  154. procedure GetAcceptExSockaddrs(lpOutputBuffer: LPVOID; dwReceiveDataLength,
  155. dwLocalAddressLength, dwRemoteAddressLength: DWORD; var LocalSockaddr: LPSOCKADDR;
  156. var LocalSockaddrLength: Integer; var RemoteSockaddr: LPSOCKADDR;
  157. var RemoteSockaddrLength: Integer); stdcall;
  158. {$EXTERNALSYM GetAcceptExSockaddrs}
  159. //
  160. // "QueryInterface" versions of the above APIs.
  161. //
  162. type
  163. LPFN_TRANSMITFILE = function(hSocket: TSocket; hFile: HANDLE; nNumberOfBytesToWrite,
  164. nNumberOfBytesPerSend: DWORD; lpOverlapped: POVERLAPPED;
  165. lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS; dwReserved: DWORD): BOOL; stdcall;
  166. {$EXTERNALSYM LPFN_TRANSMITFILE}
  167. TFnTransmitFile = LPFN_TRANSMITFILE;
  168. const
  169. WSAID_TRANSMITFILE: TGUID = (
  170. D1:$b5367df0; D2:$cbac; D3:$11cf; D4:($95, $ca, $00, $80, $5f, $48, $a1, $92));
  171. {$EXTERNALSYM WSAID_TRANSMITFILE}
  172. type
  173. LPFN_ACCEPTEX = function(sListenSocket, sAcceptSocket: TSocket; lpOutputBuffer: LPVOID;
  174. dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
  175. var lpdwBytesReceived: DWORD; lpOverlapped: POVERLAPPED): BOOL; stdcall;
  176. {$EXTERNALSYM LPFN_ACCEPTEX}
  177. TFnAcceptEx = LPFN_ACCEPTEX;
  178. const
  179. WSAID_ACCEPTEX: TGUID = (
  180. D1:$b5367df1; D2:$cbac; D3:$11cf; D4:($95, $ca, $00, $80, $5f, $48, $a1, $92));
  181. {$EXTERNALSYM WSAID_ACCEPTEX}
  182. type
  183. LPFN_GETACCEPTEXSOCKADDRS = procedure(lpOutputBuffer: LPVOID; dwReceiveDataLength,
  184. dwLocalAddressLength, dwRemoteAddressLength: DWORD; var LocalSockaddr: LPSOCKADDR;
  185. var LocalSockaddrLength: Integer; var RemoteSockaddr: LPSOCKADDR;
  186. var RemoteSockaddrLength: Integer); stdcall;
  187. {$EXTERNALSYM LPFN_GETACCEPTEXSOCKADDRS}
  188. TFnGetAcceptExSockAddrs = LPFN_GETACCEPTEXSOCKADDRS;
  189. const
  190. WSAID_GETACCEPTEXSOCKADDRS: TGUID = (
  191. D1: $b5367df2; D2:$cbac; D3:$11cf; D4:($95, $ca, $00, $80, $5f, $48, $a1, $92));
  192. {$EXTERNALSYM WSAID_GETACCEPTEXSOCKADDRS}
  193. TP_ELEMENT_MEMORY = 1;
  194. {$EXTERNALSYM TP_ELEMENT_MEMORY}
  195. TP_ELEMENT_FILE = 2;
  196. {$EXTERNALSYM TP_ELEMENT_FILE}
  197. TP_ELEMENT_EOP = 4;
  198. {$EXTERNALSYM TP_ELEMENT_EOP}
  199. type
  200. _TRANSMIT_PACKETS_ELEMENT = record
  201. dwElFlags: ULONG;
  202. cLength: ULONG;
  203. case Integer of
  204. 0: (
  205. nFileOffset: LARGE_INTEGER;
  206. hFile: HANDLE);
  207. 1: (
  208. pBuffer: LPVOID);
  209. end;
  210. {$EXTERNALSYM _TRANSMIT_PACKETS_ELEMENT}
  211. TRANSMIT_PACKETS_ELEMENT = _TRANSMIT_PACKETS_ELEMENT;
  212. {$EXTERNALSYM TRANSMIT_PACKETS_ELEMENT}
  213. PTRANSMIT_PACKETS_ELEMENT = ^TRANSMIT_PACKETS_ELEMENT;
  214. {$EXTERNALSYM PTRANSMIT_PACKETS_ELEMENT}
  215. LPTRANSMIT_PACKETS_ELEMENT = ^TRANSMIT_PACKETS_ELEMENT;
  216. {$EXTERNALSYM LPTRANSMIT_PACKETS_ELEMENT}
  217. TTransmitPacketElement = TRANSMIT_PACKETS_ELEMENT;
  218. PTransmitPacketElement = PTRANSMIT_PACKETS_ELEMENT;
  219. const
  220. TP_DISCONNECT = TF_DISCONNECT;
  221. {$EXTERNALSYM TP_DISCONNECT}
  222. TP_REUSE_SOCKET = TF_REUSE_SOCKET;
  223. {$EXTERNALSYM TP_REUSE_SOCKET}
  224. TP_USE_DEFAULT_WORKER = TF_USE_DEFAULT_WORKER;
  225. {$EXTERNALSYM TP_USE_DEFAULT_WORKER}
  226. TP_USE_SYSTEM_THREAD = TF_USE_SYSTEM_THREAD;
  227. {$EXTERNALSYM TP_USE_SYSTEM_THREAD}
  228. TP_USE_KERNEL_APC = TF_USE_KERNEL_APC;
  229. {$EXTERNALSYM TP_USE_KERNEL_APC}
  230. type
  231. LPFN_TRANSMITPACKETS = function(Socket: TSocket; lpPacketArray: LPTRANSMIT_PACKETS_ELEMENT; ElementCount: DWORD;
  232. nSendSize: DWORD; lpOverlapped: LPOVERLAPPED; dwFlags: DWORD): BOOL; stdcall;
  233. {$EXTERNALSYM LPFN_TRANSMITPACKETS}
  234. const
  235. WSAID_TRANSMITPACKETS: TGUID = (
  236. D1: $d9689da0; D2:$1f90; D3:$11d3; D4:($99, $71, $00, $c0, $4f, $68, $c8, $76));
  237. {$EXTERNALSYM WSAID_TRANSMITPACKETS}
  238. type
  239. LPFN_CONNECTEX = function(s: TSocket; name: PSockAddr; namelen: Integer; lpSendBuffer: PVOID; dwSendDataLength: DWORD;
  240. lpdwBytesSent: LPDWORD; lpOverlapped: LPOVERLAPPED): BOOL; stdcall;
  241. {$EXTERNALSYM LPFN_CONNECTEX}
  242. const
  243. WSAID_CONNECTEX: TGUID = (
  244. D1: $25a207b9; D2:$ddf3; D3:$4660; D4:($8e, $e9, $76, $e5, $8c, $74, $06, $3e));
  245. {$EXTERNALSYM WSAID_CONNECTEX}
  246. type
  247. LPFN_DISCONNECTEX = function(s: TSocket; lpOverlapped: LPOVERLAPPED; dwFlags: DWORD; dwReserved: DWORD): BOOL; stdcall;
  248. {$EXTERNALSYM LPFN_DISCONNECTEX}
  249. const
  250. WSAID_DISCONNECTEX: TGUID = (
  251. D1: $7fda2e11; D2:$8630; D3:$436f; D4:($a0, $31, $f5, $36, $a6, $ee, $c1, $57));
  252. {$EXTERNALSYM WSAID_DISCONNECTEX}
  253. DE_REUSE_SOCKET = TF_REUSE_SOCKET;
  254. {$EXTERNALSYM DE_REUSE_SOCKET}
  255. //
  256. // Network-location awareness -- Name registration values for use
  257. // with WSASetService and other structures.
  258. //
  259. // {6642243A-3BA8-4aa6-BAA5-2E0BD71FDD83}
  260. NLA_NAMESPACE_GUID: TGUID = (
  261. D1: $6642243a; D2:$3ba8; D3:$4aa6; D4:($ba, $a5, $2e, $0b, $d7, $1f, $dd, $83));
  262. {$EXTERNALSYM NLA_NAMESPACE_GUID}
  263. // {6642243A-3BA8-4aa6-BAA5-2E0BD71FDD83}
  264. NLA_SERVICE_CLASS_GUID: TGUID = (
  265. D1: $37e515; D2:$b5c9; D3:$4a43; D4:($ba, $da, $8b, $48, $a8, $7a, $d2, $39));
  266. {$EXTERNALSYM NLA_SERVICE_CLASS_GUID}
  267. NLA_ALLUSERS_NETWORK = $00000001;
  268. {$EXTERNALSYM NLA_ALLUSERS_NETWORK}
  269. NLA_FRIENDLY_NAME = $00000002;
  270. {$EXTERNALSYM NLA_FRIENDLY_NAME}
  271. type
  272. _NLA_BLOB_DATA_TYPE = (
  273. NLA_RAW_DATA,
  274. NLA_INTERFACE,
  275. NLA_802_1X_LOCATION,
  276. NLA_CONNECTIVITY,
  277. NLA_ICS);
  278. {$EXTERNALSYM _NLA_BLOB_DATA_TYPE}
  279. NLA_BLOB_DATA_TYPE = _NLA_BLOB_DATA_TYPE;
  280. {$EXTERNALSYM NLA_BLOB_DATA_TYPE}
  281. PNLA_BLOB_DATA_TYPE = ^NLA_BLOB_DATA_TYPE;
  282. {$EXTERNALSYM PNLA_BLOB_DATA_TYPE}
  283. TNlaBlobDataType = NLA_BLOB_DATA_TYPE;
  284. PNlaBlobDataType = PNLA_BLOB_DATA_TYPE;
  285. _NLA_CONNECTIVITY_TYPE = (
  286. NLA_NETWORK_AD_HOC,
  287. NLA_NETWORK_MANAGED,
  288. NLA_NETWORK_UNMANAGED,
  289. NLA_NETWORK_UNKNOWN);
  290. {$EXTERNALSYM _NLA_CONNECTIVITY_TYPE}
  291. NLA_CONNECTIVITY_TYPE = _NLA_CONNECTIVITY_TYPE;
  292. {$EXTERNALSYM NLA_CONNECTIVITY_TYPE}
  293. PNLA_CONNECTIVITY_TYPE = ^NLA_CONNECTIVITY_TYPE;
  294. {$EXTERNALSYM PNLA_CONNECTIVITY_TYPE}
  295. TNlaConnectivityType = NLA_CONNECTIVITY_TYPE;
  296. PNlaConnectivityType = PNLA_CONNECTIVITY_TYPE;
  297. _NLA_INTERNET = (
  298. NLA_INTERNET_UNKNOWN,
  299. NLA_INTERNET_NO,
  300. NLA_INTERNET_YES);
  301. {$EXTERNALSYM _NLA_INTERNET}
  302. NLA_INTERNET = _NLA_INTERNET;
  303. {$EXTERNALSYM NLA_INTERNET}
  304. PNLA_INTERNET = ^NLA_INTERNET;
  305. {$EXTERNALSYM PNLA_INTERNET}
  306. TNlaInternet = NLA_INTERNET;
  307. PNlaInternet = PNLA_INTERNET;
  308. _NLA_BLOB = record
  309. header: record
  310. type_: NLA_BLOB_DATA_TYPE;
  311. dwSize: DWORD;
  312. nextOffset: DWORD;
  313. end;
  314. case Integer of
  315. 0: (
  316. // header.type -> NLA_RAW_DATA
  317. rawData: array [0..0] of CHAR);
  318. 1: (
  319. // header.type -> NLA_INTERFACE
  320. dwType: DWORD;
  321. dwSpeed: DWORD;
  322. adapterName: array [0..0] of CHAR);
  323. 2: (
  324. // header.type -> NLA_802_1X_LOCATION
  325. information: array [0..0] of CHAR);
  326. 3: (
  327. // header.type -> NLA_CONNECTIVITY
  328. type_: NLA_CONNECTIVITY_TYPE;
  329. internet: NLA_INTERNET);
  330. 4: (
  331. // header.type -> NLA_ICS
  332. remote: record
  333. speed: DWORD;
  334. type_: DWORD;
  335. state: DWORD;
  336. machineName: array [0..255] of WCHAR;
  337. sharedAdapterName: array [0..255] of WCHAR;
  338. end);
  339. end;
  340. {$EXTERNALSYM _NLA_BLOB}
  341. NLA_BLOB = _NLA_BLOB;
  342. {$EXTERNALSYM NLA_BLOB}
  343. PNLA_BLOB = ^NLA_BLOB;
  344. {$EXTERNALSYM PNLA_BLOB}
  345. LPNLA_BLOB = ^NLA_BLOB;
  346. {$EXTERNALSYM LPNLA_BLOB}
  347. TNlaBlob = NLA_BLOB;
  348. PNlaBlob = PNLA_BLOB;
  349. _WSAMSG = record
  350. name: LPSOCKADDR; // Remote address
  351. namelen: INT; // Remote address length
  352. lpBuffers: LPWSABUF; // Data buffer array
  353. dwBufferCount: DWORD; // Number of elements in the array
  354. Control: WSABUF; // Control buffer
  355. dwFlags: DWORD; // Flags
  356. end;
  357. {$EXTERNALSYM _WSAMSG}
  358. WSAMSG = _WSAMSG;
  359. {$EXTERNALSYM WSAMSG}
  360. PWSAMSG = ^WSAMSG;
  361. {$EXTERNALSYM PWSAMSG}
  362. LPWSAMSG = ^WSAMSG;
  363. {$EXTERNALSYM LPWSAMSG}
  364. TWsaMsg = WSAMSG;
  365. //
  366. // Layout of ancillary data objects in the control buffer
  367. //
  368. _WSACMSGHDR = record
  369. cmsg_len: SIZE_T;
  370. cmsg_level: INT;
  371. cmsg_type: INT;
  372. // followed by UCHAR cmsg_data[]
  373. end;
  374. {$EXTERNALSYM _WSACMSGHDR}
  375. WSACMSGHDR = _WSACMSGHDR;
  376. {$EXTERNALSYM WSACMSGHDR}
  377. PWSACMSGHDR = ^WSACMSGHDR;
  378. {$EXTERNALSYM PWSACMSGHDR}
  379. LPWSACMSGHDR = ^WSACMSGHDR;
  380. {$EXTERNALSYM LPWSACMSGHDR}
  381. TWsaCMsgHdr = WSACMSGHDR;
  382. //
  383. // Alignment macros for header and data members of
  384. // the control buffer.
  385. //
  386. { TODO
  387. #define WSA_CMSGHDR_ALIGN(length) \
  388. ( ((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) & \
  389. (~(TYPE_ALIGNMENT(WSACMSGHDR)-1)) ) \
  390. #define WSA_CMSGDATA_ALIGN(length) \
  391. ( ((length) + MAX_NATURAL_ALIGNMENT-1) & \
  392. (~(MAX_NATURAL_ALIGNMENT-1)) )
  393. }
  394. //
  395. // WSA_CMSG_FIRSTHDR
  396. //
  397. // Returns a pointer to the first ancillary data object,
  398. // or a null pointer if there is no ancillary data in the
  399. // control buffer of the WSAMSG structure.
  400. //
  401. // LPCMSGHDR
  402. // WSA_CMSG_FIRSTHDR (
  403. // LPWSAMSG msg
  404. // );
  405. //
  406. (* TODO
  407. #define WSA_CMSG_FIRSTHDR(msg) \
  408. ( ((msg)->Control.len >= sizeof(WSACMSGHDR)) \
  409. ? (LPWSACMSGHDR)(msg)->Control.buf \
  410. : (LPWSACMSGHDR)NULL )
  411. *)
  412. //
  413. // WSA_CMSG_NXTHDR
  414. //
  415. // Returns a pointer to the next ancillary data object,
  416. // or a null if there are no more data objects.
  417. //
  418. // LPCMSGHDR
  419. // WSA_CMSG_NEXTHDR (
  420. // LPWSAMSG msg,
  421. // LPWSACMSGHDR cmsg
  422. // );
  423. //
  424. { TODO
  425. #define WSA_CMSG_NXTHDR(msg, cmsg) \
  426. ( ((cmsg) == NULL) \
  427. ? WSA_CMSG_FIRSTHDR(msg) \
  428. : ( ( ((u_char *)(cmsg) + \
  429. WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) + \
  430. sizeof(WSACMSGHDR) ) > \
  431. (u_char *)((msg)->Control.buf) + \
  432. (msg)->Control.len ) \
  433. ? (LPWSACMSGHDR)NULL \
  434. : (LPWSACMSGHDR)((u_char *)(cmsg) + \
  435. WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)) ) )
  436. }
  437. //
  438. // WSA_CMSG_DATA
  439. //
  440. // Returns a pointer to the first byte of data (what is referred
  441. // to as the cmsg_data member though it is not defined in
  442. // the structure).
  443. //
  444. // u_char *
  445. // WSA_CMSG_DATA (
  446. // LPWSACMSGHDR pcmsg
  447. // );
  448. //
  449. { TODO
  450. #define WSA_CMSG_DATA(cmsg) \
  451. ( (u_char *)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) )
  452. }
  453. //
  454. // WSA_CMSG_SPACE
  455. //
  456. // Returns total size of an ancillary data object given
  457. // the amount of data. Used to allocate the correct amount
  458. // of space.
  459. //
  460. // SIZE_T
  461. // WSA_CMSG_SPACE (
  462. // SIZE_T length
  463. // );
  464. //
  465. { TODO
  466. #define WSA_CMSG_SPACE(length) \
  467. (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length)))
  468. }
  469. //
  470. // WSA_CMSG_LEN
  471. //
  472. // Returns the value to store in cmsg_len given the amount of data.
  473. //
  474. // SIZE_T
  475. // WSA_CMSG_LEN (
  476. // SIZE_T length
  477. // );
  478. //
  479. { TODO
  480. #define WSA_CMSG_LEN(length) \
  481. (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length)
  482. }
  483. //
  484. // Definition for flags member of the WSAMSG structure
  485. // This is in addition to other MSG_xxx flags defined
  486. // for recv/recvfrom/send/sendto.
  487. //
  488. const
  489. MSG_TRUNC = $0100;
  490. {$EXTERNALSYM MSG_TRUNC}
  491. MSG_CTRUNC = $0200;
  492. {$EXTERNALSYM MSG_CTRUNC}
  493. MSG_BCAST = $0400;
  494. {$EXTERNALSYM MSG_BCAST}
  495. MSG_MCAST = $0800;
  496. {$EXTERNALSYM MSG_MCAST}
  497. type
  498. LPFN_WSARECVMSG = function(s: TSocket; lpMsg: LPWSAMSG; lpdwNumberOfBytesRecvd: LPDWORD; lpOverlapped: LPWSAOVERLAPPED;
  499. lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): INT; stdcall;
  500. {$EXTERNALSYM LPFN_WSARECVMSG}
  501. const
  502. WSAID_WSARECVMSG: TGUID = (
  503. D1: $f689d7c8; D2:$6f1f; D3:$436b; D4:($8a, $53, $e5, $4f, $e3, $51, $c3, $22));
  504. {$EXTERNALSYM WSAID_WSARECVMSG}
  505. implementation
  506. uses
  507. JwaWinDLLNames;
  508. {$IFDEF DYNAMIC_LINK}
  509. var
  510. _WSARecvEx: Pointer;
  511. function WSARecvEx;
  512. begin
  513. GetProcedureAddress(_WSARecvEx, mswsocklib, 'WSARecvEx');
  514. asm
  515. MOV ESP, EBP
  516. POP EBP
  517. JMP [_WSARecvEx]
  518. end;
  519. end;
  520. var
  521. _TransmitFile: Pointer;
  522. function TransmitFile;
  523. begin
  524. GetProcedureAddress(_TransmitFile, mswsocklib, 'TransmitFile');
  525. asm
  526. MOV ESP, EBP
  527. POP EBP
  528. JMP [_TransmitFile]
  529. end;
  530. end;
  531. var
  532. _AcceptEx: Pointer;
  533. function AcceptEx;
  534. begin
  535. GetProcedureAddress(_AcceptEx, mswsocklib, 'AcceptEx');
  536. asm
  537. MOV ESP, EBP
  538. POP EBP
  539. JMP [_AcceptEx]
  540. end;
  541. end;
  542. var
  543. _GetAcceptExSockaddrs: Pointer;
  544. procedure GetAcceptExSockaddrs;
  545. begin
  546. GetProcedureAddress(_GetAcceptExSockaddrs, mswsocklib, 'GetAcceptExSockaddrs');
  547. asm
  548. MOV ESP, EBP
  549. POP EBP
  550. JMP [_GetAcceptExSockaddrs]
  551. end;
  552. end;
  553. {$ELSE}
  554. function WSARecvEx; external mswsocklib name 'WSARecvEx';
  555. function TransmitFile; external mswsocklib name 'TransmitFile';
  556. function AcceptEx; external mswsocklib name 'AcceptEx';
  557. procedure GetAcceptExSockaddrs; external mswsocklib name 'GetAcceptExSockaddrs';
  558. {$ENDIF DYNAMIC_LINK}
  559. end.