2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver
5 * PURPOSE: Main driver header
11 #include <ddk/ntddk.h>
12 #include <net/tdikrnl.h>
13 #include <net/tdiinfo.h>
14 #include <afd/shared.h>
17 /* Forward declarations */
20 typedef struct _DEVICE_EXTENSION {
21 PDEVICE_OBJECT StorageDevice;
22 KSPIN_LOCK FCBListLock;
23 LIST_ENTRY FCBListHead;
24 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
26 /* Context Control Block structure */
27 typedef struct _AFDCCB {
30 PFILE_OBJECT FileObject;
32 LARGE_INTEGER CurrentByteOffset;
35 /* Flags for CCB structure */
36 #define CCB_CLEANED 0x00000001
38 typedef struct _FsdNTRequiredFCB {
39 FSRTL_COMMON_FCB_HEADER CommonFCBHeader;
40 SECTION_OBJECT_POINTERS SectionObject;
41 ERESOURCE MainResource;
42 ERESOURCE PagingIoResource;
43 } FsdNTRequiredFCB, *PFsdNTRequiredFCB;
45 typedef struct _AFDFCB {
46 FsdNTRequiredFCB NTRequiredFCB;
49 PDEVICE_EXTENSION DeviceExt;
50 SHARE_ACCESS ShareAccess;
52 ULONG OpenHandleCount;
53 HANDLE TdiAddressObjectHandle;
54 PFILE_OBJECT TdiAddressObject;
55 HANDLE TdiConnectionObjectHandle;
56 PFILE_OBJECT TdiConnectionObject;
57 LIST_ENTRY CCBListHead;
63 DWORD NotificationEvents;
64 UNICODE_STRING TdiDeviceName;
67 LIST_ENTRY ReceiveQueue;
68 KSPIN_LOCK ReceiveQueueLock;
69 LIST_ENTRY ReadRequestQueue;
70 KSPIN_LOCK ReadRequestQueueLock;
71 /* For WSAEventSelect() */
72 WSANETWORKEVENTS NetworkEvents;
73 WSAEVENT EventObjects[FD_MAX_EVENTS];
77 #define SOCKET_STATE_CREATED 0
78 #define SOCKET_STATE_BOUND 1
79 #define SOCKET_STATE_LISTENING 2
80 #define SOCKET_STATE_CONNECTED 3
82 typedef struct _AFD_BUFFER {
85 } AFD_BUFFER, *PAFD_BUFFER;
87 typedef struct _AFD_READ_REQUEST {
90 PFILE_REQUEST_RECVFROM RecvFromRequest;
91 PFILE_REPLY_RECVFROM RecvFromReply;
92 } AFD_READ_REQUEST, *PAFD_READ_REQUEST;
94 typedef struct IPSNMP_INFO {
101 ULONG InUnknownProtos;
105 ULONG RoutingDiscards;
118 } IPSNMP_INFO, *PIPSNMP_INFO;
120 typedef struct IPADDR_ENTRY {
128 } IPADDR_ENTRY, *PIPADDR_ENTRY;
131 #define TL_INSTANCE 0
133 #define IP_MIB_STATS_ID 0x1
134 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
137 /* IPv4 header format */
138 typedef struct IPv4_HEADER {
139 UCHAR VerIHL; /* 4-bit version, 4-bit Internet Header Length */
140 UCHAR Tos; /* Type of Service */
141 USHORT TotalLength; /* Total Length */
142 USHORT Id; /* Identification */
143 USHORT FlagsFragOfs; /* 3-bit Flags, 13-bit Fragment Offset */
144 UCHAR Ttl; /* Time to Live */
145 UCHAR Protocol; /* Protocol */
146 USHORT Checksum; /* Header Checksum */
147 ULONG SrcAddr; /* Source Address */
148 ULONG DstAddr; /* Destination Address */
149 } IPv4_HEADER, *PIPv4_HEADER;
154 #define IOCTL_TCP_QUERY_INFORMATION_EX \
155 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
157 #define IOCTL_TCP_SET_INFORMATION_EX \
158 CTL_CODE(FILE_DEVICE_NETWORK, 1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
163 /* DWORD network to host byte order conversion for i386 */
165 ((((dw) & 0xFF000000L) >> 24) | \
166 (((dw) & 0x00FF0000L) >> 8) | \
167 (((dw) & 0x0000FF00L) << 8) | \
168 (((dw) & 0x000000FFL) << 24))
170 /* DWORD host to network byte order conversion for i386 */
172 ((((dw) & 0xFF000000L) >> 24) | \
173 (((dw) & 0x00FF0000L) >> 8) | \
174 (((dw) & 0x0000FF00L) << 8) | \
175 (((dw) & 0x000000FFL) << 24))
177 /* WORD network to host order conversion for i386 */
179 ((((w) & 0xFF00) >> 8) | \
180 (((w) & 0x00FF) << 8))
182 /* WORD host to network byte order conversion for i386 */
184 ((((w) & 0xFF00) >> 8) | \
185 (((w) & 0x00FF) << 8))
189 /* DWORD network to host byte order conversion for other architectures */
193 /* DWORD host to network byte order conversion for other architectures */
197 /* WORD network to host order conversion for other architectures */
201 /* WORD host to network byte order conversion for other architectures */
208 extern NPAGED_LOOKASIDE_LIST BufferLookasideList;
209 extern NPAGED_LOOKASIDE_LIST ReadRequestLookasideList;
212 /* Prototypes from dispatch.c */
214 NTSTATUS AfdDispBind(
216 PIO_STACK_LOCATION IrpSp);
218 NTSTATUS AfdDispListen(
220 PIO_STACK_LOCATION IrpSp);
222 NTSTATUS AfdDispSendTo(
224 PIO_STACK_LOCATION IrpSp);
226 NTSTATUS AfdDispRecvFrom(
228 PIO_STACK_LOCATION IrpSp);
230 NTSTATUS AfdDispSelect(
232 PIO_STACK_LOCATION IrpSp);
234 NTSTATUS AfdDispEventSelect(
236 PIO_STACK_LOCATION IrpSp);
238 NTSTATUS AfdDispEnumNetworkEvents(
240 PIO_STACK_LOCATION IrpSp);
242 NTSTATUS AfdDispRecv(
244 PIO_STACK_LOCATION IrpSp);
246 NTSTATUS AfdDispSend(
248 PIO_STACK_LOCATION IrpSp);
250 NTSTATUS AfdDispConnect(
252 PIO_STACK_LOCATION IrpSp);
254 /* Prototypes from event.c */
256 NTSTATUS AfdRegisterEventHandlers(
259 NTSTATUS AfdDeregisterEventHandlers(
262 /* Prototypes from opnclose.c */
264 NTSTATUS STDCALL AfdCreate(
265 PDEVICE_OBJECT DeviceObject,
268 NTSTATUS STDCALL AfdClose(
269 PDEVICE_OBJECT DeviceObject,
272 /* Prototypes from rdwr.c */
274 NTSTATUS AfdEventReceiveDatagramHandler(
275 IN PVOID TdiEventContext,
276 IN LONG SourceAddressLength,
277 IN PVOID SourceAddress,
278 IN LONG OptionsLength,
280 IN ULONG ReceiveDatagramFlags,
281 IN ULONG BytesIndicated,
282 IN ULONG BytesAvailable,
283 OUT ULONG * BytesTaken,
285 OUT PIRP * IoRequestPacket);
287 NTSTATUS STDCALL AfdRead(
288 PDEVICE_OBJECT DeviceObject,
291 NTSTATUS STDCALL AfdWrite(
292 PDEVICE_OBJECT DeviceObject,
295 /* Prototypes from routines.c */
301 NTSTATUS MergeWSABuffers(
308 NTSTATUS FillWSABuffers(
314 VOID BuildIPv4Header(
315 PIPv4_HEADER IPHeader,
318 PSOCKADDR SourceAddress,
319 PSOCKADDR DestinationAddress);
321 /* Prototypes from tdi.c */
323 NTSTATUS TdiCloseDevice(
325 PFILE_OBJECT FileObject);
327 NTSTATUS TdiOpenAddressFileIPv4(
328 PUNICODE_STRING DeviceName,
330 PHANDLE AddressHandle,
331 PFILE_OBJECT *AddressObject);
333 NTSTATUS TdiOpenAddressFile(
334 PUNICODE_STRING DeviceName,
336 PHANDLE AddressHandle,
337 PFILE_OBJECT *AddressObject);
339 NTSTATUS TdiOpenConnectionEndpointFile(
340 PUNICODE_STRING DeviceName,
341 PHANDLE ConnectionHandle,
342 PFILE_OBJECT *ConnectionObject);
345 PFILE_OBJECT ConnectionObject,
346 LPSOCKADDR RemoteAddress);
348 NTSTATUS TdiAssociateAddressFile(
349 HANDLE AddressHandle,
350 PFILE_OBJECT ConnectionObject);
352 NTSTATUS TdiSetEventHandler(
353 PFILE_OBJECT FileObject,
358 NTSTATUS TdiQueryDeviceControl(
359 PFILE_OBJECT FileObject,
362 ULONG InputBufferLength,
364 ULONG OutputBufferLength,
367 NTSTATUS TdiQueryInformationEx(
368 PFILE_OBJECT FileObject,
375 PULONG OutputLength);
377 NTSTATUS TdiQueryAddress(
378 PFILE_OBJECT FileObject,
382 PFILE_OBJECT TransportObject,
386 NTSTATUS TdiSendDatagram(
387 PFILE_OBJECT TransportObject,