reactos/drivers/network/afd/include/afd.h

415 lines
12 KiB
C
Raw Normal View History

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: drivers/net/afd/include/afd.h
* PURPOSE: Ancillary functions driver -- constants and structures
* PROGRAMMER: Art Yerkes (ayerkes@speakeasy.net)
* UPDATE HISTORY:
* 20040630 Created
*/
#ifndef _AFD_H
#define _AFD_H
#include <ntifs.h>
#include <ndk/obtypes.h>
#include <tdi.h>
#include <tcpioctl.h>
#define _WINBASE_
#define _WINDOWS_H
#define _INC_WINDOWS
#include <windef.h>
#include <winsock2.h>
#include <afd/shared.h>
#include <pseh/pseh2.h>
#include "tdi_proto.h"
#include "tdiconn.h"
#include "debug.h"
#ifndef MIN
#define MIN(x,y) (((x)<(y))?(x):(y))
#endif
#define TL_INSTANCE 0
#define IP_MIB_STATS_ID 1
#define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
#define TAG_AFD_DATA_BUFFER 'BdfA'
#define TAG_AFD_TRANSPORT_ADDRESS 'tdfA'
#define TAG_AFD_SOCKET_CONTEXT 'XdfA'
#define TAG_AFD_CONNECT_DATA 'cdfA'
#define TAG_AFD_DISCONNECT_DATA 'ddfA'
#define TAG_AFD_CONNECT_OPTIONS 'ocfA'
#define TAG_AFD_DISCONNECT_OPTIONS 'odfA'
#define TAG_AFD_ACCEPT_QUEUE 'qafA'
#define TAG_AFD_POLL_HANDLE 'hpfA'
#define TAG_AFD_FCB 'cffA'
#define TAG_AFD_ACTIVE_POLL 'pafA'
#define TAG_AFD_EA_INFO 'aefA'
#define TAG_AFD_STORED_DATAGRAM 'gsfA'
#define TAG_AFD_SNMP_ADDRESS_INFO 'asfA'
#define TAG_AFD_TDI_CONNECTION_INFORMATION 'cTfA'
#define TAG_AFD_WSA_BUFFER 'bWfA'
typedef struct IPADDR_ENTRY {
ULONG Addr;
ULONG Index;
ULONG Mask;
ULONG BcastAddr;
ULONG ReasmSize;
USHORT Context;
USHORT Pad;
} IPADDR_ENTRY, *PIPADDR_ENTRY;
#define DN2H(dw) \
((((dw) & 0xFF000000L) >> 24) | \
(((dw) & 0x00FF0000L) >> 8) | \
(((dw) & 0x0000FF00L) << 8) | \
(((dw) & 0x000000FFL) << 24))
#define SOCKET_STATE_INVALID_TRANSITION ((DWORD)-1)
#define SOCKET_STATE_CREATED 0
#define SOCKET_STATE_BOUND 1
#define SOCKET_STATE_CONNECTING 2
#define SOCKET_STATE_CONNECTED 3
#define SOCKET_STATE_LISTENING 4
#define SOCKET_STATE_MASK 0x0000ffff
#define SOCKET_STATE_EOF_READ 0x20000000
#define SOCKET_STATE_LOCKED 0x40000000
#define SOCKET_STATE_NEW 0x80000000
#define SOCKET_STATE_CLOSED 0x00000100
#define FUNCTION_CONNECT 0
#define FUNCTION_RECV 1
#define FUNCTION_SEND 2
#define FUNCTION_PREACCEPT 3
#define FUNCTION_ACCEPT 4
#define FUNCTION_DISCONNECT 5
#define FUNCTION_CLOSE 6
#define MAX_FUNCTIONS 7
#define IN_FLIGHT_REQUESTS 5
#define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
* for ancillary data on packet
* requests. */
/* XXX This is a hack we should clean up later
* We do this in order to get some storage for the locked handle table
* Maybe I'll use some tail item in the irp instead */
#define AFD_HANDLES(x) ((PAFD_HANDLE)(x)->Exclusive)
merge from amd64 branch. and 35645: Fix some wrong declarations for 64bits. (Samuel Serapión) 35652: More header fixes. (Samuel Serapión) 35950: Implement __readeflags and __writeeflags (Timo Kreuzer) 35951: Remove hacks from __addgsbyte, __addgsword, __addgsdword. (Timo Kreuzer) 36171: Fix TIMERPROC definition. Fix CreateToolbarEx definition. (Samuel Serapión) 36468: Add MemoryBarrier definition for amd64 (Timo Kreuzer) 36469: Fix NetLocalGroupGetMembers prototype. (Samuel Serapión) 36474: Fix ReadProcessMemory and Toolhelp32ReadProcessMemory prototypes. (Samuel Serapión) 36840: fix __rdtsc on amd64 build (Timo Kreuzer) 36898: Fix CryptReleaseContext definition. (Samuel Serapión) 36900: Fix COMBOBOXEXITEA/W noticed by Daniel Verkamp. (Samuel Serapión) 36901: Fix NMHDR definition. noticed by Daniel Verkamp. (Samuel Serapión) 36906: Fix definitions of CDHOOKPROC, PROC, FARPROC, NEARPROC, SYSTEM_INFO, COMPAREITEMSTRUCT, COPYDATASTRUCT, DELETEITEMSTRUCT, DRAWITEMSTRUCT, MENUITEMINFOA/W, HELPINFO, MSGBOXPARAMSA/W, MOUSEHOOKSTRUCT, DROPSTRUCT, KBDLLHOOKSTRUCT, GetProcessAffinityMask, SetProcessAffinityMask, DragObject, InsertMenuA/W, ModifyMenuA/W, WinHelpA/W, RT_GROUP_CURSOR, RT_GROUP_ICON (Daniel Verkamp.) 36953: Fix AFD compilation for 64-bit (treat handles as ULONG_PTR-sized). Also correct Winsock's SOCKET definition (Stefan Ginsberg) 37307: Add UNWIND_HISTORY_TABLE_ENTRY and UNWIND_HISTORY_TABLE. (Timo Kreuzer) 37875: Inlcude excpt.h in winnt.h. (Timo Kreuzer) 37908: Fix definition of SOCKET. (Timo Kreuzer) 37926: fix *HOOKPROC definition. Add 64 bit BitTest functions. (Timo Kreuzer) 38072: Fix FARPROC, NEARPROC, PROC definitions (Samuel Serapión) 38091: Fix some 64bit portability issues. (Samuel Serapión) 38093: Hack for wine specific hack. (Samuel Serapión) 38095: Fix packing for commdlg. (Samuel Serapión) 38260: Fix EDITSTREAM structure. (Samuel Serapión) 38263: Fix definitions of WAVEOPENDESC, WAVEHDR structures. Fix prototypes for DefDriverProc, waveOutMessage, waveOutGetDevCapsA/W, waveInGetDevCapsA/W, waveInMessage, midiStreamOpen, midiOutGetDevCapsA/W, midiOutOpen, midiOutMessage, midiInGetDevCapsA/W, midiInOpen, midiInMessage, auxGetDevCapsA/W, auxOutMessage, mixerGetDevCapsA/W, mixerOpen, timeSetEvent, joyGetDevCapsA/W, mciSendCommandA/W, and mciGetCreatorTask. (Samuel Serapión) 38478: Fix HeapAlloc prototype. (Timo Kreuzer) 39468: Fix some definitions in mmsystem.h (Timo Kreuzer) svn path=/trunk/; revision=39471
2009-02-08 03:41:29 +00:00
#define SET_AFD_HANDLES(x,y) (((x)->Exclusive) = (ULONG_PTR)(y))
typedef struct _AFD_MAPBUF {
PVOID BufferAddress;
PMDL Mdl;
} AFD_MAPBUF, *PAFD_MAPBUF;
typedef struct _AFD_DEVICE_EXTENSION {
PDEVICE_OBJECT DeviceObject;
LIST_ENTRY Polls;
KSPIN_LOCK Lock;
} AFD_DEVICE_EXTENSION, *PAFD_DEVICE_EXTENSION;
typedef struct _AFD_ACTIVE_POLL {
LIST_ENTRY ListEntry;
PIRP Irp;
PAFD_DEVICE_EXTENSION DeviceExt;
KDPC TimeoutDpc;
KTIMER Timer;
PKEVENT EventObject;
BOOLEAN Exclusive;
} AFD_ACTIVE_POLL, *PAFD_ACTIVE_POLL;
typedef struct _IRP_LIST {
LIST_ENTRY ListEntry;
PIRP Irp;
} IRP_LIST, *PIRP_LIST;
typedef struct _AFD_TDI_OBJECT {
PFILE_OBJECT Object;
HANDLE Handle;
} AFD_TDI_OBJECT, *PAFD_TDI_OBJECT;
typedef struct _AFD_TDI_OBJECT_QELT {
LIST_ENTRY ListEntry;
UINT Seq;
PTDI_CONNECTION_INFORMATION ConnInfo;
AFD_TDI_OBJECT Object;
} AFD_TDI_OBJECT_QELT, *PAFD_TDI_OBJECT_QELT;
typedef struct _AFD_IN_FLIGHT_REQUEST {
PIRP InFlightRequest;
PTDI_CONNECTION_INFORMATION ConnectionCallInfo;
PTDI_CONNECTION_INFORMATION ConnectionReturnInfo;
} AFD_IN_FLIGHT_REQUEST, *PAFD_IN_FLIGHT_REQUEST;
typedef struct _AFD_DATA_WINDOW {
PCHAR Window;
UINT BytesUsed, Size, Content;
} AFD_DATA_WINDOW, *PAFD_DATA_WINDOW;
typedef struct _AFD_STORED_DATAGRAM {
LIST_ENTRY ListEntry;
UINT Len;
PTRANSPORT_ADDRESS Address;
CHAR Buffer[1];
} AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
typedef struct _AFD_FCB {
BOOLEAN Locked, Critical, NonBlocking, OobInline, TdiReceiveClosed, SendClosed;
UINT State, Flags, GroupID, GroupType;
KIRQL OldIrql;
UINT LockCount;
PVOID CurrentThread;
PFILE_OBJECT FileObject;
PAFD_DEVICE_EXTENSION DeviceExt;
BOOLEAN DelayedAccept;
UINT ConnSeq;
USHORT DisconnectFlags;
BOOLEAN DisconnectPending;
LARGE_INTEGER DisconnectTimeout;
PTRANSPORT_ADDRESS LocalAddress, RemoteAddress;
PTDI_CONNECTION_INFORMATION AddressFrom, ConnectCallInfo, ConnectReturnInfo;
AFD_TDI_OBJECT AddressFile, Connection;
AFD_IN_FLIGHT_REQUEST ConnectIrp, ListenIrp, ReceiveIrp, SendIrp, DisconnectIrp;
AFD_DATA_WINDOW Send, Recv;
KMUTEX Mutex;
PKEVENT EventSelect;
DWORD EventSelectTriggers;
DWORD EventSelectDisabled;
UNICODE_STRING TdiDeviceName;
PVOID Context;
DWORD PollState;
NTSTATUS PollStatus[FD_MAX_EVENTS];
NTSTATUS LastReceiveStatus;
UINT ContextSize;
PVOID ConnectData;
UINT FilledConnectData;
UINT ConnectDataSize;
PVOID DisconnectData;
UINT FilledDisconnectData;
UINT DisconnectDataSize;
PVOID ConnectOptions;
UINT FilledConnectOptions;
UINT ConnectOptionsSize;
PVOID DisconnectOptions;
UINT FilledDisconnectOptions;
UINT DisconnectOptionsSize;
LIST_ENTRY PendingIrpList[MAX_FUNCTIONS];
LIST_ENTRY DatagramList;
LIST_ENTRY PendingConnections;
} AFD_FCB, *PAFD_FCB;
/* bind.c */
NTSTATUS WarmSocketForBind( PAFD_FCB FCB, ULONG ShareType );
NTSTATUS NTAPI
AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp);
/* connect.c */
NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB );
NTSTATUS WarmSocketForConnection( PAFD_FCB FCB );
NTSTATUS NTAPI
AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp);
NTSTATUS NTAPI
AfdGetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp);
NTSTATUS NTAPI
AfdSetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp);
NTSTATUS NTAPI
AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp);
NTSTATUS NTAPI
AfdGetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp);
NTSTATUS NTAPI
AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp);
NTSTATUS NTAPI
AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp);
/* context.c */
NTSTATUS NTAPI
AfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
NTSTATUS NTAPI
AfdGetContextSize( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
NTSTATUS NTAPI
AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
/* info.c */
NTSTATUS NTAPI
AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
NTSTATUS NTAPI
AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
NTSTATUS NTAPI
AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
NTSTATUS NTAPI
AfdGetPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
/* listen.c */
NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp);
NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
/* lock.c */
PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
PVOID AddressBuf, PINT AddressLen,
BOOLEAN Write, BOOLEAN LockAddress,
KPROCESSOR_MODE LockMode );
VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address );
BOOLEAN SocketAcquireStateLock( PAFD_FCB FCB );
NTSTATUS NTAPI UnlockAndMaybeComplete
( PAFD_FCB FCB, NTSTATUS Status, PIRP Irp,
UINT Information );
VOID SocketStateUnlock( PAFD_FCB FCB );
NTSTATUS LostSocket( PIRP Irp );
PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output, KPROCESSOR_MODE *LockMode );
VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
PVOID GetLockedData( PIRP Irp, PIO_STACK_LOCATION IrpSp );
NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function );
NTSTATUS QueueUserModeIrp(PAFD_FCB FCB, PIRP Irp, UINT Function);
/* main.c */
VOID OskitDumpBuffer( PCHAR Buffer, UINT Len );
VOID DestroySocket( PAFD_FCB FCB );
DRIVER_CANCEL AfdCancelHandler;
VOID RetryDisconnectCompletion(PAFD_FCB FCB);
BOOLEAN CheckUnlockExtraBuffers(PAFD_FCB FCB, PIO_STACK_LOCATION IrpSp);
/* read.c */
IO_COMPLETION_ROUTINE ReceiveComplete;
IO_COMPLETION_ROUTINE PacketSocketRecvComplete;
NTSTATUS NTAPI
AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Short);
NTSTATUS NTAPI
AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
/* select.c */
NTSTATUS NTAPI
AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
NTSTATUS NTAPI
AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
NTSTATUS NTAPI
AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject );
VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt,
PFILE_OBJECT FileObject, BOOLEAN ExclusiveOnly );
VOID ZeroEvents( PAFD_HANDLE HandleArray,
UINT HandleCount );
VOID SignalSocket(
PAFD_ACTIVE_POLL Poll OPTIONAL, PIRP _Irp OPTIONAL,
PAFD_POLL_INFO PollReq, NTSTATUS Status);
/* tdi.c */
NTSTATUS TdiOpenAddressFile(
PUNICODE_STRING DeviceName,
PTRANSPORT_ADDRESS Name,
ULONG ShareType,
PHANDLE AddressHandle,
PFILE_OBJECT *AddressObject);
NTSTATUS TdiAssociateAddressFile(
HANDLE AddressHandle,
PFILE_OBJECT ConnectionObject);
NTSTATUS TdiDisassociateAddressFile(
PFILE_OBJECT ConnectionObject);
NTSTATUS TdiListen
( PIRP *Irp,
PFILE_OBJECT ConnectionObject,
PTDI_CONNECTION_INFORMATION *RequestConnectionInfo,
PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo,
2003-12-25 Casper S. Hornstrup <chorns@users.sourceforge.net> * apps/utils/net/roshttpd/error.cpp (ReportErrorStr): Cast to wchar_t*, not __wchar_t*. * apps/utils/net/roshttpd/makefile (TARGET_CPPFLAGS): Add -Wno-deprecated. (TARGET_GCCLIBS): Add stdc++. * apps/utils/net/roshttpd/common/socket.cpp: Include <string.h>. * apps/utils/net/roshttpd/common/thread.cpp (CThread::CThread): Fix warning. * drivers/net/afd/afd/afd.c (ListenRequestLookasideList): New variable. (DriverEntry): Initialize ListenRequestLookasideList. * drivers/net/afd/afd/dispatch.c (AfdDispCompleteListen): New function. (AfdDispListen): Partial implement. * drivers/net/afd/afd/opnclose.c (AfdInitializeFCB): Initialize NewFCB->ListenRequestQueue. (AfdKillListenRequests): New function. (AfdClose): Call AfdKillListenRequests. * drivers/net/afd/afd/routines.c (DumpName): New function. * drivers/net/afd/afd/tdi.c (TdiAddressSizeFromType): New function. (TdiBuildConnectionInfo): Initialize ConnInfo->OptionsLength. (TdiBuildNullConnectionInfo): New function. (TdiOpenAddressFileIPv4, TdiOpenConnectionEndpointFile): EaName is 0-terminated. (TdiListen): New function. * drivers/net/afd/include/afd.h (AFDFCB): Add ListenRequestQueue. (AFD_LISTEN_REQUEST): New structure. (ListenRequestLookasideList): Declare. (DumpName, TdiListen): Add prototypes. * drivers/net/tcpip/datalink/lan.c (BindAdapter): Initialize AnsiAddress.Length and AnsiAddress.MaximumLength. * drivers/net/tcpip/include/debug.h: Define DEBUG_TCP. * drivers/net/tcpip/include/routines.h (DisplayTCPPacket): Add prototype. (DISPLAY_TCP_PACKET): Define. * drivers/net/tcpip/include/tcp.h (TCPListen): Add prototype. * drivers/net/tcpip/include/titypes.h (ADDRESS_FILE): Add Connection. * drivers/net/tcpip/network/ip.c (IPLocateNTEOnInterface): Cleanup. * drivers/net/tcpip/tcpip/address.c (AddrSearchNext): Port is in network byte order. * drivers/net/tcpip/tcpip/dispatch.c (DispTdiAssociateAddress): Initialize AddrFile->Connection. (DispTdiListen): Implement. * drivers/net/tcpip/tcpip/fileobjs.c (FileOpenAddress): Don't initialize AddrFile->Connections. * drivers/net/tcpip/tcpip/routines.c: Include <tcp.h>. (DisplayIPPacket): Enable. (DisplayTCPHeader, DisplayTCPPacket): New functions. * drivers/net/tcpip/transport/tcp/tcp.c: Include <routines.h>. (TCPListen, TCPiReceive): New functions. (TCPReceive): Partial implement. * lib/msafd/misc/helpers.c (CreateHelperDLLDatabase): Add {SOCK_STREAM,IPPROTO_TCP,0} and {SOCK_DGRAM,IPPROTO_UDP,0} mappings. * lib/ntdll/ldr/utils.c (LdrLoadDll): Print name of DLL if not found. * lib/ws2_32/include/ws2_32.h (Initialized): Declare. (WINSOCK_THREAD_BLOCK): Remove Initialized member. * (WSAINITIALIZED, WSASETINITIALIZED): Update. * lib/ws2_32/misc/catalog.c (CreateCatalog): Add {SOCK_STREAM,IPPROTO_TCP,0} and {SOCK_DGRAM,IPPROTO_UDP,0} mappings. (Initialized): New variable. (DllMain): Don't initialize p->Initialized. * ntoskrnl/dbg/kdb.c: Include <ctype.h>. * subsys/win32k/ntuser/message.c (NtUserDispatchMessage): Kill noisy message. svn path=/trunk/; revision=7232
2003-12-25 14:06:15 +00:00
PIO_COMPLETION_ROUTINE CompletionRoutine,
PVOID CompletionContext);
NTSTATUS TdiReceive
( PIRP *Irp,
PFILE_OBJECT ConnectionObject,
USHORT Flags,
PCHAR Buffer,
UINT BufferLength,
PIO_COMPLETION_ROUTINE CompletionRoutine,
PVOID CompletionContext);
NTSTATUS TdiSend
( PIRP *Irp,
PFILE_OBJECT ConnectionObject,
USHORT Flags,
PCHAR Buffer,
UINT BufferLength,
PIO_COMPLETION_ROUTINE CompletionRoutine,
PVOID CompletionContext);
NTSTATUS TdiReceiveDatagram(
PIRP *Irp,
PFILE_OBJECT TransportObject,
USHORT Flags,
PCHAR Buffer,
UINT BufferLength,
PTDI_CONNECTION_INFORMATION From,
PIO_COMPLETION_ROUTINE CompletionRoutine,
PVOID CompletionContext);
NTSTATUS TdiSendDatagram(
PIRP *Irp,
PFILE_OBJECT TransportObject,
PCHAR Buffer,
UINT BufferLength,
PTDI_CONNECTION_INFORMATION To,
PIO_COMPLETION_ROUTINE CompletionRoutine,
PVOID CompletionContext);
NTSTATUS TdiQueryMaxDatagramLength(
PFILE_OBJECT FileObject,
PUINT MaxDatagramLength);
/* write.c */
NTSTATUS NTAPI
AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp, BOOLEAN Short);
NTSTATUS NTAPI
AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp);
#endif /* _AFD_H */