1779 lines
33 KiB
C
1779 lines
33 KiB
C
/*++
|
||
|
||
Copyright (c) 1989-1993 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
ipxprocs.h
|
||
|
||
Abstract:
|
||
|
||
This module contains definitions specific to the
|
||
IPX module of the ISN transport.
|
||
|
||
Author:
|
||
|
||
Adam Barr (adamba) 2-September-1993
|
||
|
||
Environment:
|
||
|
||
Kernel mode
|
||
|
||
Revision History:
|
||
|
||
Sanjay Anand (SanjayAn) 3-Oct-1995
|
||
Changes to support transfer of buffer ownership to transports - tagged [CH]
|
||
1. Added new functions - IpxReceivePacket, IpxReceiveIndicationCommon
|
||
|
||
Sanjay Anand (SanjayAn) 27-Oct-1995
|
||
Changes to support Plug and Play
|
||
|
||
--*/
|
||
|
||
|
||
//
|
||
// MACROS.
|
||
//
|
||
//
|
||
// Debugging aids
|
||
//
|
||
|
||
//
|
||
// VOID
|
||
// PANIC(
|
||
// IN PSZ Message
|
||
// );
|
||
//
|
||
|
||
#if DBG
|
||
#define PANIC(Msg) \
|
||
CTEPrint ((Msg))
|
||
#else
|
||
#define PANIC(Msg)
|
||
#endif
|
||
|
||
|
||
//
|
||
// These are define to allow CTEPrints that disappear when
|
||
// DBG is 0.
|
||
//
|
||
|
||
#if STEFAN_DBG
|
||
// #if DBG
|
||
#define IpxPrint0(fmt) DbgPrint(fmt)
|
||
#define IpxPrint1(fmt,v0) DbgPrint(fmt,v0)
|
||
#define IpxPrint2(fmt,v0,v1) DbgPrint(fmt,v0,v1)
|
||
#define IpxPrint3(fmt,v0,v1,v2) DbgPrint(fmt,v0,v1,v2)
|
||
#define IpxPrint4(fmt,v0,v1,v2,v3) DbgPrint(fmt,v0,v1,v2,v3)
|
||
#define IpxPrint5(fmt,v0,v1,v2,v3,v4) DbgPrint(fmt,v0,v1,v2,v3,v4)
|
||
#define IpxPrint6(fmt,v0,v1,v2,v3,v4,v5) DbgPrint(fmt,v0,v1,v2,v3,v4,v5)
|
||
#else
|
||
#define IpxPrint0(fmt)
|
||
#define IpxPrint1(fmt,v0)
|
||
#define IpxPrint2(fmt,v0,v1)
|
||
#define IpxPrint3(fmt,v0,v1,v2)
|
||
#define IpxPrint4(fmt,v0,v1,v2,v3)
|
||
#define IpxPrint5(fmt,v0,v1,v2,v3,v4)
|
||
#define IpxPrint6(fmt,v0,v1,v2,v3,v4,v5)
|
||
#endif
|
||
|
||
|
||
//
|
||
// Routines to log packets to a buffer.
|
||
//
|
||
|
||
#if DBG
|
||
#define IPX_PACKET_LOG 1
|
||
#endif
|
||
|
||
#ifdef IPX_PACKET_LOG
|
||
|
||
//
|
||
// The size of this is 64 bytes for easy display.
|
||
//
|
||
|
||
typedef struct _IPX_PACKET_LOG_ENTRY {
|
||
UCHAR SendReceive;
|
||
UCHAR TimeStamp[5]; // low 5 digits of tick count.
|
||
UCHAR DestMac[6];
|
||
UCHAR SrcMac[6];
|
||
UCHAR Length[2];
|
||
IPX_HEADER IpxHeader;
|
||
UCHAR Data[14];
|
||
} IPX_PACKET_LOG_ENTRY, *PIPX_PACKET_LOG_ENTRY;
|
||
|
||
#define IPX_PACKET_LOG_LENGTH 128
|
||
extern ULONG IpxPacketLogDebug;
|
||
extern USHORT IpxPacketLogSocket;
|
||
EXTERNAL_LOCK(IpxPacketLogLock);
|
||
extern IPX_PACKET_LOG_ENTRY IpxPacketLog[IPX_PACKET_LOG_LENGTH];
|
||
extern PIPX_PACKET_LOG_ENTRY IpxPacketLogLoc;
|
||
extern PIPX_PACKET_LOG_ENTRY IpxPacketLogEnd;
|
||
|
||
//
|
||
// Bit fields in IpxPacketLogDebug
|
||
//
|
||
|
||
#define IPX_PACKET_LOG_RCV_RIP 0x0001 // All RIP packets
|
||
#define IPX_PACKET_LOG_RCV_SPX 0x0002 // All SPX packets
|
||
#define IPX_PACKET_LOG_RCV_NB 0x0004 // All Netbios packets
|
||
#define IPX_PACKET_LOG_RCV_OTHER 0x0008 // All TDI client packets
|
||
#define IPX_PACKET_LOG_RCV_SOCKET 0x0010 // All packets to IpxPacketLogSocket
|
||
#define IPX_PACKET_LOG_RCV_ALL 0x0020 // All packets (even non-IPX)
|
||
|
||
#define IPX_PACKET_LOG_SEND_RIP 0x0001 // All RIP packets
|
||
#define IPX_PACKET_LOG_SEND_SPX 0x0002 // All SPX packets
|
||
#define IPX_PACKET_LOG_SEND_NB 0x0004 // All Netbios packets
|
||
#define IPX_PACKET_LOG_SEND_OTHER 0x0008 // All TDI client packets
|
||
#define IPX_PACKET_LOG_SEND_SOCKET 0x0010 // All packets from IpxPacketLogSocket
|
||
|
||
VOID
|
||
IpxLogPacket(
|
||
IN BOOLEAN Send,
|
||
IN PUCHAR DestMac,
|
||
IN PUCHAR SrcMac,
|
||
IN USHORT Length,
|
||
IN PVOID IpxHeader,
|
||
IN PVOID Data
|
||
);
|
||
|
||
#define PACKET_LOG(_Bit) (IpxPacketLogDebug & (_Bit))
|
||
|
||
#else // IPX_PACKET_LOG
|
||
|
||
#define IpxLogPacket(_MacHeader,_Length,_IpxHeader,_Data)
|
||
#define PACKET_LOG(_Bit) 0
|
||
|
||
#endif // IPX_PACKET_LOG
|
||
|
||
//
|
||
// In load-only PnP, references are not needed on adapters. This should be changed
|
||
// to actually take the reference post 4.0.
|
||
//
|
||
// Revisit Post 4.0 - Keep the actual instructions around for ease of activation later.
|
||
//
|
||
#define IpxReferenceAdapter(_adapter)
|
||
// InterlockedIncrement(&(_adapter)->ReferenceCount)
|
||
|
||
#define IpxDereferenceAdapter(_adapter)
|
||
/*
|
||
if (InterlockedDecrement(&(_adapter)->ReferenceCount) == 0) {\
|
||
IpxCloseNdis(_adapter); \
|
||
IpxDestroyAdapter(_adapter);\
|
||
}\
|
||
*/
|
||
|
||
//
|
||
// In load-only PnP case, we dont need the references on bindings. All such references
|
||
// have been changed to this macro.
|
||
//
|
||
#define IpxReferenceBinding1(_Binding, _Type)
|
||
|
||
#define IpxDereferenceBinding1(_Binding, _Type)
|
||
|
||
#if DBG
|
||
|
||
#define IpxReferenceBinding(_Binding, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Binding)->RefTypes[_Type], \
|
||
1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxRefBinding (_Binding)
|
||
|
||
#define IpxDereferenceBinding(_Binding, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Binding)->RefTypes[_Type], \
|
||
(ULONG)-1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxDerefBinding (_Binding)
|
||
|
||
#define IpxReferenceDevice(_Device, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Device)->RefTypes[_Type], \
|
||
1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxRefDevice (_Device)
|
||
|
||
#define IpxDereferenceDevice(_Device, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Device)->RefTypes[_Type], \
|
||
(ULONG)-1, \
|
||
&IpxGlobalInterlock); \
|
||
CTEAssert ((_Device)->RefTypes[_Type] >= 0); \
|
||
IpxDerefDevice (_Device)
|
||
|
||
#define IpxReferenceAdapter1(_Adapter, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Adapter)->RefTypes[_Type], \
|
||
1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxRefAdapter (_Adapter)
|
||
|
||
#define IpxDereferenceAdapter1(_Adapter, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Adapter)->RefTypes[_Type], \
|
||
(ULONG)-1, \
|
||
&IpxGlobalInterlock); \
|
||
ASSERT((_Adapter)->RefTypes[_Type] >= 0); \
|
||
IpxDerefAdapter (_Adapter)
|
||
|
||
#define IpxReferenceAddress(_Address, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Address)->RefTypes[_Type], \
|
||
1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxRefAddress (_Address)
|
||
|
||
#define IpxReferenceAddressLock(_Address, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Address)->RefTypes[_Type], \
|
||
1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxRefAddressLock (_Address)
|
||
|
||
#define IpxDereferenceAddress(_Address, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Address)->RefTypes[_Type], \
|
||
(ULONG)-1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxDerefAddress (_Address)
|
||
|
||
#define IpxDereferenceAddressSync(_Address, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Address)->RefTypes[_Type], \
|
||
(ULONG)-1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxDerefAddressSync (_Address)
|
||
|
||
|
||
#define IpxReferenceAddressFile(_AddressFile, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_AddressFile)->RefTypes[_Type], \
|
||
1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxRefAddressFile (_AddressFile)
|
||
|
||
#define IpxReferenceAddressFileLock(_AddressFile, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_AddressFile)->RefTypes[_Type], \
|
||
1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxRefAddressFileLock (_AddressFile)
|
||
|
||
#define IpxReferenceAddressFileSync(_AddressFile, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_AddressFile)->RefTypes[_Type], \
|
||
1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxRefAddressFileSync (_AddressFile)
|
||
|
||
#define IpxDereferenceAddressFile(_AddressFile, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_AddressFile)->RefTypes[_Type], \
|
||
(ULONG)-1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxDerefAddressFile (_AddressFile)
|
||
|
||
#define IpxDereferenceAddressFileSync(_AddressFile, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_AddressFile)->RefTypes[_Type], \
|
||
(ULONG)-1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxDerefAddressFileSync (_AddressFile)
|
||
|
||
#define IpxTransferReferenceAddressFile(_AddressFile, _OldType, _NewType) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_AddressFile)->RefTypes[_NewType], \
|
||
1, \
|
||
&IpxGlobalInterlock); \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_AddressFile)->RefTypes[_OldType], \
|
||
(ULONG)-1, \
|
||
&IpxGlobalInterlock);
|
||
|
||
#define IpxReferenceRt(_Rt, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Rt)->RefTypes[_Type], \
|
||
1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxRefRt (_Rt)
|
||
|
||
#define IpxDereferenceRt(_Rt, _Type) \
|
||
(VOID)IPX_ADD_ULONG ( \
|
||
&(_Rt)->RefTypes[_Type], \
|
||
(ULONG)-1, \
|
||
&IpxGlobalInterlock); \
|
||
IpxDerefRt (_Rt)
|
||
|
||
#else // DBG
|
||
|
||
#define IpxReferenceBinding(_Binding, _Type) \
|
||
InterlockedIncrement(&(_Binding)->ReferenceCount)
|
||
|
||
#define IpxDereferenceBinding(_Binding, _Type) \
|
||
IpxDerefBinding (_Binding)
|
||
|
||
#define IpxReferenceDevice(_Device, _Type) \
|
||
InterlockedIncrement(&(_Device)->ReferenceCount)
|
||
|
||
#define IpxDereferenceDevice(_Device, _Type) \
|
||
IpxDerefDevice (_Device)
|
||
|
||
#define IpxReferenceAdapter1(_Adapter, _Type) \
|
||
InterlockedIncrement(&(_Adapter)->ReferenceCount)
|
||
|
||
#define IpxDereferenceAdapter1(_Adapter, _Type) \
|
||
IpxDerefAdapter (_Adapter)
|
||
|
||
|
||
#define IpxReferenceAddress(_Address, _Type) \
|
||
InterlockedIncrement(&(_Address)->ReferenceCount)
|
||
|
||
#define IpxReferenceAddressLock(_Address, _Type) \
|
||
InterlockedIncrement(&(_Address)->ReferenceCount)
|
||
|
||
#define IpxDereferenceAddress(_Address, _Type) \
|
||
IpxDerefAddress (_Address)
|
||
|
||
#define IpxDereferenceAddressSync(_Address, _Type) \
|
||
IpxDerefAddressSync (_Address)
|
||
|
||
#define IpxReferenceAddressFile(_AddressFile, _Type) \
|
||
InterlockedIncrement(&(_AddressFile)->ReferenceCount)
|
||
|
||
#define IpxReferenceAddressFileLock(_AddressFile, _Type) \
|
||
InterlockedIncrement(&(_AddressFile)->ReferenceCount)
|
||
|
||
#define IpxReferenceAddressFileSync(_AddressFile, _Type) \
|
||
(VOID)IPX_ADD_ULONG( \
|
||
&(_AddressFile)->ReferenceCount, \
|
||
1, \
|
||
(_AddressFile)->AddressLock)
|
||
|
||
#define IpxDereferenceAddressFile(_AddressFile, _Type) \
|
||
if (InterlockedDecrement(&(_AddressFile)->ReferenceCount) == 0) { \
|
||
IpxDestroyAddressFile (_AddressFile); \
|
||
}
|
||
|
||
#define IpxDereferenceAddressFileSync(_AddressFile, _Type) \
|
||
if (InterlockedDecrement(&(_AddressFile)->ReferenceCount) == 0) { \
|
||
IpxDestroyAddressFile (_AddressFile); \
|
||
}
|
||
|
||
#define IpxTransferReferenceAddressFile(_AddressFile, _OldType, _NewType)
|
||
|
||
#define IpxReferenceRt(_Rt, _Type) \
|
||
InterlockedIncrement(&(_Rt)->ReferenceCount)
|
||
|
||
#define IpxDereferenceRt(_Rt, _Type) \
|
||
IpxDerefRt (_Rt)
|
||
|
||
#endif // DBG
|
||
|
||
|
||
|
||
#if DBG
|
||
|
||
#define IpxAllocateMemory(_BytesNeeded,_Tag,_Description) \
|
||
IpxpAllocateTaggedMemory(_BytesNeeded,_Tag,_Description)
|
||
|
||
#define IpxFreeMemory(_Memory,_BytesAllocated,_Tag,_Description) \
|
||
IpxpFreeTaggedMemory(_Memory,_BytesAllocated,_Tag,_Description)
|
||
|
||
#else // DBG
|
||
|
||
#if TRACK
|
||
|
||
PVOID
|
||
IpxAllocateMemoryTrack(
|
||
IN ULONG BytesNeeded,
|
||
IN ULONG Tag,
|
||
IN ULONG ModLine
|
||
);
|
||
|
||
VOID
|
||
IpxFreeMemoryTrack(
|
||
IN PVOID Memory
|
||
);
|
||
|
||
#define IpxAllocateMemory(_BytesNeeded,_Tag,_Description) \
|
||
IpxAllocateMemoryTrack(_BytesNeeded,_Tag,MODULE+__LINE__)
|
||
|
||
#define IpxFreeMemory(_Memory,_BytesAllocated,_Tag,_Description) \
|
||
IpxFreeMemoryTrack(_Memory)
|
||
|
||
#else
|
||
|
||
#define IpxAllocateMemory(_BytesNeeded,_Tag,_Description) \
|
||
IpxpAllocateMemory(_BytesNeeded,_Tag,(BOOLEAN)((_Tag) != MEMORY_CONFIG))
|
||
|
||
#define IpxFreeMemory(_Memory,_BytesAllocated,_Tag,_Description) \
|
||
IpxpFreeMemory(_Memory,_BytesAllocated,(BOOLEAN)((_Tag) != MEMORY_CONFIG))
|
||
|
||
|
||
#endif // TRACK
|
||
#endif // DBG
|
||
|
||
|
||
//
|
||
// This routine compares two node addresses.
|
||
//
|
||
|
||
#define IPX_NODE_EQUAL(_A,_B) \
|
||
((*(UNALIGNED ULONG *)((PUCHAR)(_A)) == *(UNALIGNED ULONG *)((PUCHAR)(_B))) && \
|
||
(*(UNALIGNED USHORT *)(((PUCHAR)(_A))+4) == *(UNALIGNED USHORT *)(((PUCHAR)(_B))+4)))
|
||
|
||
//
|
||
// This routine checks if an address is the broadcast address.
|
||
//
|
||
|
||
#define IPX_NODE_BROADCAST(_A) \
|
||
((*(UNALIGNED ULONG *)((PUCHAR)(_A)) == 0xffffffff) && \
|
||
(*(UNALIGNED USHORT *)(((PUCHAR)(_A))+4) == 0xffff))
|
||
|
||
//
|
||
// This routine does an ordered compare of two node addresses. It
|
||
// can handle the first address having the source-routing bit on.
|
||
//
|
||
|
||
#define IPX_NODE_COMPARE(_A,_B,_R) \
|
||
if ((*(_R) = (*(UNALIGNED SHORT *)(((PUCHAR)(_A))+4) - *(UNALIGNED SHORT *)(((PUCHAR)(_B))+4))) == 0) { \
|
||
*(_R) = ((*(UNALIGNED LONG *)((PUCHAR)(_A)) & 0xffffff7f) - *(UNALIGNED LONG *)((PUCHAR)(_B))); \
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// Routines in action.c
|
||
//
|
||
|
||
NTSTATUS
|
||
IpxTdiAction(
|
||
IN PDEVICE Device,
|
||
IN PREQUEST Request
|
||
);
|
||
|
||
VOID
|
||
IpxCancelAction(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
VOID
|
||
IpxAbortLineChanges(
|
||
IN PVOID ControlChannelContext
|
||
);
|
||
|
||
VOID
|
||
IpxAbortNtfChanges(
|
||
IN PVOID ControlChannelContext
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxIndicateLineUp(
|
||
IN PDEVICE Device,
|
||
IN USHORT NicId,
|
||
IN ULONG Network,
|
||
IN UCHAR LocalNode[6],
|
||
IN UCHAR RemoteNode[6]
|
||
);
|
||
|
||
//
|
||
// Routines in adapter.c
|
||
//
|
||
|
||
VOID
|
||
IpxRefBinding(
|
||
IN PBINDING Binding
|
||
);
|
||
|
||
VOID
|
||
IpxDerefBinding(
|
||
IN PBINDING Binding
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxCreateAdapter(
|
||
IN PDEVICE Device,
|
||
IN PUNICODE_STRING AdapterName,
|
||
IN OUT PADAPTER *AdapterPtr
|
||
);
|
||
|
||
VOID
|
||
IpxDestroyAdapter(
|
||
IN PADAPTER Adapter
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxCreateBinding(
|
||
IN PDEVICE Device,
|
||
IN PBINDING_CONFIG ConfigBinding OPTIONAL,
|
||
IN ULONG NetworkNumberIndex,
|
||
IN PWCHAR AdapterName,
|
||
IN OUT PBINDING *BindingPtr
|
||
);
|
||
|
||
VOID
|
||
IpxDestroyBinding(
|
||
IN PBINDING Binding
|
||
);
|
||
|
||
VOID
|
||
IpxAllocateBindingPool(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
PSINGLE_LIST_ENTRY
|
||
IpxPopBinding(
|
||
PDEVICE Device
|
||
);
|
||
|
||
//
|
||
// [FW] New functions added for Forwarder support
|
||
//
|
||
#ifdef SUNDOWN
|
||
NTSTATUS
|
||
IpxOpenAdapter(
|
||
IN NIC_HANDLE AdapterIndex,
|
||
IN ULONG_PTR FwdAdapterContext,
|
||
OUT PNIC_HANDLE IpxAdapterContext
|
||
);
|
||
#else
|
||
NTSTATUS
|
||
IpxOpenAdapter(
|
||
IN NIC_HANDLE AdapterIndex,
|
||
IN ULONG FwdAdapterContext,
|
||
OUT PNIC_HANDLE IpxAdapterContext
|
||
);
|
||
#endif
|
||
|
||
|
||
|
||
NTSTATUS
|
||
IpxCloseAdapter(
|
||
IN NIC_HANDLE IpxAdapterContext
|
||
);
|
||
|
||
//
|
||
// Routines in address.c
|
||
//
|
||
|
||
TDI_ADDRESS_IPX UNALIGNED *
|
||
IpxParseTdiAddress(
|
||
IN TRANSPORT_ADDRESS UNALIGNED * TransportAddress
|
||
);
|
||
|
||
BOOLEAN
|
||
IpxValidateTdiAddress(
|
||
IN TRANSPORT_ADDRESS UNALIGNED * TransportAddress,
|
||
IN ULONG TransportAddressLength
|
||
);
|
||
|
||
#if DBG
|
||
|
||
VOID
|
||
IpxBuildTdiAddress(
|
||
IN PVOID AddressBuffer,
|
||
IN ULONG Network,
|
||
IN UCHAR Node[6],
|
||
IN USHORT Socket
|
||
);
|
||
|
||
#else
|
||
|
||
#define IpxBuildTdiAddress(_AddressBuffer,_Network,_Node,_Socket) { \
|
||
TA_IPX_ADDRESS UNALIGNED * _IpxAddress = (TA_IPX_ADDRESS UNALIGNED *)(_AddressBuffer); \
|
||
_IpxAddress->TAAddressCount = 1; \
|
||
_IpxAddress->Address[0].AddressLength = sizeof(TDI_ADDRESS_IPX); \
|
||
_IpxAddress->Address[0].AddressType = TDI_ADDRESS_TYPE_IPX; \
|
||
_IpxAddress->Address[0].Address[0].NetworkAddress = (_Network); \
|
||
_IpxAddress->Address[0].Address[0].Socket = (_Socket); \
|
||
RtlCopyMemory(_IpxAddress->Address[0].Address[0].NodeAddress, (_Node), 6); \
|
||
}
|
||
|
||
#endif
|
||
|
||
NTSTATUS
|
||
IpxOpenAddress(
|
||
IN PDEVICE Device,
|
||
IN PREQUEST Request
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxOpenAddressM(
|
||
IN PDEVICE Device,
|
||
IN PREQUEST Request,
|
||
IN ULONG Index
|
||
);
|
||
|
||
USHORT
|
||
IpxAssignSocket(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
PADDRESS
|
||
IpxCreateAddress(
|
||
IN PDEVICE Device,
|
||
IN USHORT Socket
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxVerifyAddressFile(
|
||
IN PADDRESS_FILE AddressFile
|
||
);
|
||
|
||
VOID
|
||
IpxDestroyAddress(
|
||
IN PVOID Parameter
|
||
);
|
||
|
||
#if DBG
|
||
|
||
VOID
|
||
IpxRefAddress(
|
||
IN PADDRESS Address
|
||
);
|
||
|
||
VOID
|
||
IpxRefAddressLock(
|
||
IN PADDRESS Address
|
||
);
|
||
|
||
#endif
|
||
|
||
VOID
|
||
IpxDerefAddress(
|
||
IN PADDRESS Address
|
||
);
|
||
|
||
VOID
|
||
IpxDerefAddressSync(
|
||
IN PADDRESS Address
|
||
);
|
||
|
||
PADDRESS_FILE
|
||
IpxCreateAddressFile(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxDestroyAddressFile(
|
||
IN PADDRESS_FILE AddressFile
|
||
);
|
||
|
||
#if DBG
|
||
|
||
VOID
|
||
IpxRefAddressFile(
|
||
IN PADDRESS_FILE AddressFile
|
||
);
|
||
|
||
VOID
|
||
IpxRefAddressFileLock(
|
||
IN PADDRESS_FILE AddressFile
|
||
);
|
||
|
||
VOID
|
||
IpxRefAddressFileSync(
|
||
IN PADDRESS_FILE AddressFile
|
||
);
|
||
|
||
VOID
|
||
IpxDerefAddressFile(
|
||
IN PADDRESS_FILE AddressFile
|
||
);
|
||
|
||
VOID
|
||
IpxDerefAddressFileSync(
|
||
IN PADDRESS_FILE AddressFile
|
||
);
|
||
|
||
#endif
|
||
|
||
PADDRESS
|
||
IpxLookupAddress(
|
||
IN PDEVICE Device,
|
||
IN USHORT Socket
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxStopAddressFile(
|
||
IN PADDRESS_FILE AddressFile
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxCloseAddressFile(
|
||
IN PDEVICE Device,
|
||
IN PREQUEST Request
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in device.c
|
||
//
|
||
|
||
VOID
|
||
IpxRefDevice(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
VOID
|
||
IpxDerefDevice(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
VOID
|
||
IpxRefAdapter(
|
||
IN PADAPTER Adapter
|
||
);
|
||
|
||
VOID
|
||
IpxDerefAdapter(
|
||
IN PADAPTER Adapter
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxCreateDevice(
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PUNICODE_STRING DeviceName,
|
||
IN ULONG SegmentCount,
|
||
IN OUT PDEVICE *DevicePtr
|
||
);
|
||
|
||
VOID
|
||
IpxDestroyDevice(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in driver.c
|
||
//
|
||
VOID
|
||
IpxPnPUpdateDevice(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
BOOLEAN
|
||
IpxIsAddressLocal(
|
||
IN TDI_ADDRESS_IPX UNALIGNED * SourceAddress
|
||
);
|
||
|
||
PVOID
|
||
IpxpAllocateMemory(
|
||
IN ULONG BytesNeeded,
|
||
IN ULONG Tag,
|
||
IN BOOLEAN ChargeDevice
|
||
);
|
||
|
||
VOID
|
||
IpxpFreeMemory(
|
||
IN PVOID Memory,
|
||
IN ULONG BytesAllocated,
|
||
IN BOOLEAN ChargeDevice
|
||
);
|
||
|
||
#if DBG
|
||
|
||
PVOID
|
||
IpxpAllocateTaggedMemory(
|
||
IN ULONG BytesNeeded,
|
||
IN ULONG Tag,
|
||
IN PUCHAR Description
|
||
);
|
||
|
||
VOID
|
||
IpxpFreeTaggedMemory(
|
||
IN PVOID Memory,
|
||
IN ULONG BytesAllocated,
|
||
IN ULONG Tag,
|
||
IN PUCHAR Description
|
||
);
|
||
|
||
#endif
|
||
|
||
VOID
|
||
IpxWriteResourceErrorLog(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN NTSTATUS ErrorCode,
|
||
IN ULONG BytesNeeded,
|
||
IN ULONG UniqueErrorValue
|
||
);
|
||
|
||
VOID
|
||
IpxWriteGeneralErrorLog(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN NTSTATUS ErrorCode,
|
||
IN ULONG UniqueErrorValue,
|
||
IN NTSTATUS FinalStatus,
|
||
IN PWSTR SecondString,
|
||
IN ULONG DumpDataCount,
|
||
IN ULONG DumpData[]
|
||
);
|
||
|
||
VOID
|
||
IpxWriteOidErrorLog(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN NTSTATUS ErrorCode,
|
||
IN NTSTATUS FinalStatus,
|
||
IN PWSTR AdapterString,
|
||
IN ULONG OidValue
|
||
);
|
||
|
||
ULONG
|
||
IpxResolveAutoDetect(
|
||
IN PDEVICE Device,
|
||
IN ULONG ValidBindings,
|
||
IN CTELockHandle *LockHandle1,
|
||
IN PUNICODE_STRING RegistryPath,
|
||
IN PADAPTER Adapter
|
||
);
|
||
|
||
VOID
|
||
IpxResolveBindingSets(
|
||
IN PDEVICE Device,
|
||
IN ULONG ValidBindings
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxBindToAdapter(
|
||
IN PDEVICE Device,
|
||
IN PBINDING_CONFIG ConfigAdapter,
|
||
IN PADAPTER *AdapterPtr,
|
||
IN ULONG FrameTypeIndex
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxUnBindFromAdapter(
|
||
IN PBINDING Binding
|
||
);
|
||
|
||
VOID
|
||
IpxPnPUpdateBindingArray(
|
||
IN PDEVICE Device,
|
||
IN PADAPTER Adapter,
|
||
IN PBINDING_CONFIG ConfigBinding
|
||
);
|
||
|
||
VOID
|
||
IpxPnPToLoad();
|
||
|
||
NTSTATUS
|
||
IpxPnPReallocateBindingArray(
|
||
IN PDEVICE Device,
|
||
IN ULONG Size
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in event.c
|
||
//
|
||
|
||
NTSTATUS
|
||
IpxTdiSetEventHandler(
|
||
IN PREQUEST Request
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in ind.c
|
||
//
|
||
|
||
//
|
||
// [CH] Added these two functions
|
||
//
|
||
INT
|
||
IpxReceivePacket (
|
||
IN NDIS_HANDLE ProtocolBindingContext,
|
||
IN PNDIS_PACKET Packet
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxReceiveIndicationCommon(
|
||
IN NDIS_HANDLE BindingContext,
|
||
IN NDIS_HANDLE ReceiveContext,
|
||
IN PVOID HeaderBuffer,
|
||
IN UINT HeaderBufferSize,
|
||
IN PVOID LookaheadBuffer,
|
||
IN UINT LookaheadBufferSize,
|
||
IN UINT PacketSize,
|
||
IN PMDL pMdl,
|
||
IN PINT pTdiClientCount
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxReceiveIndication(
|
||
IN NDIS_HANDLE BindingContext,
|
||
IN NDIS_HANDLE ReceiveContext,
|
||
IN PVOID HeaderBuffer,
|
||
IN UINT HeaderBufferSize,
|
||
IN PVOID LookaheadBuffer,
|
||
IN UINT LookaheadBufferSize,
|
||
IN UINT PacketSize
|
||
);
|
||
|
||
VOID
|
||
IpxReceiveComplete(
|
||
IN NDIS_HANDLE BindingContext
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxUpdateBindingNetwork(
|
||
IN PDEVICE Device,
|
||
IN PBINDING Binding,
|
||
IN ULONG Network
|
||
);
|
||
|
||
BOOLEAN
|
||
IpxNewVirtualNetwork(
|
||
IN PDEVICE Device,
|
||
IN BOOLEAN NewVirtualNetwork
|
||
);
|
||
//
|
||
// Routines in internal.c
|
||
//
|
||
|
||
NTSTATUS
|
||
IpxInternalBind(
|
||
IN PDEVICE Device,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxInternalUnbind(
|
||
IN PDEVICE Device,
|
||
IN UINT Identifier
|
||
);
|
||
|
||
VOID
|
||
IpxInternalFindRoute(
|
||
IN PIPX_FIND_ROUTE_REQUEST FindRouteRequest
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxInternalQuery(
|
||
IN ULONG InternalQueryType,
|
||
IN PNIC_HANDLE NicHandle OPTIONAL,
|
||
IN OUT PVOID Buffer,
|
||
IN ULONG BufferLength,
|
||
OUT PULONG BufferLengthNeeded OPTIONAL
|
||
);
|
||
|
||
VOID
|
||
IpxPnPCompletionHandler(
|
||
IN PNET_PNP_EVENT NetPnPEvent,
|
||
IN NTSTATUS Status
|
||
);
|
||
|
||
VOID
|
||
IpxInternalIncrementWanInactivity(
|
||
#ifdef _PNP_LATER
|
||
IN NIC_HANDLE NicHandle
|
||
#else
|
||
IN USHORT NicId
|
||
#endif
|
||
);
|
||
|
||
ULONG
|
||
IpxInternalQueryWanInactivity(
|
||
#ifdef _PNP_LATER
|
||
IN NIC_HANDLE NicHandle
|
||
#else
|
||
IN USHORT NicId
|
||
#endif
|
||
);
|
||
|
||
VOID
|
||
IpxPnPIsnIndicate(
|
||
IN PVOID Param
|
||
);
|
||
|
||
//
|
||
// Routines in ndis.c
|
||
//
|
||
|
||
NTSTATUS
|
||
IpxRegisterProtocol(
|
||
IN PNDIS_STRING NameString
|
||
);
|
||
|
||
VOID
|
||
IpxDeregisterProtocol(
|
||
VOID
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxInitializeNdis(
|
||
IN PADAPTER Adapter,
|
||
IN PBINDING_CONFIG ConfigBinding
|
||
);
|
||
|
||
VOID
|
||
IpxAddBroadcast(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
VOID
|
||
IpxRemoveBroadcast(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
VOID
|
||
IpxBroadcastOperation(
|
||
IN PVOID Parameter
|
||
);
|
||
|
||
BOOLEAN
|
||
IpxIsAddressLocal(
|
||
IN TDI_ADDRESS_IPX UNALIGNED * SourceAddress
|
||
);
|
||
|
||
VOID
|
||
IpxCloseNdis(
|
||
IN PADAPTER Adapter
|
||
);
|
||
|
||
VOID
|
||
IpxOpenAdapterComplete(
|
||
IN NDIS_HANDLE BindingContext,
|
||
IN NDIS_STATUS NdisStatus,
|
||
IN NDIS_STATUS OpenErrorStatus
|
||
);
|
||
|
||
VOID
|
||
IpxCloseAdapterComplete(
|
||
IN NDIS_HANDLE BindingContext,
|
||
IN NDIS_STATUS NdisStatus
|
||
);
|
||
|
||
VOID
|
||
IpxResetComplete(
|
||
IN NDIS_HANDLE BindingContext,
|
||
IN NDIS_STATUS NdisStatus
|
||
);
|
||
|
||
VOID
|
||
IpxRequestComplete(
|
||
IN NDIS_HANDLE BindingContext,
|
||
IN PNDIS_REQUEST NdisRequest,
|
||
IN NDIS_STATUS NdisStatus
|
||
);
|
||
|
||
VOID
|
||
IpxStatus(
|
||
IN NDIS_HANDLE NdisBindingContext,
|
||
IN NDIS_STATUS NdisStatus,
|
||
IN PVOID StatusBuffer,
|
||
IN UINT StatusBufferSize
|
||
);
|
||
|
||
VOID
|
||
IpxStatusComplete(
|
||
IN NDIS_HANDLE NdisBindingContext
|
||
);
|
||
|
||
|
||
VOID
|
||
IpxBindAdapter(
|
||
OUT PNDIS_STATUS Status,
|
||
IN NDIS_HANDLE BindContext,
|
||
IN PNDIS_STRING DeviceName,
|
||
IN PVOID SystemSpecific1,
|
||
IN PVOID SystemSpecific2
|
||
);
|
||
|
||
VOID
|
||
IpxNdisUnload(
|
||
VOID
|
||
);
|
||
//
|
||
// Internal to IPX.
|
||
// Create a loopback binding (adapter) in DriverEntry.
|
||
// It will stick around for ever.
|
||
//
|
||
|
||
NTSTATUS
|
||
IpxBindLoopbackAdapter(
|
||
);
|
||
|
||
VOID
|
||
IpxUnbindAdapter(
|
||
OUT PNDIS_STATUS Status,
|
||
IN NDIS_HANDLE ProtocolBindingContext,
|
||
IN NDIS_HANDLE UnbindContext
|
||
);
|
||
|
||
/*
|
||
VOID
|
||
IpxTranslate(
|
||
OUT PNDIS_STATUS Status,
|
||
IN NDIS_HANDLE ProtocolBindingContext,
|
||
OUT PNET_PNP_ID IdList,
|
||
IN ULONG IdListLength,
|
||
OUT PULONG BytesReturned
|
||
);
|
||
*/
|
||
|
||
NDIS_STATUS
|
||
IpxPnPEventHandler(
|
||
IN NDIS_HANDLE ProtocolBindingContext,
|
||
IN PNET_PNP_EVENT NetPnPEvent
|
||
);
|
||
|
||
//
|
||
// Routines in mac.c
|
||
//
|
||
|
||
VOID
|
||
MacInitializeBindingInfo(
|
||
IN struct _BINDING * Binding,
|
||
IN struct _ADAPTER * Adapter
|
||
);
|
||
|
||
VOID
|
||
MacInitializeMacInfo(
|
||
IN NDIS_MEDIUM MacType,
|
||
OUT PNDIS_INFORMATION MacInfo
|
||
);
|
||
|
||
VOID
|
||
MacMapFrameType(
|
||
IN NDIS_MEDIUM MacType,
|
||
IN ULONG FrameType,
|
||
OUT ULONG * MappedFrameType
|
||
);
|
||
|
||
VOID
|
||
MacReturnMaxDataSize(
|
||
IN PNDIS_INFORMATION MacInfo,
|
||
IN PUCHAR SourceRouting,
|
||
IN UINT SourceRoutingLength,
|
||
IN UINT DeviceMaxFrameSize,
|
||
OUT PUINT MaxFrameSize
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFramePreFwd(
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrame(
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrame802_3802_3(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrame802_3802_2(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrame802_3EthernetII(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrame802_3Snap(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrame802_5802_2(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrame802_5Snap(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrameFddi802_3(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrameFddi802_2(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrameFddiSnap(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrameArcnet878_2(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSendFrameWanEthernetII(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN ULONG IncludedHeaderLength
|
||
);
|
||
|
||
VOID
|
||
MacUpdateSourceRouting(
|
||
IN ULONG Database,
|
||
IN PADAPTER Adapter,
|
||
IN PUCHAR MacHeader,
|
||
IN ULONG MacHeaderLength
|
||
);
|
||
|
||
VOID
|
||
MacLookupSourceRouting(
|
||
IN ULONG Database,
|
||
IN PBINDING Binding,
|
||
IN UCHAR NextRouter[6],
|
||
IN OUT UCHAR SourceRouting[18],
|
||
OUT PULONG SourceRoutingLength
|
||
);
|
||
|
||
VOID
|
||
MacSourceRoutingTimeout(
|
||
CTEEvent * Event,
|
||
PVOID Context
|
||
);
|
||
|
||
VOID
|
||
MacSourceRoutingRemove(
|
||
IN PBINDING Binding,
|
||
IN UCHAR MacAddress[6]
|
||
);
|
||
|
||
VOID
|
||
MacSourceRoutingClear(
|
||
IN PBINDING Binding
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in packet.c
|
||
//
|
||
|
||
NTSTATUS
|
||
IpxInitializeSendPacket(
|
||
IN PDEVICE Device,
|
||
IN PIPX_SEND_PACKET Packet,
|
||
IN PUCHAR Header
|
||
);
|
||
|
||
#if BACK_FILL
|
||
NTSTATUS
|
||
IpxInitializeBackFillPacket(
|
||
IN PDEVICE Device,
|
||
IN PIPX_SEND_PACKET Packet,
|
||
IN PUCHAR Header
|
||
);
|
||
#endif
|
||
|
||
NTSTATUS
|
||
IpxInitializeReceivePacket(
|
||
IN PDEVICE Device,
|
||
IN PIPX_RECEIVE_PACKET Packet
|
||
);
|
||
|
||
NTSTATUS
|
||
NbiInitializeReceiveBuffer(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_RECEIVE_BUFFER ReceiveBuffer,
|
||
IN PUCHAR DataBuffer,
|
||
IN ULONG DataBufferLength
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxInitializePaddingBuffer(
|
||
IN PDEVICE Device,
|
||
IN PIPX_PADDING_BUFFER PaddingBuffer,
|
||
IN ULONG DataBufferLength
|
||
);
|
||
|
||
VOID
|
||
IpxDeinitializeSendPacket(
|
||
IN PDEVICE Device,
|
||
IN PIPX_SEND_PACKET Packet
|
||
);
|
||
|
||
#if BACK_FILL
|
||
VOID
|
||
IpxDeinitializeBackFillPacket(
|
||
IN PDEVICE Device,
|
||
IN PIPX_SEND_PACKET Packet
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
IpxDeinitializeReceivePacket(
|
||
IN PDEVICE Device,
|
||
IN PIPX_RECEIVE_PACKET Packet
|
||
);
|
||
|
||
VOID
|
||
IpxDeinitializeReceiveBuffer(
|
||
IN PADAPTER Adapter,
|
||
IN PIPX_RECEIVE_BUFFER ReceiveBuffer,
|
||
IN ULONG DataBufferLength
|
||
);
|
||
|
||
VOID
|
||
IpxDeinitializePaddingBuffer(
|
||
IN PDEVICE Device,
|
||
IN PIPX_PADDING_BUFFER PaddingBuffer,
|
||
IN ULONG DataBufferLength
|
||
);
|
||
|
||
VOID
|
||
IpxAllocateSendPool(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
#if BACK_FILL
|
||
VOID
|
||
IpxAllocateBackFillPool(
|
||
IN PDEVICE Device
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
IpxAllocateReceivePool(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
VOID
|
||
IpxAllocateReceiveBufferPool(
|
||
IN PADAPTER Adapter
|
||
);
|
||
|
||
PSINGLE_LIST_ENTRY
|
||
IpxPopSendPacket(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
#if BACK_FILL
|
||
PSINGLE_LIST_ENTRY
|
||
IpxPopBackFillPacket(
|
||
IN PDEVICE Device
|
||
);
|
||
#endif
|
||
|
||
PSINGLE_LIST_ENTRY
|
||
IpxPopReceivePacket(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
PSINGLE_LIST_ENTRY
|
||
IpxPopReceiveBuffer(
|
||
IN PADAPTER Adapter
|
||
);
|
||
|
||
PIPX_PADDING_BUFFER
|
||
IpxAllocatePaddingBuffer(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
VOID
|
||
IpxFreePaddingBuffer(
|
||
IN PDEVICE Device
|
||
);
|
||
|
||
|
||
|
||
//
|
||
// Routines in query.c
|
||
//
|
||
|
||
NTSTATUS
|
||
IpxTdiQueryInformation(
|
||
IN PDEVICE Device,
|
||
IN PREQUEST Request
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxTdiSetInformation(
|
||
IN PDEVICE Device,
|
||
IN PREQUEST Request
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in receive.c
|
||
//
|
||
|
||
VOID
|
||
IpxTransferDataComplete(
|
||
IN NDIS_HANDLE BindingContext,
|
||
IN PNDIS_PACKET NdisPacket,
|
||
IN NDIS_STATUS NdisStatus,
|
||
IN UINT BytesTransferred
|
||
);
|
||
|
||
|
||
VOID
|
||
IpxTransferData(
|
||
OUT PNDIS_STATUS Status,
|
||
IN NDIS_HANDLE NdisBindingHandle,
|
||
IN NDIS_HANDLE MacReceiveContext,
|
||
IN UINT ByteOffset,
|
||
IN UINT BytesToTransfer,
|
||
IN OUT PNDIS_PACKET Packet,
|
||
OUT PUINT BytesTransferred
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxTdiReceiveDatagram(
|
||
IN PREQUEST Request
|
||
);
|
||
|
||
VOID
|
||
IpxCancelReceiveDatagram(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in rip.c
|
||
//
|
||
|
||
NTSTATUS
|
||
RipGetLocalTarget(
|
||
IN ULONG Segment,
|
||
IN TDI_ADDRESS_IPX UNALIGNED * RemoteAddress,
|
||
IN UCHAR Type,
|
||
OUT PIPX_LOCAL_TARGET LocalTarget,
|
||
OUT USHORT Counts[2] OPTIONAL
|
||
);
|
||
|
||
NTSTATUS
|
||
RipQueueRequest(
|
||
IN ULONG Network,
|
||
IN USHORT Operation
|
||
);
|
||
|
||
VOID
|
||
RipSendResponse(
|
||
IN PBINDING Binding,
|
||
IN TDI_ADDRESS_IPX UNALIGNED * RemoteAddress,
|
||
IN PIPX_LOCAL_TARGET LocalTarget
|
||
);
|
||
|
||
VOID
|
||
RipShortTimeout(
|
||
CTEEvent * Event,
|
||
PVOID Context
|
||
);
|
||
|
||
VOID
|
||
RipLongTimeout(
|
||
CTEEvent * Event,
|
||
PVOID Context
|
||
);
|
||
|
||
VOID
|
||
RipCleanupPacket(
|
||
IN PDEVICE Device,
|
||
IN PIPX_SEND_RESERVED RipReserved
|
||
);
|
||
|
||
VOID
|
||
RipProcessResponse(
|
||
IN PDEVICE Device,
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN RIP_PACKET UNALIGNED * RipPacket
|
||
);
|
||
|
||
VOID
|
||
RipHandleRoutePending(
|
||
IN PDEVICE Device,
|
||
IN UCHAR Network[4],
|
||
IN CTELockHandle LockHandle,
|
||
IN BOOLEAN Success,
|
||
IN OPTIONAL PIPX_LOCAL_TARGET LocalTarget,
|
||
IN OPTIONAL USHORT HopCount,
|
||
IN OPTIONAL USHORT TickCount
|
||
);
|
||
|
||
NTSTATUS
|
||
RipInsertLocalNetwork(
|
||
IN ULONG Network,
|
||
IN USHORT NicId,
|
||
IN NDIS_HANDLE NdisBindingContext,
|
||
IN USHORT Count
|
||
);
|
||
|
||
VOID
|
||
RipAdjustForBindingChange(
|
||
IN USHORT NicId,
|
||
IN USHORT NewNicId,
|
||
IN IPX_BINDING_CHANGE_TYPE ChangeType
|
||
);
|
||
|
||
UINT
|
||
RipGetSegment(
|
||
IN UCHAR Network[4]
|
||
);
|
||
|
||
PIPX_ROUTE_ENTRY
|
||
RipGetRoute(
|
||
IN UINT Segment,
|
||
IN UCHAR Network[4]
|
||
);
|
||
|
||
BOOLEAN
|
||
RipAddRoute(
|
||
IN UINT Segment,
|
||
IN PIPX_ROUTE_ENTRY RouteEntry
|
||
);
|
||
|
||
BOOLEAN
|
||
RipDeleteRoute(
|
||
IN UINT Segment,
|
||
IN PIPX_ROUTE_ENTRY RouteEntry
|
||
);
|
||
|
||
PIPX_ROUTE_ENTRY
|
||
RipGetFirstRoute(
|
||
IN UINT Segment
|
||
);
|
||
|
||
PIPX_ROUTE_ENTRY
|
||
RipGetNextRoute(
|
||
IN UINT Segment
|
||
);
|
||
|
||
VOID
|
||
RipDropRemoteEntries(
|
||
VOID
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in send.c
|
||
//
|
||
|
||
VOID
|
||
IpxSendComplete(
|
||
IN NDIS_HANDLE ProtocolBindingContext,
|
||
IN PNDIS_PACKET NdisPacket,
|
||
IN NDIS_STATUS NdisStatus
|
||
);
|
||
|
||
NTSTATUS
|
||
IpxTdiSendDatagram(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PREQUEST Request
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in rt.c
|
||
//
|
||
|
||
|
||
NTSTATUS
|
||
GetNewNics(
|
||
PDEVICE,
|
||
PREQUEST,
|
||
BOOLEAN,
|
||
PNWLINK_ACTION,
|
||
UINT,
|
||
BOOLEAN OldIrp
|
||
);
|
||
|
||
NTSTATUS
|
||
OpenRtAddress(
|
||
IN PDEVICE Device,
|
||
IN PIRP Request
|
||
);
|
||
|
||
NTSTATUS
|
||
CloseRtAddress(
|
||
IN PDEVICE pDevice,
|
||
IN PIRP pIrp
|
||
);
|
||
|
||
NTSTATUS
|
||
CleanupRtAddress(
|
||
IN PDEVICE pDevice,
|
||
IN PIRP pIrp
|
||
);
|
||
|
||
NTSTATUS
|
||
SendIrpFromRt (
|
||
IN PDEVICE pDevice,
|
||
IN PIRP pIrp
|
||
);
|
||
|
||
NTSTATUS
|
||
RcvIrpFromRt (
|
||
IN PDEVICE pDevice,
|
||
IN PIRP pIrp
|
||
);
|
||
NTSTATUS
|
||
PassDgToRt (
|
||
IN PDEVICE pDevice,
|
||
IN PIPX_DATAGRAM_OPTIONS2 pContext,
|
||
IN ULONG Index,
|
||
IN VOID UNALIGNED *pDgrm,
|
||
IN ULONG uNumBytes
|
||
);
|
||
|
||
NTSTATUS
|
||
NTCheckSetCancelRoutine(
|
||
IN PIRP pIrp,
|
||
IN PVOID CancelRoutine,
|
||
IN PDEVICE pDevice
|
||
);
|
||
|
||
|
||
VOID
|
||
NTIoComplete(
|
||
IN PIRP pIrp,
|
||
IN NTSTATUS Status,
|
||
IN ULONG SentLength);
|
||
|
||
VOID
|
||
IpxRefRt(
|
||
PRT_INFO pRt);
|
||
|
||
VOID
|
||
IpxDerefRt(
|
||
PRT_INFO pRt);
|
||
|
||
VOID
|
||
IpxDestroyRt(
|
||
PRT_INFO pRt);
|
||
|
||
#if DBG
|
||
VOID
|
||
IpxConstructHeader(
|
||
IN PUCHAR Header,
|
||
IN USHORT PacketLength,
|
||
IN UCHAR PacketType,
|
||
IN TDI_ADDRESS_IPX UNALIGNED * RemoteAddress,
|
||
IN PTDI_ADDRESS_IPX LocalAddress
|
||
);
|
||
#else
|
||
#define IpxConstructHeader(_Header,_PacketLength,_PacketType,_RemoteAddress,_LocalAddress) { \
|
||
PIPX_HEADER _IpxHeader = (PIPX_HEADER)(_Header); \
|
||
_IpxHeader->CheckSum = 0xffff; \
|
||
_IpxHeader->PacketLength[0] = (UCHAR)((_PacketLength) / 256); \
|
||
_IpxHeader->PacketLength[1] = (UCHAR)((_PacketLength) % 256); \
|
||
_IpxHeader->TransportControl = 0; \
|
||
_IpxHeader->PacketType = (_PacketType); \
|
||
RtlCopyMemory(_IpxHeader->DestinationNetwork, (PVOID)(_RemoteAddress), 12); \
|
||
RtlCopyMemory(_IpxHeader->SourceNetwork, (_LocalAddress), 12); \
|
||
}
|
||
#endif
|
||
|
||
//
|
||
// Routines in loopback.c
|
||
//
|
||
|
||
VOID
|
||
IpxDoLoopback(
|
||
IN CTEEvent *Event,
|
||
IN PVOID Context
|
||
);
|
||
|
||
VOID
|
||
IpxInitLoopback();
|
||
|
||
VOID
|
||
IpxLoopbackEnque(
|
||
IN PNDIS_PACKET Packet,
|
||
IN PVOID Context
|
||
);
|
||
|
||
|
||
//
|
||
// [FW] InternalSendCompletion from Forwarder
|
||
//
|
||
|
||
// [FW] Added length here
|
||
VOID
|
||
IpxInternalSendComplete(
|
||
IN PIPX_LOCAL_TARGET LocalTarget,
|
||
IN PNDIS_PACKET Packet,
|
||
IN ULONG PacketLength,
|
||
IN NTSTATUS Status
|
||
);
|
||
|
||
NDIS_STATUS
|
||
IpxSubmitNdisRequest(
|
||
IN PADAPTER Adapter,
|
||
IN PNDIS_REQUEST NdisRequest,
|
||
IN PNDIS_STRING AdapterString
|
||
);
|
||
|
||
VOID
|
||
IpxDelayedSubmitNdisRequest(
|
||
IN PVOID Param
|
||
);
|
||
|
||
UINT
|
||
IpxGetChainedMDLLength(
|
||
PNDIS_BUFFER pMDL
|
||
);
|
||
|
||
BOOLEAN
|
||
IpxHasInformedNbLoopback();
|
||
|
||
VOID
|
||
IpxInformNbLoopback();
|