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
;
89 #define SOCKET_STATE_CREATED 0
90 #define SOCKET_STATE_BOUND 1
91 #define SOCKET_STATE_LISTENING 2
93 typedef struct _AFD_BUFFER
{
96 } AFD_BUFFER
, *PAFD_BUFFER
;
98 typedef struct _AFD_READ_REQUEST
{
101 PFILE_REQUEST_RECVFROM RecvFromRequest
;
102 PFILE_REPLY_RECVFROM RecvFromReply
;
103 } AFD_READ_REQUEST
, *PAFD_READ_REQUEST
;
105 typedef struct IPSNMP_INFO
{
112 ULONG InUnknownProtos
;
116 ULONG RoutingDiscards
;
129 } IPSNMP_INFO
, *PIPSNMP_INFO
;
131 typedef struct IPADDR_ENTRY
{
139 } IPADDR_ENTRY
, *PIPADDR_ENTRY
;
142 #define TL_INSTANCE 0
144 #define IP_MIB_STATS_ID 0x1
145 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
148 /* IPv4 header format */
149 typedef struct IPv4_HEADER
{
150 UCHAR VerIHL
; /* 4-bit version, 4-bit Internet Header Length */
151 UCHAR Tos
; /* Type of Service */
152 USHORT TotalLength
; /* Total Length */
153 USHORT Id
; /* Identification */
154 USHORT FlagsFragOfs
; /* 3-bit Flags, 13-bit Fragment Offset */
155 UCHAR Ttl
; /* Time to Live */
156 UCHAR Protocol
; /* Protocol */
157 USHORT Checksum
; /* Header Checksum */
158 ULONG SrcAddr
; /* Source Address */
159 ULONG DstAddr
; /* Destination Address */
160 } IPv4_HEADER
, *PIPv4_HEADER
;
165 #define IOCTL_TCP_QUERY_INFORMATION_EX \
166 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
168 #define IOCTL_TCP_SET_INFORMATION_EX \
169 CTL_CODE(FILE_DEVICE_NETWORK, 1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
174 /* DWORD network to host byte order conversion for i386 */
176 ((((dw) & 0xFF000000L) >> 24) | \
177 (((dw) & 0x00FF0000L) >> 8) | \
178 (((dw) & 0x0000FF00L) << 8) | \
179 (((dw) & 0x000000FFL) << 24))
181 /* DWORD host to network byte order conversion for i386 */
183 ((((dw) & 0xFF000000L) >> 24) | \
184 (((dw) & 0x00FF0000L) >> 8) | \
185 (((dw) & 0x0000FF00L) << 8) | \
186 (((dw) & 0x000000FFL) << 24))
188 /* WORD network to host order conversion for i386 */
190 ((((w) & 0xFF00) >> 8) | \
191 (((w) & 0x00FF) << 8))
193 /* WORD host to network byte order conversion for i386 */
195 ((((w) & 0xFF00) >> 8) | \
196 (((w) & 0x00FF) << 8))
200 /* DWORD network to host byte order conversion for other architectures */
204 /* DWORD host to network byte order conversion for other architectures */
208 /* WORD network to host order conversion for other architectures */
212 /* WORD host to network byte order conversion for other architectures */
219 extern NPAGED_LOOKASIDE_LIST BufferLookasideList
;
220 extern NPAGED_LOOKASIDE_LIST ReadRequestLookasideList
;
223 /* Prototypes from dispatch.c */
225 NTSTATUS
AfdDispBind(
227 PIO_STACK_LOCATION IrpSp
);
229 NTSTATUS
AfdDispListen(
231 PIO_STACK_LOCATION IrpSp
);
233 NTSTATUS
AfdDispSendTo(
235 PIO_STACK_LOCATION IrpSp
);
237 NTSTATUS
AfdDispRecvFrom(
239 PIO_STACK_LOCATION IrpSp
);
241 NTSTATUS
AfdDispSelect(
243 PIO_STACK_LOCATION IrpSp
);
245 /* Prototypes from event.c */
247 NTSTATUS
AfdRegisterEventHandlers(
250 NTSTATUS
AfdDeregisterEventHandlers(
253 /* Prototypes from opnclose.c */
255 NTSTATUS STDCALL
AfdCreate(
256 PDEVICE_OBJECT DeviceObject
,
259 NTSTATUS STDCALL
AfdClose(
260 PDEVICE_OBJECT DeviceObject
,
263 /* Prototypes from rdwr.c */
265 NTSTATUS
AfdEventReceiveDatagramHandler(
266 IN PVOID TdiEventContext
,
267 IN LONG SourceAddressLength
,
268 IN PVOID SourceAddress
,
269 IN LONG OptionsLength
,
271 IN ULONG ReceiveDatagramFlags
,
272 IN ULONG BytesIndicated
,
273 IN ULONG BytesAvailable
,
274 OUT ULONG
* BytesTaken
,
276 OUT PIRP
* IoRequestPacket
);
278 NTSTATUS STDCALL
AfdRead(
279 PDEVICE_OBJECT DeviceObject
,
282 NTSTATUS STDCALL
AfdWrite(
283 PDEVICE_OBJECT DeviceObject
,
286 /* Prototypes from routines.c */
292 NTSTATUS
MergeWSABuffers(
299 NTSTATUS
FillWSABuffers(
305 VOID
BuildIPv4Header(
306 PIPv4_HEADER IPHeader
,
309 PSOCKADDR SourceAddress
,
310 PSOCKADDR DestinationAddress
);
312 /* Prototypes from tdi.c */
314 NTSTATUS
TdiCloseDevice(
316 PFILE_OBJECT FileObject
);
318 NTSTATUS
TdiOpenAddressFileIPv4(
319 PUNICODE_STRING DeviceName
,
321 PHANDLE AddressHandle
,
322 PFILE_OBJECT
*AddressObject
);
324 NTSTATUS
TdiOpenAddressFile(
325 PUNICODE_STRING DeviceName
,
327 PHANDLE AddressHandle
,
328 PFILE_OBJECT
*AddressObject
);
330 NTSTATUS
TdiSetEventHandler(
331 PFILE_OBJECT FileObject
,
336 NTSTATUS
TdiQueryDeviceControl(
337 PFILE_OBJECT FileObject
,
340 ULONG InputBufferLength
,
342 ULONG OutputBufferLength
,
345 NTSTATUS
TdiQueryInformationEx(
346 PFILE_OBJECT FileObject
,
353 PULONG OutputLength
);
355 NTSTATUS
TdiQueryAddress(
356 PFILE_OBJECT FileObject
,
360 PFILE_OBJECT TransportObject
,
364 NTSTATUS
TdiSendDatagram(
365 PFILE_OBJECT TransportObject
,