jwamswsock.pas 19 KB

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