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 /* Borrowed from http://www.acc.umu.se/~bosse/ntifs.h by Bo Branten */
39 typedef struct _FSRTL_COMMON_FCB_HEADER
{
43 UCHAR IsFastIoPossible
;
47 PERESOURCE PagingIoResource
;
48 LARGE_INTEGER AllocationSize
;
49 LARGE_INTEGER FileSize
;
50 LARGE_INTEGER ValidDataLength
;
51 } FSRTL_COMMON_FCB_HEADER
, *PFSRTL_COMMON_FCB_HEADER
;
53 typedef struct _FsdNTRequiredFCB
{
54 FSRTL_COMMON_FCB_HEADER CommonFCBHeader
;
55 SECTION_OBJECT_POINTERS SectionObject
;
56 ERESOURCE MainResource
;
57 ERESOURCE PagingIoResource
;
58 } FsdNTRequiredFCB
, *PFsdNTRequiredFCB
;
60 typedef struct _AFDFCB
{
61 FsdNTRequiredFCB NTRequiredFCB
;
64 PDEVICE_EXTENSION DeviceExt
;
65 SHARE_ACCESS ShareAccess
;
67 ULONG OpenHandleCount
;
68 HANDLE TdiAddressObjectHandle
;
69 PFILE_OBJECT TdiAddressObject
;
70 HANDLE TdiConnectionObjectHandle
;
71 PFILE_OBJECT TdiConnectionObject
;
72 LIST_ENTRY CCBListHead
;
78 DWORD NotificationEvents
;
79 UNICODE_STRING TdiDeviceName
;
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
];
92 #define SOCKET_STATE_CREATED 0
93 #define SOCKET_STATE_BOUND 1
94 #define SOCKET_STATE_LISTENING 2
95 #define SOCKET_STATE_CONNECTED 3
97 typedef struct _AFD_BUFFER
{
100 } AFD_BUFFER
, *PAFD_BUFFER
;
102 typedef struct _AFD_READ_REQUEST
{
103 LIST_ENTRY ListEntry
;
105 PFILE_REQUEST_RECVFROM RecvFromRequest
;
106 PFILE_REPLY_RECVFROM RecvFromReply
;
107 } AFD_READ_REQUEST
, *PAFD_READ_REQUEST
;
109 typedef struct IPSNMP_INFO
{
116 ULONG InUnknownProtos
;
120 ULONG RoutingDiscards
;
133 } IPSNMP_INFO
, *PIPSNMP_INFO
;
135 typedef struct IPADDR_ENTRY
{
143 } IPADDR_ENTRY
, *PIPADDR_ENTRY
;
146 #define TL_INSTANCE 0
148 #define IP_MIB_STATS_ID 0x1
149 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
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
;
169 #define IOCTL_TCP_QUERY_INFORMATION_EX \
170 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
172 #define IOCTL_TCP_SET_INFORMATION_EX \
173 CTL_CODE(FILE_DEVICE_NETWORK, 1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
178 /* DWORD network to host byte order conversion for i386 */
180 ((((dw) & 0xFF000000L) >> 24) | \
181 (((dw) & 0x00FF0000L) >> 8) | \
182 (((dw) & 0x0000FF00L) << 8) | \
183 (((dw) & 0x000000FFL) << 24))
185 /* DWORD host to network byte order conversion for i386 */
187 ((((dw) & 0xFF000000L) >> 24) | \
188 (((dw) & 0x00FF0000L) >> 8) | \
189 (((dw) & 0x0000FF00L) << 8) | \
190 (((dw) & 0x000000FFL) << 24))
192 /* WORD network to host order conversion for i386 */
194 ((((w) & 0xFF00) >> 8) | \
195 (((w) & 0x00FF) << 8))
197 /* WORD host to network byte order conversion for i386 */
199 ((((w) & 0xFF00) >> 8) | \
200 (((w) & 0x00FF) << 8))
204 /* DWORD network to host byte order conversion for other architectures */
208 /* DWORD host to network byte order conversion for other architectures */
212 /* WORD network to host order conversion for other architectures */
216 /* WORD host to network byte order conversion for other architectures */
223 extern NPAGED_LOOKASIDE_LIST BufferLookasideList
;
224 extern NPAGED_LOOKASIDE_LIST ReadRequestLookasideList
;
227 /* Prototypes from dispatch.c */
229 NTSTATUS
AfdDispBind(
231 PIO_STACK_LOCATION IrpSp
);
233 NTSTATUS
AfdDispListen(
235 PIO_STACK_LOCATION IrpSp
);
237 NTSTATUS
AfdDispSendTo(
239 PIO_STACK_LOCATION IrpSp
);
241 NTSTATUS
AfdDispRecvFrom(
243 PIO_STACK_LOCATION IrpSp
);
245 NTSTATUS
AfdDispSelect(
247 PIO_STACK_LOCATION IrpSp
);
249 NTSTATUS
AfdDispEventSelect(
251 PIO_STACK_LOCATION IrpSp
);
253 NTSTATUS
AfdDispEnumNetworkEvents(
255 PIO_STACK_LOCATION IrpSp
);
257 NTSTATUS
AfdDispRecv(
259 PIO_STACK_LOCATION IrpSp
);
261 NTSTATUS
AfdDispSend(
263 PIO_STACK_LOCATION IrpSp
);
265 NTSTATUS
AfdDispConnect(
267 PIO_STACK_LOCATION IrpSp
);
269 /* Prototypes from event.c */
271 NTSTATUS
AfdRegisterEventHandlers(
274 NTSTATUS
AfdDeregisterEventHandlers(
277 /* Prototypes from opnclose.c */
279 NTSTATUS STDCALL
AfdCreate(
280 PDEVICE_OBJECT DeviceObject
,
283 NTSTATUS STDCALL
AfdClose(
284 PDEVICE_OBJECT DeviceObject
,
287 /* Prototypes from rdwr.c */
289 NTSTATUS
AfdEventReceiveDatagramHandler(
290 IN PVOID TdiEventContext
,
291 IN LONG SourceAddressLength
,
292 IN PVOID SourceAddress
,
293 IN LONG OptionsLength
,
295 IN ULONG ReceiveDatagramFlags
,
296 IN ULONG BytesIndicated
,
297 IN ULONG BytesAvailable
,
298 OUT ULONG
* BytesTaken
,
300 OUT PIRP
* IoRequestPacket
);
302 NTSTATUS STDCALL
AfdRead(
303 PDEVICE_OBJECT DeviceObject
,
306 NTSTATUS STDCALL
AfdWrite(
307 PDEVICE_OBJECT DeviceObject
,
310 /* Prototypes from routines.c */
316 NTSTATUS
MergeWSABuffers(
323 NTSTATUS
FillWSABuffers(
329 VOID
BuildIPv4Header(
330 PIPv4_HEADER IPHeader
,
333 PSOCKADDR SourceAddress
,
334 PSOCKADDR DestinationAddress
);
336 /* Prototypes from tdi.c */
338 NTSTATUS
TdiCloseDevice(
340 PFILE_OBJECT FileObject
);
342 NTSTATUS
TdiOpenAddressFileIPv4(
343 PUNICODE_STRING DeviceName
,
345 PHANDLE AddressHandle
,
346 PFILE_OBJECT
*AddressObject
);
348 NTSTATUS
TdiOpenAddressFile(
349 PUNICODE_STRING DeviceName
,
351 PHANDLE AddressHandle
,
352 PFILE_OBJECT
*AddressObject
);
354 NTSTATUS
TdiOpenConnectionEndpointFile(
355 PUNICODE_STRING DeviceName
,
356 PHANDLE ConnectionHandle
,
357 PFILE_OBJECT
*ConnectionObject
);
360 PFILE_OBJECT ConnectionObject
,
361 LPSOCKADDR RemoteAddress
);
363 NTSTATUS
TdiAssociateAddressFile(
364 HANDLE AddressHandle
,
365 PFILE_OBJECT ConnectionObject
);
367 NTSTATUS
TdiSetEventHandler(
368 PFILE_OBJECT FileObject
,
373 NTSTATUS
TdiQueryDeviceControl(
374 PFILE_OBJECT FileObject
,
377 ULONG InputBufferLength
,
379 ULONG OutputBufferLength
,
382 NTSTATUS
TdiQueryInformationEx(
383 PFILE_OBJECT FileObject
,
390 PULONG OutputLength
);
392 NTSTATUS
TdiQueryAddress(
393 PFILE_OBJECT FileObject
,
397 PFILE_OBJECT TransportObject
,
401 NTSTATUS
TdiSendDatagram(
402 PFILE_OBJECT TransportObject
,