/*++ 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();