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