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 <ddk/ntifs.h>
13 #include <net/tdikrnl.h>
14 #include <net/tdiinfo.h>
15 #include <afd/shared.h>
19 /* Forward declarations */
22 typedef struct _DEVICE_EXTENSION
{
23 PDEVICE_OBJECT StorageDevice
;
24 KSPIN_LOCK FCBListLock
;
25 LIST_ENTRY FCBListHead
;
26 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
;
28 /* Context Control Block structure */
29 typedef struct _AFDCCB
{
32 PFILE_OBJECT FileObject
;
34 LARGE_INTEGER CurrentByteOffset
;
37 /* Flags for CCB structure */
38 #define CCB_CLEANED 0x00000001
40 typedef struct _FsdNTRequiredFCB
{
41 FSRTL_COMMON_FCB_HEADER CommonFCBHeader
;
42 SECTION_OBJECT_POINTERS SectionObject
;
43 ERESOURCE MainResource
;
44 ERESOURCE PagingIoResource
;
45 } FsdNTRequiredFCB
, *PFsdNTRequiredFCB
;
47 typedef struct _AFDFCB
{
48 FsdNTRequiredFCB NTRequiredFCB
;
51 PDEVICE_EXTENSION DeviceExt
;
52 SHARE_ACCESS ShareAccess
;
54 ULONG OpenHandleCount
;
55 HANDLE TdiAddressObjectHandle
;
56 PFILE_OBJECT TdiAddressObject
;
57 HANDLE TdiConnectionObjectHandle
;
58 PFILE_OBJECT TdiConnectionObject
;
59 LIST_ENTRY CCBListHead
;
65 DWORD NotificationEvents
;
66 UNICODE_STRING TdiDeviceName
;
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
];
80 #define SOCKET_STATE_CREATED 0
81 #define SOCKET_STATE_BOUND 1
82 #define SOCKET_STATE_LISTENING 2
83 #define SOCKET_STATE_CONNECTED 3
85 typedef struct _AFD_BUFFER
{
88 } AFD_BUFFER
, *PAFD_BUFFER
;
90 typedef struct _AFD_READ_REQUEST
{
93 PFILE_REQUEST_RECVFROM RecvFromRequest
;
94 PFILE_REPLY_RECVFROM RecvFromReply
;
95 } AFD_READ_REQUEST
, *PAFD_READ_REQUEST
;
97 typedef struct _AFD_LISTEN_REQUEST
{
100 } AFD_LISTEN_REQUEST
, *PAFD_LISTEN_REQUEST
;
102 typedef struct IPSNMP_INFO
{
109 ULONG InUnknownProtos
;
113 ULONG RoutingDiscards
;
126 } IPSNMP_INFO
, *PIPSNMP_INFO
;
128 typedef struct IPADDR_ENTRY
{
136 } IPADDR_ENTRY
, *PIPADDR_ENTRY
;
139 #define TL_INSTANCE 0
141 #define IP_MIB_STATS_ID 0x1
142 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
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
;
162 #define IOCTL_TCP_QUERY_INFORMATION_EX \
163 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
165 #define IOCTL_TCP_SET_INFORMATION_EX \
166 CTL_CODE(FILE_DEVICE_NETWORK, 1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
171 /* DWORD network to host byte order conversion for i386 */
173 ((((dw) & 0xFF000000L) >> 24) | \
174 (((dw) & 0x00FF0000L) >> 8) | \
175 (((dw) & 0x0000FF00L) << 8) | \
176 (((dw) & 0x000000FFL) << 24))
178 /* DWORD host to network byte order conversion for i386 */
180 ((((dw) & 0xFF000000L) >> 24) | \
181 (((dw) & 0x00FF0000L) >> 8) | \
182 (((dw) & 0x0000FF00L) << 8) | \
183 (((dw) & 0x000000FFL) << 24))
185 /* WORD network to host order conversion for i386 */
187 ((((w) & 0xFF00) >> 8) | \
188 (((w) & 0x00FF) << 8))
190 /* WORD host to network byte order conversion for i386 */
192 ((((w) & 0xFF00) >> 8) | \
193 (((w) & 0x00FF) << 8))
197 /* DWORD network to host byte order conversion for other architectures */
201 /* DWORD host to network byte order conversion for other architectures */
205 /* WORD network to host order conversion for other architectures */
209 /* WORD host to network byte order conversion for other architectures */
216 extern NPAGED_LOOKASIDE_LIST BufferLookasideList
;
217 extern NPAGED_LOOKASIDE_LIST ReadRequestLookasideList
;
218 extern NPAGED_LOOKASIDE_LIST ListenRequestLookasideList
;
220 /* Prototypes from dispatch.c */
222 NTSTATUS
AfdDispBind(
224 PIO_STACK_LOCATION IrpSp
);
226 NTSTATUS
AfdDispListen(
228 PIO_STACK_LOCATION IrpSp
);
230 NTSTATUS
AfdDispSendTo(
232 PIO_STACK_LOCATION IrpSp
);
234 NTSTATUS
AfdDispRecvFrom(
236 PIO_STACK_LOCATION IrpSp
);
238 NTSTATUS
AfdDispSelect(
240 PIO_STACK_LOCATION IrpSp
);
242 NTSTATUS
AfdDispEventSelect(
244 PIO_STACK_LOCATION IrpSp
);
246 NTSTATUS
AfdDispEnumNetworkEvents(
248 PIO_STACK_LOCATION IrpSp
);
250 NTSTATUS
AfdDispRecv(
252 PIO_STACK_LOCATION IrpSp
);
254 NTSTATUS
AfdDispSend(
256 PIO_STACK_LOCATION IrpSp
);
258 NTSTATUS
AfdDispConnect(
260 PIO_STACK_LOCATION IrpSp
);
262 /* Prototypes from event.c */
264 NTSTATUS
AfdRegisterEventHandlers(
267 NTSTATUS
AfdDeregisterEventHandlers(
270 /* Prototypes from opnclose.c */
272 NTSTATUS STDCALL
AfdCreate(
273 PDEVICE_OBJECT DeviceObject
,
276 NTSTATUS STDCALL
AfdClose(
277 PDEVICE_OBJECT DeviceObject
,
280 /* Prototypes from rdwr.c */
282 NTSTATUS
AfdEventReceiveDatagramHandler(
283 IN PVOID TdiEventContext
,
284 IN LONG SourceAddressLength
,
285 IN PVOID SourceAddress
,
286 IN LONG OptionsLength
,
288 IN ULONG ReceiveDatagramFlags
,
289 IN ULONG BytesIndicated
,
290 IN ULONG BytesAvailable
,
291 OUT ULONG
* BytesTaken
,
293 OUT PIRP
* IoRequestPacket
);
295 NTSTATUS STDCALL
AfdRead(
296 PDEVICE_OBJECT DeviceObject
,
299 NTSTATUS STDCALL
AfdWrite(
300 PDEVICE_OBJECT DeviceObject
,
303 /* Prototypes from routines.c */
312 NTSTATUS
MergeWSABuffers(
319 NTSTATUS
FillWSABuffers(
325 VOID
BuildIPv4Header(
326 PIPv4_HEADER IPHeader
,
329 PSOCKADDR SourceAddress
,
330 PSOCKADDR DestinationAddress
);
332 /* Prototypes from tdi.c */
334 NTSTATUS
TdiCloseDevice(
336 PFILE_OBJECT FileObject
);
338 NTSTATUS
TdiOpenAddressFileIPv4(
339 PUNICODE_STRING DeviceName
,
341 PHANDLE AddressHandle
,
342 PFILE_OBJECT
*AddressObject
);
344 NTSTATUS
TdiOpenAddressFile(
345 PUNICODE_STRING DeviceName
,
347 PHANDLE AddressHandle
,
348 PFILE_OBJECT
*AddressObject
);
350 NTSTATUS
TdiOpenConnectionEndpointFile(
351 PUNICODE_STRING DeviceName
,
352 PHANDLE ConnectionHandle
,
353 PFILE_OBJECT
*ConnectionObject
);
356 PFILE_OBJECT ConnectionObject
,
357 LPSOCKADDR RemoteAddress
);
359 NTSTATUS
TdiAssociateAddressFile(
360 HANDLE AddressHandle
,
361 PFILE_OBJECT ConnectionObject
);
364 PFILE_OBJECT ConnectionObject
,
365 PIO_COMPLETION_ROUTINE CompletionRoutine
,
366 PVOID CompletionContext
);
368 NTSTATUS
TdiSetEventHandler(
369 PFILE_OBJECT FileObject
,
374 NTSTATUS
TdiQueryDeviceControl(
375 PFILE_OBJECT FileObject
,
378 ULONG InputBufferLength
,
380 ULONG OutputBufferLength
,
383 NTSTATUS
TdiQueryInformationEx(
384 PFILE_OBJECT FileObject
,
391 PULONG OutputLength
);
393 NTSTATUS
TdiQueryAddress(
394 PFILE_OBJECT FileObject
,
398 PFILE_OBJECT TransportObject
,
402 NTSTATUS
TdiSendDatagram(
403 PFILE_OBJECT TransportObject
,