typedef struct _AFDFCB {
FsdNTRequiredFCB NTRequiredFCB;
LIST_ENTRY ListEntry;
+ BOOL CommandChannel;
PDEVICE_EXTENSION DeviceExt;
SHARE_ACCESS ShareAccess;
ULONG ReferenceCount;
INT AddressFamily;
INT SocketType;
INT Protocol;
+ SOCKADDR SocketName;
PVOID HelperContext;
DWORD NotificationEvents;
UNICODE_STRING TdiDeviceName;
DWORD State;
+ PVOID SendBuffer;
+ LIST_ENTRY ReceiveQueue;
+ KSPIN_LOCK ReceiveQueueLock;
+ LIST_ENTRY ReadRequestQueue;
+ KSPIN_LOCK ReadRequestQueueLock;
} AFDFCB, *PAFDFCB;
/* Socket states */
#define SOCKET_STATE_BOUND 1
#define SOCKET_STATE_LISTENING 2
+typedef struct _AFD_BUFFER {
+ LIST_ENTRY ListEntry;
+ WSABUF Buffer;
+} AFD_BUFFER, *PAFD_BUFFER;
+
+typedef struct _AFD_READ_REQUEST {
+ LIST_ENTRY ListEntry;
+ PIRP Irp;
+ PFILE_REQUEST_RECVFROM RecvFromRequest;
+ PFILE_REPLY_RECVFROM RecvFromReply;
+} AFD_READ_REQUEST, *PAFD_READ_REQUEST;
+
typedef struct IPSNMP_INFO {
ULONG Forwarding;
ULONG DefaultTTL;
#define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
+/* IPv4 header format */
+typedef struct IPv4_HEADER {
+ UCHAR VerIHL; /* 4-bit version, 4-bit Internet Header Length */
+ UCHAR Tos; /* Type of Service */
+ USHORT TotalLength; /* Total Length */
+ USHORT Id; /* Identification */
+ USHORT FlagsFragOfs; /* 3-bit Flags, 13-bit Fragment Offset */
+ UCHAR Ttl; /* Time to Live */
+ UCHAR Protocol; /* Protocol */
+ USHORT Checksum; /* Header Checksum */
+ ULONG SrcAddr; /* Source Address */
+ ULONG DstAddr; /* Destination Address */
+} IPv4_HEADER, *PIPv4_HEADER;
+
+
/* IOCTL codes */
#define IOCTL_TCP_QUERY_INFORMATION_EX \
#endif /* i386 */
+extern NPAGED_LOOKASIDE_LIST BufferLookasideList;
+extern NPAGED_LOOKASIDE_LIST ReadRequestLookasideList;
+
+
/* Prototypes from dispatch.c */
NTSTATUS AfdDispBind(
PIRP Irp,
PIO_STACK_LOCATION IrpSp);
+NTSTATUS AfdDispSelect(
+ PIRP Irp,
+ PIO_STACK_LOCATION IrpSp);
+
/* Prototypes from event.c */
NTSTATUS AfdRegisterEventHandlers(
/* Prototypes from opnclose.c */
-NTSTATUS AfdCreate(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-NTSTATUS AfdCreateNamedPipe(
+NTSTATUS STDCALL AfdCreate(
PDEVICE_OBJECT DeviceObject,
PIRP Irp);
-NTSTATUS AfdClose(
+NTSTATUS STDCALL AfdClose(
PDEVICE_OBJECT DeviceObject,
PIRP Irp);
IN PVOID Tsdu,
OUT PIRP * IoRequestPacket);
-NTSTATUS AfdRead(
+NTSTATUS STDCALL AfdRead(
PDEVICE_OBJECT DeviceObject,
PIRP Irp);
-NTSTATUS AfdWrite(
+NTSTATUS STDCALL AfdWrite(
PDEVICE_OBJECT DeviceObject,
PIRP Irp);
+/* Prototypes from routines.c */
+
+ULONG WSABufferSize(
+ LPWSABUF Buffers,
+ DWORD BufferCount);
+
+NTSTATUS MergeWSABuffers(
+ LPWSABUF Buffers,
+ DWORD BufferCount,
+ PVOID Destination,
+ ULONG MaxLength,
+ PULONG BytesCopied);
+
+NTSTATUS FillWSABuffers(
+ PAFDFCB FCB,
+ LPWSABUF Buffers,
+ DWORD BufferCount,
+ PULONG BytesCopied);
+
+VOID BuildIPv4Header(
+ PIPv4_HEADER IPHeader,
+ ULONG TotalSize,
+ ULONG Protocol,
+ PSOCKADDR SourceAddress,
+ PSOCKADDR DestinationAddress);
+
/* Prototypes from tdi.c */
NTSTATUS TdiCloseDevice(
PHANDLE AddressHandle,
PFILE_OBJECT *AddressObject);
+NTSTATUS TdiOpenAddressFile(
+ PUNICODE_STRING DeviceName,
+ LPSOCKADDR Name,
+ PHANDLE AddressHandle,
+ PFILE_OBJECT *AddressObject);
+
NTSTATUS TdiSetEventHandler(
PFILE_OBJECT FileObject,
LONG EventType,
NTSTATUS TdiSend(
PFILE_OBJECT TransportObject,
- PFILE_REQUEST_SENDTO Request);
+ PVOID Buffer,
+ ULONG BufferSize);
NTSTATUS TdiSendDatagram(
PFILE_OBJECT TransportObject,
LPSOCKADDR Address,
- PVOID Buffer,
+ PMDL Mdl,
ULONG BufferSize);
#endif /*__AFD_H */