jwamswsock.pas 20 KB

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