You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1778 lines
34 KiB
1778 lines
34 KiB
/*++
|
|
|
|
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
|
|
);
|
|
|
|
PSLIST_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
|
|
);
|
|
|
|
PSLIST_ENTRY
|
|
IpxPopSendPacket(
|
|
IN PDEVICE Device
|
|
);
|
|
|
|
#if BACK_FILL
|
|
PSLIST_ENTRY
|
|
IpxPopBackFillPacket(
|
|
IN PDEVICE Device
|
|
);
|
|
#endif
|
|
|
|
PSLIST_ENTRY
|
|
IpxPopReceivePacket(
|
|
IN PDEVICE Device
|
|
);
|
|
|
|
PSLIST_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();
|