- Removed some obsolete headers.
[reactos.git] / reactos / drivers / net / afd / include / afd.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver
4 * FILE: include/afd.h
5 * PURPOSE: Main driver header
6 */
7 #ifndef __AFD_H
8 #define __AFD_H
9
10 #include <winsock2.h>
11 #include <ddk/ntddk.h>
12 #include <ddk/ntifs.h>
13 #include <net/tdikrnl.h>
14 #include <net/tdiinfo.h>
15 #include <afd/shared.h>
16 #include <ntos.h>
17 #include <debug.h>
18
19 /* Forward declarations */
20 struct _AFDFCB;
21
22 typedef struct _DEVICE_EXTENSION {
23 PDEVICE_OBJECT StorageDevice;
24 KSPIN_LOCK FCBListLock;
25 LIST_ENTRY FCBListHead;
26 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
27
28 /* Context Control Block structure */
29 typedef struct _AFDCCB {
30 struct _AFDFCB *FCB;
31 LIST_ENTRY ListEntry;
32 PFILE_OBJECT FileObject;
33 ULONG Flags;
34 LARGE_INTEGER CurrentByteOffset;
35 } AFDCCB, *PAFDCCB;
36
37 /* Flags for CCB structure */
38 #define CCB_CLEANED 0x00000001
39
40 typedef struct _FsdNTRequiredFCB {
41 FSRTL_COMMON_FCB_HEADER CommonFCBHeader;
42 SECTION_OBJECT_POINTERS SectionObject;
43 ERESOURCE MainResource;
44 ERESOURCE PagingIoResource;
45 } FsdNTRequiredFCB, *PFsdNTRequiredFCB;
46
47 typedef struct _AFDFCB {
48 FsdNTRequiredFCB NTRequiredFCB;
49 LIST_ENTRY ListEntry;
50 BOOL CommandChannel;
51 PDEVICE_EXTENSION DeviceExt;
52 SHARE_ACCESS ShareAccess;
53 ULONG ReferenceCount;
54 ULONG OpenHandleCount;
55 HANDLE TdiAddressObjectHandle;
56 PFILE_OBJECT TdiAddressObject;
57 HANDLE TdiConnectionObjectHandle;
58 PFILE_OBJECT TdiConnectionObject;
59 LIST_ENTRY CCBListHead;
60 INT AddressFamily;
61 INT SocketType;
62 INT Protocol;
63 SOCKADDR SocketName;
64 PVOID HelperContext;
65 DWORD NotificationEvents;
66 UNICODE_STRING TdiDeviceName;
67 DWORD State;
68 PVOID SendBuffer;
69 LIST_ENTRY ReceiveQueue;
70 KSPIN_LOCK ReceiveQueueLock;
71 LIST_ENTRY ReadRequestQueue;
72 KSPIN_LOCK ReadRequestQueueLock;
73 LIST_ENTRY ListenRequestQueue;
74 /* For WSAEventSelect() */
75 WSANETWORKEVENTS NetworkEvents;
76 WSAEVENT EventObjects[FD_MAX_EVENTS];
77 } AFDFCB, *PAFDFCB;
78
79 /* Socket states */
80 #define SOCKET_STATE_CREATED 0
81 #define SOCKET_STATE_BOUND 1
82 #define SOCKET_STATE_LISTENING 2
83 #define SOCKET_STATE_CONNECTED 3
84
85 typedef struct _AFD_BUFFER {
86 LIST_ENTRY ListEntry;
87 WSABUF Buffer;
88 } AFD_BUFFER, *PAFD_BUFFER;
89
90 typedef struct _AFD_READ_REQUEST {
91 LIST_ENTRY ListEntry;
92 PIRP Irp;
93 PFILE_REQUEST_RECVFROM RecvFromRequest;
94 PFILE_REPLY_RECVFROM RecvFromReply;
95 } AFD_READ_REQUEST, *PAFD_READ_REQUEST;
96
97 typedef struct _AFD_LISTEN_REQUEST {
98 LIST_ENTRY ListEntry;
99 PAFDFCB Fcb;
100 } AFD_LISTEN_REQUEST, *PAFD_LISTEN_REQUEST;
101
102 typedef struct IPSNMP_INFO {
103 ULONG Forwarding;
104 ULONG DefaultTTL;
105 ULONG InReceives;
106 ULONG InHdrErrors;
107 ULONG InAddrErrors;
108 ULONG ForwDatagrams;
109 ULONG InUnknownProtos;
110 ULONG InDiscards;
111 ULONG InDelivers;
112 ULONG OutRequests;
113 ULONG RoutingDiscards;
114 ULONG OutDiscards;
115 ULONG OutNoRoutes;
116 ULONG ReasmTimeout;
117 ULONG ReasmReqds;
118 ULONG ReasmOks;
119 ULONG ReasmFails;
120 ULONG FragOks;
121 ULONG FragFails;
122 ULONG FragCreates;
123 ULONG NumIf;
124 ULONG NumAddr;
125 ULONG NumRoutes;
126 } IPSNMP_INFO, *PIPSNMP_INFO;
127
128 typedef struct IPADDR_ENTRY {
129 ULONG Addr;
130 ULONG Index;
131 ULONG Mask;
132 ULONG BcastAddr;
133 ULONG ReasmSize;
134 USHORT Context;
135 USHORT Pad;
136 } IPADDR_ENTRY, *PIPADDR_ENTRY;
137
138
139 #define TL_INSTANCE 0
140
141 #define IP_MIB_STATS_ID 0x1
142 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
143
144
145 /* IPv4 header format */
146 typedef struct IPv4_HEADER {
147 UCHAR VerIHL; /* 4-bit version, 4-bit Internet Header Length */
148 UCHAR Tos; /* Type of Service */
149 USHORT TotalLength; /* Total Length */
150 USHORT Id; /* Identification */
151 USHORT FlagsFragOfs; /* 3-bit Flags, 13-bit Fragment Offset */
152 UCHAR Ttl; /* Time to Live */
153 UCHAR Protocol; /* Protocol */
154 USHORT Checksum; /* Header Checksum */
155 ULONG SrcAddr; /* Source Address */
156 ULONG DstAddr; /* Destination Address */
157 } IPv4_HEADER, *PIPv4_HEADER;
158
159
160 /* IOCTL codes */
161
162 #define IOCTL_TCP_QUERY_INFORMATION_EX \
163 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
164
165 #define IOCTL_TCP_SET_INFORMATION_EX \
166 CTL_CODE(FILE_DEVICE_NETWORK, 1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
167
168
169 #ifdef i386
170
171 /* DWORD network to host byte order conversion for i386 */
172 #define DN2H(dw) \
173 ((((dw) & 0xFF000000L) >> 24) | \
174 (((dw) & 0x00FF0000L) >> 8) | \
175 (((dw) & 0x0000FF00L) << 8) | \
176 (((dw) & 0x000000FFL) << 24))
177
178 /* DWORD host to network byte order conversion for i386 */
179 #define DH2N(dw) \
180 ((((dw) & 0xFF000000L) >> 24) | \
181 (((dw) & 0x00FF0000L) >> 8) | \
182 (((dw) & 0x0000FF00L) << 8) | \
183 (((dw) & 0x000000FFL) << 24))
184
185 /* WORD network to host order conversion for i386 */
186 #define WN2H(w) \
187 ((((w) & 0xFF00) >> 8) | \
188 (((w) & 0x00FF) << 8))
189
190 /* WORD host to network byte order conversion for i386 */
191 #define WH2N(w) \
192 ((((w) & 0xFF00) >> 8) | \
193 (((w) & 0x00FF) << 8))
194
195 #else /* i386 */
196
197 /* DWORD network to host byte order conversion for other architectures */
198 #define DN2H(dw) \
199 (dw)
200
201 /* DWORD host to network byte order conversion for other architectures */
202 #define DH2N(dw) \
203 (dw)
204
205 /* WORD network to host order conversion for other architectures */
206 #define WN2H(w) \
207 (w)
208
209 /* WORD host to network byte order conversion for other architectures */
210 #define WH2N(w) \
211 (w)
212
213 #endif /* i386 */
214
215
216 extern NPAGED_LOOKASIDE_LIST BufferLookasideList;
217 extern NPAGED_LOOKASIDE_LIST ReadRequestLookasideList;
218 extern NPAGED_LOOKASIDE_LIST ListenRequestLookasideList;
219
220 /* Prototypes from dispatch.c */
221
222 NTSTATUS AfdDispBind(
223 PIRP Irp,
224 PIO_STACK_LOCATION IrpSp);
225
226 NTSTATUS AfdDispListen(
227 PIRP Irp,
228 PIO_STACK_LOCATION IrpSp);
229
230 NTSTATUS AfdDispSendTo(
231 PIRP Irp,
232 PIO_STACK_LOCATION IrpSp);
233
234 NTSTATUS AfdDispRecvFrom(
235 PIRP Irp,
236 PIO_STACK_LOCATION IrpSp);
237
238 NTSTATUS AfdDispSelect(
239 PIRP Irp,
240 PIO_STACK_LOCATION IrpSp);
241
242 NTSTATUS AfdDispEventSelect(
243 PIRP Irp,
244 PIO_STACK_LOCATION IrpSp);
245
246 NTSTATUS AfdDispEnumNetworkEvents(
247 PIRP Irp,
248 PIO_STACK_LOCATION IrpSp);
249
250 NTSTATUS AfdDispRecv(
251 PIRP Irp,
252 PIO_STACK_LOCATION IrpSp);
253
254 NTSTATUS AfdDispSend(
255 PIRP Irp,
256 PIO_STACK_LOCATION IrpSp);
257
258 NTSTATUS AfdDispConnect(
259 PIRP Irp,
260 PIO_STACK_LOCATION IrpSp);
261
262 /* Prototypes from event.c */
263
264 NTSTATUS AfdRegisterEventHandlers(
265 PAFDFCB FCB);
266
267 NTSTATUS AfdDeregisterEventHandlers(
268 PAFDFCB FCB);
269
270 /* Prototypes from opnclose.c */
271
272 NTSTATUS STDCALL AfdCreate(
273 PDEVICE_OBJECT DeviceObject,
274 PIRP Irp);
275
276 NTSTATUS STDCALL AfdClose(
277 PDEVICE_OBJECT DeviceObject,
278 PIRP Irp);
279
280 /* Prototypes from rdwr.c */
281
282 NTSTATUS AfdEventReceiveDatagramHandler(
283 IN PVOID TdiEventContext,
284 IN LONG SourceAddressLength,
285 IN PVOID SourceAddress,
286 IN LONG OptionsLength,
287 IN PVOID Options,
288 IN ULONG ReceiveDatagramFlags,
289 IN ULONG BytesIndicated,
290 IN ULONG BytesAvailable,
291 OUT ULONG * BytesTaken,
292 IN PVOID Tsdu,
293 OUT PIRP * IoRequestPacket);
294
295 NTSTATUS STDCALL AfdRead(
296 PDEVICE_OBJECT DeviceObject,
297 PIRP Irp);
298
299 NTSTATUS STDCALL AfdWrite(
300 PDEVICE_OBJECT DeviceObject,
301 PIRP Irp);
302
303 /* Prototypes from routines.c */
304
305 VOID DumpName(
306 LPSOCKADDR Name);
307
308 ULONG WSABufferSize(
309 LPWSABUF Buffers,
310 DWORD BufferCount);
311
312 NTSTATUS MergeWSABuffers(
313 LPWSABUF Buffers,
314 DWORD BufferCount,
315 PVOID Destination,
316 ULONG MaxLength,
317 PULONG BytesCopied);
318
319 NTSTATUS FillWSABuffers(
320 PAFDFCB FCB,
321 LPWSABUF Buffers,
322 DWORD BufferCount,
323 PULONG BytesCopied);
324
325 VOID BuildIPv4Header(
326 PIPv4_HEADER IPHeader,
327 ULONG TotalSize,
328 ULONG Protocol,
329 PSOCKADDR SourceAddress,
330 PSOCKADDR DestinationAddress);
331
332 /* Prototypes from tdi.c */
333
334 NTSTATUS TdiCloseDevice(
335 HANDLE Handle,
336 PFILE_OBJECT FileObject);
337
338 NTSTATUS TdiOpenAddressFileIPv4(
339 PUNICODE_STRING DeviceName,
340 LPSOCKADDR Name,
341 PHANDLE AddressHandle,
342 PFILE_OBJECT *AddressObject);
343
344 NTSTATUS TdiOpenAddressFile(
345 PUNICODE_STRING DeviceName,
346 LPSOCKADDR Name,
347 PHANDLE AddressHandle,
348 PFILE_OBJECT *AddressObject);
349
350 NTSTATUS TdiOpenConnectionEndpointFile(
351 PUNICODE_STRING DeviceName,
352 PHANDLE ConnectionHandle,
353 PFILE_OBJECT *ConnectionObject);
354
355 NTSTATUS TdiConnect(
356 PFILE_OBJECT ConnectionObject,
357 LPSOCKADDR RemoteAddress);
358
359 NTSTATUS TdiAssociateAddressFile(
360 HANDLE AddressHandle,
361 PFILE_OBJECT ConnectionObject);
362
363 NTSTATUS TdiListen(
364 PFILE_OBJECT ConnectionObject,
365 PIO_COMPLETION_ROUTINE CompletionRoutine,
366 PVOID CompletionContext);
367
368 NTSTATUS TdiSetEventHandler(
369 PFILE_OBJECT FileObject,
370 LONG EventType,
371 PVOID Handler,
372 PVOID Context);
373
374 NTSTATUS TdiQueryDeviceControl(
375 PFILE_OBJECT FileObject,
376 ULONG IoControlCode,
377 PVOID InputBuffer,
378 ULONG InputBufferLength,
379 PVOID OutputBuffer,
380 ULONG OutputBufferLength,
381 PULONG Return);
382
383 NTSTATUS TdiQueryInformationEx(
384 PFILE_OBJECT FileObject,
385 ULONG Entity,
386 ULONG Instance,
387 ULONG Class,
388 ULONG Type,
389 ULONG Id,
390 PVOID OutputBuffer,
391 PULONG OutputLength);
392
393 NTSTATUS TdiQueryAddress(
394 PFILE_OBJECT FileObject,
395 PULONG Address);
396
397 NTSTATUS TdiSend(
398 PFILE_OBJECT TransportObject,
399 PVOID Buffer,
400 ULONG BufferSize);
401
402 NTSTATUS TdiSendDatagram(
403 PFILE_OBJECT TransportObject,
404 LPSOCKADDR Address,
405 PMDL Mdl,
406 ULONG BufferSize);
407
408 #endif /*__AFD_H */
409
410 /* EOF */