2e75bd864b5b95d2c3d7f6c2626a39d5a888dbb0
[reactos.git] / reactos / include / reactos / drivers / afd / shared.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver
4 * FILE: include/afd/shared.h
5 * PURPOSE: Shared definitions for AFD.SYS and MSAFD.DLL
6 */
7 #ifndef __AFD_SHARED_H
8 #define __AFD_SHARED_H
9
10 #define AFD_MAX_EVENTS 10
11 #define AFD_PACKET_COMMAND_LENGTH 15
12 #define AfdCommand "AfdOpenPacketXX"
13
14 /* Extra definition of WSABUF for AFD so that I don't have to include any
15 * userland winsock headers. */
16 typedef struct _AFD_WSABUF {
17 UINT len;
18 PCHAR buf;
19 } AFD_WSABUF, *PAFD_WSABUF;
20
21 typedef struct _AFD_CREATE_PACKET {
22 DWORD EndpointFlags;
23 DWORD GroupID;
24 DWORD SizeOfTransportName;
25 WCHAR TransportName[1];
26 } AFD_CREATE_PACKET, *PAFD_CREATE_PACKET;
27
28 typedef struct _AFD_INFO {
29 ULONG InformationClass;
30 union {
31 ULONG Ulong;
32 LARGE_INTEGER LargeInteger;
33 BOOLEAN Boolean;
34 } Information;
35 ULONG Padding;
36 } AFD_INFO, *PAFD_INFO;
37
38 typedef struct _AFD_BIND_DATA {
39 ULONG ShareType;
40 TRANSPORT_ADDRESS Address;
41 } AFD_BIND_DATA, *PAFD_BIND_DATA;
42
43 typedef struct _AFD_LISTEN_DATA {
44 BOOLEAN UseSAN;
45 ULONG Backlog;
46 BOOLEAN UseDelayedAcceptance;
47 } AFD_LISTEN_DATA, *PAFD_LISTEN_DATA;
48
49 typedef struct _AFD_HANDLE_ {
50 SOCKET Handle;
51 ULONG Events;
52 NTSTATUS Status;
53 } AFD_HANDLE, *PAFD_HANDLE;
54
55 typedef struct _AFD_POLL_INFO {
56 LARGE_INTEGER Timeout;
57 ULONG HandleCount;
58 ULONG_PTR Exclusive;
59 AFD_HANDLE Handles[1];
60 } AFD_POLL_INFO, *PAFD_POLL_INFO;
61
62 typedef struct _AFD_ACCEPT_DATA {
63 ULONG UseSAN;
64 ULONG SequenceNumber;
65 HANDLE ListenHandle;
66 } AFD_ACCEPT_DATA, *PAFD_ACCEPT_DATA;
67
68 typedef struct _AFD_RECEIVED_ACCEPT_DATA {
69 ULONG SequenceNumber;
70 TRANSPORT_ADDRESS Address;
71 } AFD_RECEIVED_ACCEPT_DATA, *PAFD_RECEIVED_ACCEPT_DATA;
72
73 typedef struct _AFD_PENDING_ACCEPT_DATA {
74 ULONG SequenceNumber;
75 ULONG SizeOfData;
76 ULONG ReturnSize;
77 } AFD_PENDING_ACCEPT_DATA, *PAFD_PENDING_ACCEPT_DATA;
78
79 typedef struct _AFD_DEFER_ACCEPT_DATA {
80 ULONG SequenceNumber;
81 BOOLEAN RejectConnection;
82 } AFD_DEFER_ACCEPT_DATA, *PAFD_DEFER_ACCEPT_DATA;
83
84 typedef struct _AFD_RECV_INFO {
85 PAFD_WSABUF BufferArray;
86 ULONG BufferCount;
87 ULONG AfdFlags;
88 ULONG TdiFlags;
89 } AFD_RECV_INFO , *PAFD_RECV_INFO ;
90
91 typedef struct _AFD_RECV_INFO_UDP {
92 PAFD_WSABUF BufferArray;
93 ULONG BufferCount;
94 ULONG AfdFlags;
95 ULONG TdiFlags;
96 PVOID Address;
97 PINT AddressLength;
98 } AFD_RECV_INFO_UDP, *PAFD_RECV_INFO_UDP;
99
100 typedef struct _AFD_SEND_INFO {
101 PAFD_WSABUF BufferArray;
102 ULONG BufferCount;
103 ULONG AfdFlags;
104 ULONG TdiFlags;
105 } AFD_SEND_INFO , *PAFD_SEND_INFO ;
106
107 typedef struct _AFD_SEND_INFO_UDP {
108 PAFD_WSABUF BufferArray;
109 ULONG BufferCount;
110 ULONG AfdFlags;
111 TDI_REQUEST_SEND_DATAGRAM TdiRequest;
112 TDI_CONNECTION_INFORMATION TdiConnection;
113 } AFD_SEND_INFO_UDP, *PAFD_SEND_INFO_UDP;
114
115 C_ASSERT(sizeof(AFD_RECV_INFO) == sizeof(AFD_SEND_INFO));
116
117 typedef struct _AFD_CONNECT_INFO {
118 BOOLEAN UseSAN;
119 ULONG Root;
120 ULONG Unknown;
121 TRANSPORT_ADDRESS RemoteAddress;
122 } AFD_CONNECT_INFO , *PAFD_CONNECT_INFO ;
123
124 typedef struct _AFD_EVENT_SELECT_INFO {
125 HANDLE EventObject;
126 ULONG Events;
127 } AFD_EVENT_SELECT_INFO, *PAFD_EVENT_SELECT_INFO;
128
129 typedef struct _AFD_ENUM_NETWORK_EVENTS_INFO {
130 HANDLE Event;
131 ULONG PollEvents;
132 NTSTATUS EventStatus[AFD_MAX_EVENTS];
133 } AFD_ENUM_NETWORK_EVENTS_INFO, *PAFD_ENUM_NETWORK_EVENTS_INFO;
134
135 typedef struct _AFD_DISCONNECT_INFO {
136 ULONG DisconnectType;
137 LARGE_INTEGER Timeout;
138 } AFD_DISCONNECT_INFO, *PAFD_DISCONNECT_INFO;
139
140 typedef struct _AFD_VALIDATE_GROUP_DATA
141 {
142 LONG GroupId;
143 TRANSPORT_ADDRESS Address;
144 } AFD_VALIDATE_GROUP_DATA, *PAFD_VALIDATE_GROUP_DATA;
145
146 typedef struct _AFD_TDI_HANDLE_DATA
147 {
148 HANDLE TdiAddressHandle;
149 HANDLE TdiConnectionHandle;
150 } AFD_TDI_HANDLE_DATA, *PAFD_TDI_HANDLE_DATA;
151
152 /* AFD Packet Endpoint Flags */
153 #define AFD_ENDPOINT_CONNECTIONLESS 0x1
154 #define AFD_ENDPOINT_MESSAGE_ORIENTED 0x10
155 #define AFD_ENDPOINT_RAW 0x100
156 #define AFD_ENDPOINT_MULTIPOINT 0x1000
157 #define AFD_ENDPOINT_C_ROOT 0x10000
158 #define AFD_ENDPOINT_D_ROOT 0x100000
159
160 /* AFD TDI Query Flags */
161 #define AFD_ADDRESS_HANDLE 0x1L
162 #define AFD_CONNECTION_HANDLE 0x2L
163
164 /* AFD event bits */
165 #define AFD_EVENT_RECEIVE_BIT 0
166 #define AFD_EVENT_OOB_RECEIVE_BIT 1
167 #define AFD_EVENT_SEND_BIT 2
168 #define AFD_EVENT_DISCONNECT_BIT 3
169 #define AFD_EVENT_ABORT_BIT 4
170 #define AFD_EVENT_CLOSE_BIT 5
171 #define AFD_EVENT_CONNECT_BIT 6
172 #define AFD_EVENT_ACCEPT_BIT 7
173 #define AFD_EVENT_CONNECT_FAIL_BIT 8
174 #define AFD_EVENT_QOS_BIT 9
175 #define AFD_EVENT_GROUP_QOS_BIT 10
176 #define AFD_EVENT_ROUTING_INTERFACE_CHANGE_BIT 11
177 #define AFD_EVENT_ADDRESS_LIST_CHANGE_BIT 12
178 #define AFD_MAX_EVENT 13
179 #define AFD_ALL_EVENTS ((1 << AFD_MAX_EVENT) - 1)
180
181 /* AFD Info Flags */
182 #define AFD_INFO_INLINING_MODE 0x01L
183 #define AFD_INFO_BLOCKING_MODE 0x02L
184 #define AFD_INFO_SENDS_IN_PROGRESS 0x04L
185 #define AFD_INFO_RECEIVE_WINDOW_SIZE 0x06L
186 #define AFD_INFO_SEND_WINDOW_SIZE 0x07L
187 #define AFD_INFO_GROUP_ID_TYPE 0x10L
188 #define AFD_INFO_RECEIVE_CONTENT_SIZE 0x11L
189
190 /* AFD Share Flags */
191 #define AFD_SHARE_UNIQUE 0x0L
192 #define AFD_SHARE_REUSE 0x1L
193 #define AFD_SHARE_WILDCARD 0x2L
194 #define AFD_SHARE_EXCLUSIVE 0x3L
195
196 /* AFD Disconnect Flags */
197 #define AFD_DISCONNECT_SEND 0x01L
198 #define AFD_DISCONNECT_RECV 0x02L
199 #define AFD_DISCONNECT_ABORT 0x04L
200 #define AFD_DISCONNECT_DATAGRAM 0x08L
201
202 /* AFD Event Flags */
203 #define AFD_EVENT_RECEIVE (1 << AFD_EVENT_RECEIVE_BIT)
204 #define AFD_EVENT_OOB_RECEIVE (1 << AFD_EVENT_OOB_RECEIVE_BIT)
205 #define AFD_EVENT_SEND (1 << AFD_EVENT_SEND_BIT)
206 #define AFD_EVENT_DISCONNECT (1 << AFD_EVENT_DISCONNECT_BIT)
207 #define AFD_EVENT_ABORT (1 << AFD_EVENT_ABORT_BIT)
208 #define AFD_EVENT_CLOSE (1 << AFD_EVENT_CLOSE_BIT)
209 #define AFD_EVENT_CONNECT (1 << AFD_EVENT_CONNECT_BIT)
210 #define AFD_EVENT_ACCEPT (1 << AFD_EVENT_ACCEPT_BIT)
211 #define AFD_EVENT_CONNECT_FAIL (1 << AFD_EVENT_CONNECT_FAIL_BIT)
212 #define AFD_EVENT_QOS (1 << AFD_EVENT_QOS_BIT)
213 #define AFD_EVENT_GROUP_QOS (1 << AFD_EVENT_GROUP_QOS_BIT)
214 #define AFD_EVENT_ROUTING_INTERFACE_CHANGE (1 << AFD_EVENT_ROUTING_INTERFACE_CHANGE_BIT)
215 #define AFD_EVENT_ADDRESS_LIST_CHANGE (1 << AFD_EVENT_ADDRESS_LIST_CHANGE_BIT)
216
217 /* AFD SEND/RECV Flags */
218 #define AFD_SKIP_FIO 0x1L
219 #define AFD_OVERLAPPED 0x2L
220 #define AFD_IMMEDIATE 0x4L
221
222 /* IOCTL Generation */
223 #define FSCTL_AFD_BASE FILE_DEVICE_NETWORK
224 #define _AFD_CONTROL_CODE(Operation,Method) \
225 ((FSCTL_AFD_BASE)<<12 | (Operation<<2) | Method)
226
227 /* AFD Commands */
228 #define AFD_BIND 0
229 #define AFD_CONNECT 1
230 #define AFD_START_LISTEN 2
231 #define AFD_WAIT_FOR_LISTEN 3
232 #define AFD_ACCEPT 4
233 #define AFD_RECV 5
234 #define AFD_RECV_DATAGRAM 6
235 #define AFD_SEND 7
236 #define AFD_SEND_DATAGRAM 8
237 #define AFD_SELECT 9
238 #define AFD_DISCONNECT 10
239 #define AFD_GET_SOCK_NAME 11
240 #define AFD_GET_PEER_NAME 12
241 #define AFD_GET_TDI_HANDLES 13
242 #define AFD_SET_INFO 14
243 #define AFD_GET_CONTEXT_SIZE 15
244 #define AFD_GET_CONTEXT 16
245 #define AFD_SET_CONTEXT 17
246 #define AFD_SET_CONNECT_DATA 18
247 #define AFD_SET_CONNECT_OPTIONS 19
248 #define AFD_SET_DISCONNECT_DATA 20
249 #define AFD_SET_DISCONNECT_OPTIONS 21
250 #define AFD_GET_CONNECT_DATA 22
251 #define AFD_GET_CONNECT_OPTIONS 23
252 #define AFD_GET_DISCONNECT_DATA 24
253 #define AFD_GET_DISCONNECT_OPTIONS 25
254 #define AFD_SET_CONNECT_DATA_SIZE 26
255 #define AFD_SET_CONNECT_OPTIONS_SIZE 27
256 #define AFD_SET_DISCONNECT_DATA_SIZE 28
257 #define AFD_SET_DISCONNECT_OPTIONS_SIZE 29
258 #define AFD_GET_INFO 30
259 #define AFD_EVENT_SELECT 33
260 #define AFD_ENUM_NETWORK_EVENTS 34
261 #define AFD_DEFER_ACCEPT 35
262 #define AFD_GET_PENDING_CONNECT_DATA 41
263 #define AFD_VALIDATE_GROUP 42
264
265 /* AFD IOCTLs */
266
267 #define IOCTL_AFD_BIND \
268 _AFD_CONTROL_CODE(AFD_BIND, METHOD_NEITHER)
269 #define IOCTL_AFD_CONNECT \
270 _AFD_CONTROL_CODE(AFD_CONNECT, METHOD_NEITHER)
271 #define IOCTL_AFD_START_LISTEN \
272 _AFD_CONTROL_CODE(AFD_START_LISTEN, METHOD_NEITHER)
273 #define IOCTL_AFD_WAIT_FOR_LISTEN \
274 _AFD_CONTROL_CODE(AFD_WAIT_FOR_LISTEN, METHOD_BUFFERED )
275 #define IOCTL_AFD_ACCEPT \
276 _AFD_CONTROL_CODE(AFD_ACCEPT, METHOD_BUFFERED )
277 #define IOCTL_AFD_RECV \
278 _AFD_CONTROL_CODE(AFD_RECV, METHOD_NEITHER)
279 #define IOCTL_AFD_RECV_DATAGRAM \
280 _AFD_CONTROL_CODE(AFD_RECV_DATAGRAM, METHOD_NEITHER)
281 #define IOCTL_AFD_SEND \
282 _AFD_CONTROL_CODE(AFD_SEND, METHOD_NEITHER)
283 #define IOCTL_AFD_SEND_DATAGRAM \
284 _AFD_CONTROL_CODE(AFD_SEND_DATAGRAM, METHOD_NEITHER)
285 #define IOCTL_AFD_SELECT \
286 _AFD_CONTROL_CODE(AFD_SELECT, METHOD_BUFFERED )
287 #define IOCTL_AFD_DISCONNECT \
288 _AFD_CONTROL_CODE(AFD_DISCONNECT, METHOD_NEITHER)
289 #define IOCTL_AFD_GET_SOCK_NAME \
290 _AFD_CONTROL_CODE(AFD_GET_SOCK_NAME, METHOD_NEITHER)
291 #define IOCTL_AFD_GET_PEER_NAME \
292 _AFD_CONTROL_CODE(AFD_GET_PEER_NAME, METHOD_NEITHER)
293 #define IOCTL_AFD_GET_TDI_HANDLES \
294 _AFD_CONTROL_CODE(AFD_GET_TDI_HANDLES, METHOD_NEITHER)
295 #define IOCTL_AFD_SET_INFO \
296 _AFD_CONTROL_CODE(AFD_SET_INFO, METHOD_NEITHER)
297 #define IOCTL_AFD_GET_CONTEXT_SIZE \
298 _AFD_CONTROL_CODE(AFD_GET_CONTEXT_SIZE, METHOD_NEITHER)
299 #define IOCTL_AFD_GET_CONTEXT \
300 _AFD_CONTROL_CODE(AFD_GET_CONTEXT, METHOD_NEITHER)
301 #define IOCTL_AFD_SET_CONTEXT \
302 _AFD_CONTROL_CODE(AFD_SET_CONTEXT, METHOD_NEITHER)
303 #define IOCTL_AFD_SET_CONNECT_DATA \
304 _AFD_CONTROL_CODE(AFD_SET_CONNECT_DATA, METHOD_NEITHER)
305 #define IOCTL_AFD_SET_CONNECT_OPTIONS \
306 _AFD_CONTROL_CODE(AFD_SET_CONNECT_OPTIONS, METHOD_NEITHER)
307 #define IOCTL_AFD_SET_DISCONNECT_DATA \
308 _AFD_CONTROL_CODE(AFD_SET_DISCONNECT_DATA, METHOD_NEITHER)
309 #define IOCTL_AFD_SET_DISCONNECT_OPTIONS \
310 _AFD_CONTROL_CODE(AFD_SET_DISCONNECT_OPTIONS, METHOD_NEITHER)
311 #define IOCTL_AFD_GET_CONNECT_DATA \
312 _AFD_CONTROL_CODE(AFD_GET_CONNECT_DATA, METHOD_NEITHER)
313 #define IOCTL_AFD_GET_CONNECT_OPTIONS \
314 _AFD_CONTROL_CODE(AFD_GET_CONNECT_OPTIONS, METHOD_NEITHER)
315 #define IOCTL_AFD_GET_DISCONNECT_DATA \
316 _AFD_CONTROL_CODE(AFD_GET_DISCONNECT_DATA, METHOD_NEITHER)
317 #define IOCTL_AFD_GET_DISCONNECT_OPTIONS \
318 _AFD_CONTROL_CODE(AFD_GET_DISCONNECT_OPTIONS, METHOD_NEITHER)
319 #define IOCTL_AFD_SET_CONNECT_DATA_SIZE \
320 _AFD_CONTROL_CODE(AFD_SET_CONNECT_DATA_SIZE, METHOD_NEITHER)
321 #define IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE \
322 _AFD_CONTROL_CODE(AFD_SET_CONNECT_OPTIONS_SIZE, METHOD_NEITHER)
323 #define IOCTL_AFD_SET_DISCONNECT_DATA_SIZE \
324 _AFD_CONTROL_CODE(AFD_SET_DISCONNECT_DATA_SIZE, METHOD_NEITHER)
325 #define IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE \
326 _AFD_CONTROL_CODE(AFD_SET_DISCONNECT_OPTIONS_SIZE, METHOD_NEITHER)
327 #define IOCTL_AFD_GET_INFO \
328 _AFD_CONTROL_CODE(AFD_GET_INFO, METHOD_NEITHER)
329 #define IOCTL_AFD_EVENT_SELECT \
330 _AFD_CONTROL_CODE(AFD_EVENT_SELECT, METHOD_NEITHER)
331 #define IOCTL_AFD_DEFER_ACCEPT \
332 _AFD_CONTROL_CODE(AFD_DEFER_ACCEPT, METHOD_NEITHER)
333 #define IOCTL_AFD_GET_PENDING_CONNECT_DATA \
334 _AFD_CONTROL_CODE(AFD_GET_PENDING_CONNECT_DATA, METHOD_NEITHER)
335 #define IOCTL_AFD_ENUM_NETWORK_EVENTS \
336 _AFD_CONTROL_CODE(AFD_ENUM_NETWORK_EVENTS, METHOD_NEITHER)
337 #define IOCTL_AFD_VALIDATE_GROUP \
338 _AFD_CONTROL_CODE(AFD_VALIDATE_GROUP, METHOD_NEITHER)
339
340 typedef struct _AFD_SOCKET_INFORMATION {
341 BOOL CommandChannel;
342 INT AddressFamily;
343 INT SocketType;
344 INT Protocol;
345 PVOID HelperContext;
346 DWORD NotificationEvents;
347 UNICODE_STRING TdiDeviceName;
348 SOCKADDR Name;
349 } AFD_SOCKET_INFORMATION, *PAFD_SOCKET_INFORMATION;
350
351 typedef struct _FILE_REQUEST_BIND {
352 SOCKADDR Name;
353 } FILE_REQUEST_BIND, *PFILE_REQUEST_BIND;
354
355 typedef struct _FILE_REPLY_BIND {
356 INT Status;
357 HANDLE TdiAddressObjectHandle;
358 HANDLE TdiConnectionObjectHandle;
359 } FILE_REPLY_BIND, *PFILE_REPLY_BIND;
360
361 typedef struct _FILE_REQUEST_LISTEN {
362 INT Backlog;
363 } FILE_REQUEST_LISTEN, *PFILE_REQUEST_LISTEN;
364
365 typedef struct _FILE_REPLY_LISTEN {
366 INT Status;
367 } FILE_REPLY_LISTEN, *PFILE_REPLY_LISTEN;
368
369 typedef struct _FILE_REQUEST_SENDTO {
370 LPWSABUF Buffers;
371 DWORD BufferCount;
372 DWORD Flags;
373 SOCKADDR To;
374 INT ToLen;
375 } FILE_REQUEST_SENDTO, *PFILE_REQUEST_SENDTO;
376
377 typedef struct _FILE_REPLY_SENDTO {
378 INT Status;
379 DWORD NumberOfBytesSent;
380 } FILE_REPLY_SENDTO, *PFILE_REPLY_SENDTO;
381
382 typedef struct _FILE_REQUEST_RECVFROM {
383 LPWSABUF Buffers;
384 DWORD BufferCount;
385 LPDWORD Flags;
386 LPSOCKADDR From;
387 LPINT FromLen;
388 } FILE_REQUEST_RECVFROM, *PFILE_REQUEST_RECVFROM;
389
390 typedef struct _FILE_REPLY_RECVFROM {
391 INT Status;
392 DWORD NumberOfBytesRecvd;
393 } FILE_REPLY_RECVFROM, *PFILE_REPLY_RECVFROM;
394
395 typedef struct _FILE_REQUEST_RECV {
396 LPWSABUF Buffers;
397 DWORD BufferCount;
398 LPDWORD Flags;
399 } FILE_REQUEST_RECV, *PFILE_REQUEST_RECV;
400
401 typedef struct _FILE_REPLY_RECV {
402 INT Status;
403 DWORD NumberOfBytesRecvd;
404 } FILE_REPLY_RECV, *PFILE_REPLY_RECV;
405
406
407 typedef struct _FILE_REQUEST_SEND {
408 LPWSABUF Buffers;
409 DWORD BufferCount;
410 DWORD Flags;
411 } FILE_REQUEST_SEND, *PFILE_REQUEST_SEND;
412
413 typedef struct _FILE_REPLY_SEND {
414 INT Status;
415 DWORD NumberOfBytesSent;
416 } FILE_REPLY_SEND, *PFILE_REPLY_SEND;
417
418
419 typedef struct _FILE_REQUEST_ACCEPT {
420 LPSOCKADDR addr;
421 INT addrlen;
422 LPCONDITIONPROC lpfnCondition;
423 DWORD dwCallbackData;
424 } FILE_REQUEST_ACCEPT, *PFILE_REQUEST_ACCEPT;
425
426 typedef struct _FILE_REPLY_ACCEPT {
427 INT Status;
428 INT addrlen;
429 SOCKET Socket;
430 } FILE_REPLY_ACCEPT, *PFILE_REPLY_ACCEPT;
431
432
433 typedef struct _FILE_REQUEST_CONNECT {
434 LPSOCKADDR name;
435 INT namelen;
436 LPWSABUF lpCallerData;
437 LPWSABUF lpCalleeData;
438 LPQOS lpSQOS;
439 LPQOS lpGQOS;
440 } FILE_REQUEST_CONNECT, *PFILE_REQUEST_CONNECT;
441
442 typedef struct _FILE_REPLY_CONNECT {
443 INT Status;
444 } FILE_REPLY_CONNECT, *PFILE_REPLY_CONNECT;
445
446 #endif /*__AFD_SHARED_H */
447
448 /* EOF */