MSWSock.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. /*++
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4. mswsock.h
  5. Abstract:
  6. This module contains the Microsoft-specific extensions to the Windows
  7. Sockets API.
  8. Revision History:
  9. --*/
  10. #ifndef _MSWSOCK_
  11. #define _MSWSOCK_
  12. #if _MSC_VER > 1000
  13. #pragma once
  14. #endif
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. /*
  19. * Options for connect and disconnect data and options. Used only by
  20. * non-TCP/IP transports such as DECNet, OSI TP4, etc.
  21. */
  22. #define SO_CONNDATA 0x7000
  23. #define SO_CONNOPT 0x7001
  24. #define SO_DISCDATA 0x7002
  25. #define SO_DISCOPT 0x7003
  26. #define SO_CONNDATALEN 0x7004
  27. #define SO_CONNOPTLEN 0x7005
  28. #define SO_DISCDATALEN 0x7006
  29. #define SO_DISCOPTLEN 0x7007
  30. /*
  31. * Option for opening sockets for synchronous access.
  32. */
  33. #define SO_OPENTYPE 0x7008
  34. #define SO_SYNCHRONOUS_ALERT 0x10
  35. #define SO_SYNCHRONOUS_NONALERT 0x20
  36. /*
  37. * Other NT-specific options.
  38. */
  39. #define SO_MAXDG 0x7009
  40. #define SO_MAXPATHDG 0x700A
  41. #define SO_UPDATE_ACCEPT_CONTEXT 0x700B
  42. #define SO_CONNECT_TIME 0x700C
  43. #define SO_UPDATE_CONNECT_CONTEXT 0x7010
  44. /*
  45. * TCP options.
  46. */
  47. #define TCP_BSDURGENT 0x7000
  48. /*
  49. * MS Transport Provider IOCTL to control
  50. * reporting PORT_UNREACHABLE messages
  51. * on UDP sockets via recv/WSARecv/etc.
  52. * Path TRUE in input buffer to enable (default if supported),
  53. * FALSE to disable.
  54. */
  55. #define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
  56. /*
  57. * MS Transport Provider IOCTL to request
  58. * notification when a given socket is closed.
  59. * Input buffer must be a pointer to the socket handle.
  60. * Input buffer size must be exactly sizeof(HANDLE).
  61. * Output buffer and output buffer length must be
  62. * NULL and 0 respectively. This IOCTL must always
  63. * be issued with an overlapped structure.
  64. */
  65. #define SIO_SOCKET_CLOSE_NOTIFY _WSAIOW(IOC_VENDOR,13)
  66. /*
  67. * Microsoft extended APIs.
  68. */
  69. int
  70. PASCAL FAR
  71. WSARecvEx (
  72. SOCKET s,
  73. char FAR *buf,
  74. int len,
  75. int FAR *flags
  76. );
  77. typedef struct _TRANSMIT_FILE_BUFFERS {
  78. LPVOID Head;
  79. DWORD HeadLength;
  80. LPVOID Tail;
  81. DWORD TailLength;
  82. } TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, FAR *LPTRANSMIT_FILE_BUFFERS;
  83. #define TF_DISCONNECT 0x01
  84. #define TF_REUSE_SOCKET 0x02
  85. #define TF_WRITE_BEHIND 0x04
  86. #define TF_USE_DEFAULT_WORKER 0x00
  87. #define TF_USE_SYSTEM_THREAD 0x10
  88. #define TF_USE_KERNEL_APC 0x20
  89. BOOL
  90. PASCAL FAR
  91. TransmitFile (
  92. IN SOCKET hSocket,
  93. IN HANDLE hFile,
  94. IN DWORD nNumberOfBytesToWrite,
  95. IN DWORD nNumberOfBytesPerSend,
  96. IN LPOVERLAPPED lpOverlapped,
  97. IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
  98. IN DWORD dwReserved
  99. );
  100. BOOL
  101. PASCAL FAR
  102. AcceptEx (
  103. IN SOCKET sListenSocket,
  104. IN SOCKET sAcceptSocket,
  105. IN PVOID lpOutputBuffer,
  106. IN DWORD dwReceiveDataLength,
  107. IN DWORD dwLocalAddressLength,
  108. IN DWORD dwRemoteAddressLength,
  109. OUT LPDWORD lpdwBytesReceived,
  110. IN LPOVERLAPPED lpOverlapped
  111. );
  112. VOID
  113. PASCAL FAR
  114. GetAcceptExSockaddrs (
  115. IN PVOID lpOutputBuffer,
  116. IN DWORD dwReceiveDataLength,
  117. IN DWORD dwLocalAddressLength,
  118. IN DWORD dwRemoteAddressLength,
  119. OUT struct sockaddr **LocalSockaddr,
  120. OUT LPINT LocalSockaddrLength,
  121. OUT struct sockaddr **RemoteSockaddr,
  122. OUT LPINT RemoteSockaddrLength
  123. );
  124. /*
  125. * "QueryInterface" versions of the above APIs.
  126. */
  127. typedef
  128. BOOL
  129. (PASCAL FAR * LPFN_TRANSMITFILE)(
  130. IN SOCKET hSocket,
  131. IN HANDLE hFile,
  132. IN DWORD nNumberOfBytesToWrite,
  133. IN DWORD nNumberOfBytesPerSend,
  134. IN LPOVERLAPPED lpOverlapped,
  135. IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
  136. IN DWORD dwReserved
  137. );
  138. #define WSAID_TRANSMITFILE \
  139. {0xb5367df0,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
  140. typedef
  141. BOOL
  142. (PASCAL FAR * LPFN_ACCEPTEX)(
  143. IN SOCKET sListenSocket,
  144. IN SOCKET sAcceptSocket,
  145. IN PVOID lpOutputBuffer,
  146. IN DWORD dwReceiveDataLength,
  147. IN DWORD dwLocalAddressLength,
  148. IN DWORD dwRemoteAddressLength,
  149. OUT LPDWORD lpdwBytesReceived,
  150. IN LPOVERLAPPED lpOverlapped
  151. );
  152. #define WSAID_ACCEPTEX \
  153. {0xb5367df1,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
  154. typedef
  155. VOID
  156. (PASCAL FAR * LPFN_GETACCEPTEXSOCKADDRS)(
  157. IN PVOID lpOutputBuffer,
  158. IN DWORD dwReceiveDataLength,
  159. IN DWORD dwLocalAddressLength,
  160. IN DWORD dwRemoteAddressLength,
  161. OUT struct sockaddr **LocalSockaddr,
  162. OUT LPINT LocalSockaddrLength,
  163. OUT struct sockaddr **RemoteSockaddr,
  164. OUT LPINT RemoteSockaddrLength
  165. );
  166. #define WSAID_GETACCEPTEXSOCKADDRS \
  167. {0xb5367df2,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
  168. #if _MSC_VER >= 1200
  169. #pragma warning(push)
  170. #endif
  171. #pragma warning(disable:4201) /* Nonstandard extension, nameless struct/union */
  172. typedef struct _TRANSMIT_PACKETS_ELEMENT {
  173. ULONG dwElFlags;
  174. #define TP_ELEMENT_MEMORY 1
  175. #define TP_ELEMENT_FILE 2
  176. #define TP_ELEMENT_EOP 4
  177. ULONG cLength;
  178. union {
  179. struct {
  180. LARGE_INTEGER nFileOffset;
  181. HANDLE hFile;
  182. };
  183. PVOID pBuffer;
  184. };
  185. } TRANSMIT_PACKETS_ELEMENT, *PTRANSMIT_PACKETS_ELEMENT, FAR *LPTRANSMIT_PACKETS_ELEMENT;
  186. #if _MSC_VER >= 1200
  187. #pragma warning(pop)
  188. #else
  189. #pragma warning(default:4201)
  190. #endif
  191. #define TP_DISCONNECT TF_DISCONNECT
  192. #define TP_REUSE_SOCKET TF_REUSE_SOCKET
  193. #define TP_USE_DEFAULT_WORKER TF_USE_DEFAULT_WORKER
  194. #define TP_USE_SYSTEM_THREAD TF_USE_SYSTEM_THREAD
  195. #define TP_USE_KERNEL_APC TF_USE_KERNEL_APC
  196. typedef
  197. BOOL
  198. (PASCAL FAR * LPFN_TRANSMITPACKETS) (
  199. SOCKET hSocket,
  200. LPTRANSMIT_PACKETS_ELEMENT lpPacketArray,
  201. DWORD nElementCount,
  202. DWORD nSendSize,
  203. LPOVERLAPPED lpOverlapped,
  204. DWORD dwFlags
  205. );
  206. #define WSAID_TRANSMITPACKETS \
  207. {0xd9689da0,0x1f90,0x11d3,{0x99,0x71,0x00,0xc0,0x4f,0x68,0xc8,0x76}}
  208. typedef
  209. BOOL
  210. (PASCAL FAR * LPFN_CONNECTEX) (
  211. IN SOCKET s,
  212. IN const struct sockaddr FAR *name,
  213. IN int namelen,
  214. IN PVOID lpSendBuffer OPTIONAL,
  215. IN DWORD dwSendDataLength,
  216. OUT LPDWORD lpdwBytesSent,
  217. IN LPOVERLAPPED lpOverlapped
  218. );
  219. #define WSAID_CONNECTEX \
  220. {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}}
  221. typedef
  222. BOOL
  223. (PASCAL FAR * LPFN_DISCONNECTEX) (
  224. IN SOCKET s,
  225. IN LPOVERLAPPED lpOverlapped,
  226. IN DWORD dwFlags,
  227. IN DWORD dwReserved
  228. );
  229. #define WSAID_DISCONNECTEX \
  230. {0x7fda2e11,0x8630,0x436f,{0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}}
  231. #define DE_REUSE_SOCKET TF_REUSE_SOCKET
  232. /*
  233. * Network-location awareness -- Name registration values for use
  234. * with WSASetService and other structures.
  235. */
  236. // {6642243A-3BA8-4aa6-BAA5-2E0BD71FDD83}
  237. #define NLA_NAMESPACE_GUID \
  238. {0x6642243a,0x3ba8,0x4aa6,{0xba,0xa5,0x2e,0xb,0xd7,0x1f,0xdd,0x83}}
  239. // {6642243A-3BA8-4aa6-BAA5-2E0BD71FDD83}
  240. #define NLA_SERVICE_CLASS_GUID \
  241. {0x37e515,0xb5c9,0x4a43,{0xba,0xda,0x8b,0x48,0xa8,0x7a,0xd2,0x39}}
  242. #define NLA_ALLUSERS_NETWORK 0x00000001
  243. #define NLA_FRIENDLY_NAME 0x00000002
  244. typedef enum _NLA_BLOB_DATA_TYPE {
  245. NLA_RAW_DATA = 0,
  246. NLA_INTERFACE = 1,
  247. NLA_802_1X_LOCATION = 2,
  248. NLA_CONNECTIVITY = 3,
  249. NLA_ICS = 4,
  250. } NLA_BLOB_DATA_TYPE, *PNLA_BLOB_DATA_TYPE;
  251. typedef enum _NLA_CONNECTIVITY_TYPE {
  252. NLA_NETWORK_AD_HOC = 0,
  253. NLA_NETWORK_MANAGED = 1,
  254. NLA_NETWORK_UNMANAGED = 2,
  255. NLA_NETWORK_UNKNOWN = 3,
  256. } NLA_CONNECTIVITY_TYPE, *PNLA_CONNECTIVITY_TYPE;
  257. typedef enum _NLA_INTERNET {
  258. NLA_INTERNET_UNKNOWN = 0,
  259. NLA_INTERNET_NO = 1,
  260. NLA_INTERNET_YES = 2,
  261. } NLA_INTERNET, *PNLA_INTERNET;
  262. typedef struct _NLA_BLOB {
  263. struct {
  264. NLA_BLOB_DATA_TYPE type;
  265. DWORD dwSize;
  266. DWORD nextOffset;
  267. } header;
  268. union {
  269. // header.type -> NLA_RAW_DATA
  270. CHAR rawData[1];
  271. // header.type -> NLA_INTERFACE
  272. struct {
  273. DWORD dwType;
  274. DWORD dwSpeed;
  275. CHAR adapterName[1];
  276. } interfaceData;
  277. // header.type -> NLA_802_1X_LOCATION
  278. struct {
  279. CHAR information[1];
  280. } locationData;
  281. // header.type -> NLA_CONNECTIVITY
  282. struct {
  283. NLA_CONNECTIVITY_TYPE type;
  284. NLA_INTERNET internet;
  285. } connectivity;
  286. // header.type -> NLA_ICS
  287. struct {
  288. struct {
  289. DWORD speed;
  290. DWORD type;
  291. DWORD state;
  292. WCHAR machineName[256];
  293. WCHAR sharedAdapterName[256];
  294. } remote;
  295. } ICS;
  296. } data;
  297. } NLA_BLOB, *PNLA_BLOB, * FAR LPNLA_BLOB;
  298. typedef struct _WSAMSG {
  299. LPSOCKADDR name; /* Remote address */
  300. INT namelen; /* Remote address length */
  301. LPWSABUF lpBuffers; /* Data buffer array */
  302. DWORD dwBufferCount; /* Number of elements in the array */
  303. WSABUF Control; /* Control buffer */
  304. DWORD dwFlags; /* Flags */
  305. } WSAMSG, *PWSAMSG, * FAR LPWSAMSG;
  306. /*
  307. * Layout of ancillary data objects in the control buffer
  308. */
  309. typedef struct _WSACMSGHDR {
  310. SIZE_T cmsg_len;
  311. INT cmsg_level;
  312. INT cmsg_type;
  313. /* followed by UCHAR cmsg_data[] */
  314. } WSACMSGHDR, *PWSACMSGHDR, FAR *LPWSACMSGHDR;
  315. /*
  316. * Alignment macros for header and data members of
  317. * the control buffer.
  318. */
  319. #define WSA_CMSGHDR_ALIGN(length) \
  320. ( ((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) & \
  321. (~(TYPE_ALIGNMENT(WSACMSGHDR)-1)) ) \
  322. #define WSA_CMSGDATA_ALIGN(length) \
  323. ( ((length) + MAX_NATURAL_ALIGNMENT-1) & \
  324. (~(MAX_NATURAL_ALIGNMENT-1)) )
  325. /*
  326. * WSA_CMSG_FIRSTHDR
  327. *
  328. * Returns a pointer to the first ancillary data object,
  329. * or a null pointer if there is no ancillary data in the
  330. * control buffer of the WSAMSG structure.
  331. *
  332. * LPCMSGHDR
  333. * WSA_CMSG_FIRSTHDR (
  334. * LPWSAMSG msg
  335. * );
  336. */
  337. #define WSA_CMSG_FIRSTHDR(msg) \
  338. ( ((msg)->Control.len >= sizeof(WSACMSGHDR)) \
  339. ? (LPWSACMSGHDR)(msg)->Control.buf \
  340. : (LPWSACMSGHDR)NULL )
  341. /*
  342. * WSA_CMSG_NXTHDR
  343. *
  344. * Returns a pointer to the next ancillary data object,
  345. * or a null if there are no more data objects.
  346. *
  347. * LPCMSGHDR
  348. * WSA_CMSG_NEXTHDR (
  349. * LPWSAMSG msg,
  350. * LPWSACMSGHDR cmsg
  351. * );
  352. */
  353. #define WSA_CMSG_NXTHDR(msg, cmsg) \
  354. ( ((cmsg) == NULL) \
  355. ? WSA_CMSG_FIRSTHDR(msg) \
  356. : ( ( ((u_char *)(cmsg) + \
  357. WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) + \
  358. sizeof(WSACMSGHDR) ) > \
  359. (u_char *)((msg)->Control.buf) + \
  360. (msg)->Control.len ) \
  361. ? (LPWSACMSGHDR)NULL \
  362. : (LPWSACMSGHDR)((u_char *)(cmsg) + \
  363. WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)) ) )
  364. /*
  365. * WSA_CMSG_DATA
  366. *
  367. * Returns a pointer to the first byte of data (what is referred
  368. * to as the cmsg_data member though it is not defined in
  369. * the structure).
  370. *
  371. * u_char *
  372. * WSA_CMSG_DATA (
  373. * LPWSACMSGHDR pcmsg
  374. * );
  375. */
  376. #define WSA_CMSG_DATA(cmsg) \
  377. ( (u_char *)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) )
  378. /*
  379. * WSA_CMSG_SPACE
  380. *
  381. * Returns total size of an ancillary data object given
  382. * the amount of data. Used to allocate the correct amount
  383. * of space.
  384. *
  385. * SIZE_T
  386. * WSA_CMSG_SPACE (
  387. * SIZE_T length
  388. * );
  389. */
  390. #define WSA_CMSG_SPACE(length) \
  391. (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length)))
  392. /*
  393. * WSA_CMSG_LEN
  394. *
  395. * Returns the value to store in cmsg_len given the amount of data.
  396. *
  397. * SIZE_T
  398. * WSA_CMSG_LEN (
  399. * SIZE_T length
  400. * );
  401. */
  402. #define WSA_CMSG_LEN(length) \
  403. (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length)
  404. /*
  405. * Definition for flags member of the WSAMSG structure
  406. * This is in addition to other MSG_xxx flags defined
  407. * for recv/recvfrom/send/sendto.
  408. */
  409. #define MSG_TRUNC 0x0100
  410. #define MSG_CTRUNC 0x0200
  411. #define MSG_BCAST 0x0400
  412. #define MSG_MCAST 0x0800
  413. typedef
  414. INT
  415. (PASCAL FAR * LPFN_WSARECVMSG) (
  416. IN SOCKET s,
  417. IN OUT LPWSAMSG lpMsg,
  418. OUT LPDWORD lpdwNumberOfBytesRecvd,
  419. IN LPWSAOVERLAPPED lpOverlapped,
  420. IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
  421. );
  422. #define WSAID_WSARECVMSG \
  423. {0xf689d7c8,0x6f1f,0x436b,{0x8a,0x53,0xe5,0x4f,0xe3,0x51,0xc3,0x22}}
  424. #ifdef __cplusplus
  425. }
  426. #endif
  427. #endif /* _MSWSOCK_ */