/*++ Copyright (c) 1989, 1990, 1991 Microsoft Corporation Module Name: nbfprocs.h Abstract: This header file defines private functions for the NT NBF transport provider. Author: David Beaver (dbeaver) 1-July-1991 Revision History: --*/ #ifndef _NBFPROCS_ #define _NBFPROCS_ // // MACROS. // // // Debugging aids // // // VOID // IF_NBFDBG( // IN PSZ Message // ); // #if DBG #define IF_NBFDBG(flags) \ if (NbfDebug & (flags)) #else #define IF_NBFDBG(flags) \ if (0) #endif // // VOID // PANIC( // IN PSZ Message // ); // #if DBG #define PANIC(Msg) \ DbgPrint ((Msg)) #else #define PANIC(Msg) #endif // // These are define to allow DbgPrints that disappear when // DBG is 0. // #if DBG #define NbfPrint0(fmt) DbgPrint(fmt) #define NbfPrint1(fmt,v0) DbgPrint(fmt,v0) #define NbfPrint2(fmt,v0,v1) DbgPrint(fmt,v0,v1) #define NbfPrint3(fmt,v0,v1,v2) DbgPrint(fmt,v0,v1,v2) #define NbfPrint4(fmt,v0,v1,v2,v3) DbgPrint(fmt,v0,v1,v2,v3) #define NbfPrint5(fmt,v0,v1,v2,v3,v4) DbgPrint(fmt,v0,v1,v2,v3,v4) #define NbfPrint6(fmt,v0,v1,v2,v3,v4,v5) DbgPrint(fmt,v0,v1,v2,v3,v4,v5) #else #define NbfPrint0(fmt) #define NbfPrint1(fmt,v0) #define NbfPrint2(fmt,v0,v1) #define NbfPrint3(fmt,v0,v1,v2) #define NbfPrint4(fmt,v0,v1,v2,v3) #define NbfPrint5(fmt,v0,v1,v2,v3,v4) #define NbfPrint6(fmt,v0,v1,v2,v3,v4,v5) #endif // // The REFCOUNTS message take up a lot of room, so make // removing them easy. // #if 1 #define IF_REFDBG IF_NBFDBG (NBF_DEBUG_REFCOUNTS) #else #define IF_REFDBG if (0) #endif #if DBG #define NbfReferenceLink( Reason, Link, Type)\ if ((Link)->Destroyed) { \ DbgPrint("NBF: Attempt to reference destroyed link %lx\n", Link); \ DbgBreakPoint(); \ } \ IF_REFDBG { \ DbgPrint ("RefL %x: %s %s, %ld : %ld\n", Link, Reason, __FILE__, __LINE__, (Link)->ReferenceCount);\ }\ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(Link)->RefTypes[Type]), \ 1, \ &NbfGlobalInterlock); \ NbfRefLink (Link) #define NbfDereferenceLink(Reason, Link, Type)\ if ((Link)->Destroyed) { \ DbgPrint("NBF: Attempt to dereference destroyed link %lx\n", Link); \ DbgBreakPoint(); \ } \ IF_REFDBG { \ DbgPrint ("DeRefL %x: %s %s, %ld : %ld\n", Link, Reason, __FILE__, __LINE__, (Link)->ReferenceCount);\ } \ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(Link)->RefTypes[Type]), \ (ULONG)-1, \ &NbfGlobalInterlock); \ NbfDerefLink (Link) #define NbfDereferenceLinkMacro(Reason, Link, Type)\ NbfDereferenceLink(Reason, Link, Type) #define NbfReferenceLinkSpecial( Reason, Link, Type)\ if ((Link)->Destroyed) { \ DbgPrint("NBF: Attempt to special reference destroyed link %lx\n", Link); \ DbgBreakPoint(); \ } \ IF_REFDBG { \ DbgPrint ("RefLS %x: %s %s, %ld : %ld\n", Link, Reason, __FILE__, __LINE__, (Link)->SpecialRefCount);\ }\ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(Link)->RefTypes[Type]), \ 1, \ &NbfGlobalInterlock); \ NbfRefLinkSpecial (Link) #define NbfDereferenceLinkSpecial(Reason, Link, Type)\ if ((Link)->Destroyed) { \ DbgPrint("NBF: Attempt to special dereference destroyed link %lx\n", Link); \ DbgBreakPoint(); \ } \ IF_REFDBG { \ DbgPrint ("DeRefLS %x: %s %s, %ld : %ld\n", Link, Reason, __FILE__, __LINE__, (Link)->SpecialRefCount);\ } \ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(Link)->RefTypes[Type]), \ (ULONG)-1, \ &NbfGlobalInterlock); \ NbfDerefLinkSpecial (Link) #define NbfReferenceConnection(Reason, Connection, Type)\ if ((Connection)->Destroyed) { \ DbgPrint("NBF: Attempt to reference destroyed conn %lx\n", Connection); \ DbgBreakPoint(); \ } \ IF_REFDBG { \ DbgPrint ("RefC %x: %s %s, %ld : %ld\n", Connection, Reason, __FILE__, __LINE__, (Connection)->ReferenceCount);\ } \ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(Connection)->RefTypes[Type]), \ 1, \ &NbfGlobalInterlock); \ NbfRefConnection (Connection) #define NbfDereferenceConnection(Reason, Connection, Type)\ if ((Connection)->Destroyed) { \ DbgPrint("NBF: Attempt to dereference destroyed conn %lx\n", Connection); \ DbgBreakPoint(); \ } \ IF_REFDBG { \ DbgPrint ("DeRefC %x: %s %s, %ld : %ld\n", Connection, Reason, __FILE__, __LINE__, (Connection)->ReferenceCount);\ } \ (VOID)ExInterlockedAddUlong ( \ (PULONG)&((Connection)->RefTypes[Type]), \ (ULONG)-1, \ &NbfGlobalInterlock); \ NbfDerefConnection (Connection) #define NbfDereferenceConnectionMacro(Reason, Connection, Type)\ NbfDereferenceConnection(Reason, Connection, Type) #define NbfDereferenceConnectionSpecial(Reason, Connection, Type)\ IF_REFDBG { \ DbgPrint ("DeRefCL %x: %s %s, %ld : %ld\n", Connection, Reason, __FILE__, __LINE__, (Connection)->ReferenceCount);\ } \ (VOID)ExInterlockedAddUlong ( \ (PULONG)&((Connection)->RefTypes[Type]), \ (ULONG)-1, \ &NbfGlobalInterlock); \ NbfDerefConnectionSpecial (Connection) #define NbfReferenceRequest( Reason, Request, Type)\ if ((Request)->Destroyed) { \ DbgPrint("NBF: Attempt to reference destroyed req %lx\n", Request); \ DbgBreakPoint(); \ } \ IF_REFDBG { \ DbgPrint ("RefR %x: %s %s, %ld : %ld\n", Request, Reason, __FILE__, __LINE__, (Request)->ReferenceCount);}\ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(Request)->RefTypes[Type]), \ 1, \ &NbfGlobalInterlock); \ NbfRefRequest (Request) #define NbfDereferenceRequest(Reason, Request, Type)\ if ((Request)->Destroyed) { \ DbgPrint("NBF: Attempt to dereference destroyed req %lx\n", Request); \ DbgBreakPoint(); \ } \ IF_REFDBG { \ DbgPrint ("DeRefR %x: %s %s, %ld : %ld\n", Request, Reason, __FILE__, __LINE__, (Request)->ReferenceCount);\ } \ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(Request)->RefTypes[Type]), \ (ULONG)-1, \ &NbfGlobalInterlock); \ NbfDerefRequest (Request) #define NbfReferenceSendIrp( Reason, IrpSp, Type)\ IF_REFDBG { \ DbgPrint ("RefSI %x: %s %s, %ld : %ld\n", IrpSp, Reason, __FILE__, __LINE__, IRP_SEND_REFCOUNT(IrpSp));}\ NbfRefSendIrp (IrpSp) #define NbfDereferenceSendIrp(Reason, IrpSp, Type)\ IF_REFDBG { \ DbgPrint ("DeRefSI %x: %s %s, %ld : %ld\n", IrpSp, Reason, __FILE__, __LINE__, IRP_SEND_REFCOUNT(IrpSp));\ } \ NbfDerefSendIrp (IrpSp) #define NbfReferenceReceiveIrpLocked( Reason, IrpSp, Type)\ IF_REFDBG { \ DbgPrint ("RefRI %x: %s %s, %ld : %ld\n", IrpSp, Reason, __FILE__, __LINE__, IRP_RECEIVE_REFCOUNT(IrpSp));}\ NbfRefReceiveIrpLocked (IrpSp) #define NbfDereferenceReceiveIrp(Reason, IrpSp, Type)\ IF_REFDBG { \ DbgPrint ("DeRefRI %x: %s %s, %ld : %ld\n", IrpSp, Reason, __FILE__, __LINE__, IRP_RECEIVE_REFCOUNT(IrpSp));\ } \ NbfDerefReceiveIrp (IrpSp) #define NbfDereferenceReceiveIrpLocked(Reason, IrpSp, Type)\ IF_REFDBG { \ DbgPrint ("DeRefRILocked %x: %s %s, %ld : %ld\n", IrpSp, Reason, __FILE__, __LINE__, IRP_RECEIVE_REFCOUNT(IrpSp));\ } \ NbfDerefReceiveIrpLocked (IrpSp) #define NbfReferenceAddress( Reason, Address, Type)\ IF_REFDBG { \ DbgPrint ("RefA %x: %s %s, %ld : %ld\n", Address, Reason, __FILE__, __LINE__, (Address)->ReferenceCount);}\ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(Address)->RefTypes[Type]), \ 1, \ &NbfGlobalInterlock); \ NbfRefAddress (Address) #define NbfDereferenceAddress(Reason, Address, Type)\ IF_REFDBG { \ DbgPrint ("DeRefA %x: %s %s, %ld : %ld\n", Address, Reason, __FILE__, __LINE__, (Address)->ReferenceCount);\ } \ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(Address)->RefTypes[Type]), \ (ULONG)-1, \ &NbfGlobalInterlock); \ NbfDerefAddress (Address) #define NbfReferenceDeviceContext( Reason, DeviceContext, Type)\ if ((DeviceContext)->ReferenceCount == 0) \ DbgBreakPoint(); \ IF_REFDBG { \ DbgPrint ("RefDC %x: %s %s, %ld : %ld\n", DeviceContext, Reason, __FILE__, __LINE__, (DeviceContext)->ReferenceCount);}\ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(DeviceContext)->RefTypes[Type]), \ 1, \ &NbfGlobalInterlock); \ NbfRefDeviceContext (DeviceContext) #define NbfDereferenceDeviceContext(Reason, DeviceContext, Type)\ if ((DeviceContext)->ReferenceCount == 0) \ DbgBreakPoint(); \ IF_REFDBG { \ DbgPrint ("DeRefDC %x: %s %s, %ld : %ld\n", DeviceContext, Reason, __FILE__, __LINE__, (DeviceContext)->ReferenceCount);\ } \ (VOID)ExInterlockedAddUlong ( \ (PULONG)(&(DeviceContext)->RefTypes[Type]), \ (ULONG)-1, \ &NbfGlobalInterlock); \ NbfDerefDeviceContext (DeviceContext) #else #if defined(NBF_UP) #define NbfReferenceLink(Reason, Link, Type) \ { \ ULONG _ref; \ _ref = ++(Link)->ReferenceCount; \ if ( _ref == 0 ) { \ NbfReferenceLinkSpecial ("first ref", (Link), LREF_SPECIAL_TEMP); \ } \ } #else #define NbfReferenceLink(Reason, Link, Type) \ if (InterlockedIncrement( \ &(Link)->ReferenceCount) == 0) { \ NbfReferenceLinkSpecial ("first ref", (Link), LREF_SPECIAL_TEMP); \ } #endif #define NbfDereferenceLink(Reason, Link, Type)\ NbfDereferenceLinkMacro(Reason,Link,Type) #if defined(NBF_UP) #define NbfDereferenceLinkMacro(Reason, Link, Type){ \ ULONG _ref; \ _ref = --(Link)->ReferenceCount; \ if (_ref < 0) { \ NbfDisconnectLink (Link); \ NbfDerefLinkSpecial (Link); \ } \ } #else #define NbfDereferenceLinkMacro(Reason, Link, Type){ \ if (InterlockedDecrement( \ &(Link)->ReferenceCount) < 0) { \ NbfDisconnectLink (Link); \ NbfDerefLinkSpecial (Link); \ } \ } #endif #define NbfReferenceLinkSpecial(Reason, Link, Type)\ NbfRefLinkSpecial (Link) #define NbfDereferenceLinkSpecial(Reason, Link, Type)\ NbfDerefLinkSpecial (Link) #define NbfReferenceConnection(Reason, Connection, Type)\ if (((Connection)->ReferenceCount == -1) && \ ((Connection)->SpecialRefCount == 0)) \ DbgBreakPoint(); \ \ if (InterlockedIncrement( \ &(Connection)->ReferenceCount) == 0) { \ ExInterlockedAddUlong( \ (PULONG)(&(Connection)->SpecialRefCount), \ 1, \ (Connection)->ProviderInterlock); \ } #define NbfDereferenceConnection(Reason, Connection, Type)\ if (((Connection)->ReferenceCount == -1) && \ ((Connection)->SpecialRefCount == 0)) \ DbgBreakPoint(); \ \ NbfDerefConnection (Connection) #define NbfDereferenceConnectionMacro(Reason, Connection, Type){ \ if (((Connection)->ReferenceCount == -1) && \ ((Connection)->SpecialRefCount == 0)) \ DbgBreakPoint(); \ \ \ if (InterlockedDecrement( \ &(Connection)->ReferenceCount) < 0) { \ if (NbfDisconnectFromLink (Connection, TRUE)) { \ NbfIndicateDisconnect (Connection); \ } \ NbfDerefConnectionSpecial (Connection); \ } \ } #define NbfDereferenceConnectionSpecial(Reason, Connection, Type)\ NbfDerefConnectionSpecial (Connection) #define NbfReferenceRequest(Reason, Request, Type)\ (VOID)InterlockedIncrement( \ &(Request)->ReferenceCount) #define NbfDereferenceRequest(Reason, Request, Type)\ NbfDerefRequest (Request) #define NbfReferenceSendIrp(Reason, IrpSp, Type)\ (VOID)InterlockedIncrement( \ &IRP_SEND_REFCOUNT(IrpSp)) #define NbfDereferenceSendIrp(Reason, IrpSp, Type) {\ PIO_STACK_LOCATION _IrpSp = (IrpSp); \ if (InterlockedDecrement( \ &IRP_SEND_REFCOUNT(_IrpSp)) == 0) { \ PIRP _Irp = IRP_SEND_IRP(_IrpSp); \ IRP_SEND_REFCOUNT(_IrpSp) = 0; \ IRP_SEND_IRP (_IrpSp) = NULL; \ IoCompleteRequest (_Irp, IO_NETWORK_INCREMENT); \ } \ } #define NbfReferenceReceiveIrpLocked(Reason, IrpSp, Type)\ ++IRP_RECEIVE_REFCOUNT(IrpSp) #define NbfDereferenceReceiveIrp(Reason, IrpSp, Type)\ NbfDerefReceiveIrp (IrpSp) #define NbfDereferenceReceiveIrpLocked(Reason, IrpSp, Type) { \ if (--IRP_RECEIVE_REFCOUNT(IrpSp) == 0) { \ ExInterlockedInsertTailList( \ &(IRP_DEVICE_CONTEXT(IrpSp)->IrpCompletionQueue), \ &(IRP_RECEIVE_IRP(IrpSp))->Tail.Overlay.ListEntry, \ &(IRP_DEVICE_CONTEXT(IrpSp)->Interlock)); \ } \ } #define NbfReferenceAddress(Reason, Address, Type)\ if ((Address)->ReferenceCount <= 0){ DbgBreakPoint(); }\ (VOID)InterlockedIncrement(&(Address)->ReferenceCount) #define NbfDereferenceAddress(Reason, Address, Type)\ if ((Address)->ReferenceCount <= 0){ DbgBreakPoint(); }\ NbfDerefAddress (Address) #define NbfReferenceDeviceContext(Reason, DeviceContext, Type)\ if ((DeviceContext)->ReferenceCount == 0) \ DbgBreakPoint(); \ NbfRefDeviceContext (DeviceContext) #define NbfDereferenceDeviceContext(Reason, DeviceContext, Type)\ if ((DeviceContext)->ReferenceCount == 0) \ DbgBreakPoint(); \ NbfDerefDeviceContext (DeviceContext) #define NbfReferencePacket(Packet) \ (VOID)InterlockedIncrement(&(Packet)->ReferenceCount) #define NbfDereferencePacket(Packet){ \ if (InterlockedDecrement ( \ &(Packet)->ReferenceCount) == 0) { \ NbfDestroyPacket (Packet); \ } \ } #endif // // Error and statistics Macros // // VOID // LogErrorToSystem( // NTSTATUS ErrorType, // PUCHAR ErrorDescription // ) /*++ Routine Description: This routine is called to log an error from the transport to the system. Errors that are of system interest should be logged using this interface. For now, this macro is defined trivially. Arguments: ErrorType - The error type, a conventional NT status ErrorDescription - A pointer to a string describing the error. Return Value: none. --*/ #if DBG #define LogErrorToSystem( ErrorType, ErrorDescription) \ DbgPrint ("Logging error: File: %s Line: %ld \n Description: %s\n",__FILE__, __LINE__, ErrorDescription) #else #define LogErrorToSystem( ErrorType, ErrorDescription) #endif // // Routines in TIMER.C (lightweight timer system package). // Note that all the start and stop routines for the timers assume that you // have the link spinlock when you call them! // Note also that, with the latest revisions, the timer system now works by // putting those links that have timers running on a list of links to be looked // at for each clock tick. This list is ordered, with the most recently inserted // elements at the tail of the list. Note further that anything already on the // is moved to the end of the list if the timer is restarted; thus, the list // order is preserved. // VOID NbfStartShortTimer( IN PDEVICE_CONTEXT DeviceContext ); VOID NbfInitializeTimerSystem( IN PDEVICE_CONTEXT DeviceContext ); VOID NbfStopTimerSystem( IN PDEVICE_CONTEXT DeviceContext ); VOID StartT1( IN PTP_LINK Link, IN ULONG PacketSize ); VOID StartT2( IN PTP_LINK Link ); VOID StartTi( IN PTP_LINK Link ); #if DBG VOID StopT1( IN PTP_LINK Link ); VOID StopT2( IN PTP_LINK Link ); VOID StopTi( IN PTP_LINK Link ); #else #define StopT1(_Link) \ { \ (_Link)->CurrentPollOutstanding = FALSE; \ (_Link)->T1 = 0; \ } #define StopT2(_Link) \ { \ (_Link)->ConsecutiveIFrames = 0; \ (_Link)->T2 = 0; \ } #define StopTi(_Link) \ (_Link)->Ti = 0; #endif // // These functions may become macros once they are finished. // ULONG GetTimerInterval( IN PTP_LINK Link ); VOID BackoffCurrentT1Timeout( IN PTP_LINK Link ); VOID UpdateBaseT1Timeout( IN PTP_LINK Link ); VOID CancelT1Timeout( IN PTP_LINK Link ); VOID UpdateDelayAndThroughput( IN PTP_LINK Link, IN ULONG TimerInterval ); VOID FakeStartT1( IN PTP_LINK Link, IN ULONG PacketSize ); VOID FakeUpdateBaseT1Timeout( IN PTP_LINK Link ); // // Timer Macros - these are make sure that no timers are // executing after we finish call to NbfStopTimerSystem // // State Descriptions - // // If TimerState is // < TIMERS_ENABLED - Multiple ENABLE_TIMERS happened, // Will be corrected in an instant // // = TIMERS_ENABLED - ENABLE_TIMERS done but no timers // that have gone through START_TIMER // but not yet executed a LEAVE_TIMER // // > TIMERS_ENABLED && // < TIMERS_DISABLED - ENABLE_TIMERS done and num timers = // (TimerInitialized - TIMERS_ENABLED) // that have gone through START_TIMER // but not yet executed a LEAVE_TIMER // // = TIMERS_DISABLED - DISABLE_TIMERS done and no timers // executing timer code at this pt // [This is also the initial state] // // > TIMERS_DISABLED && // < TIMERS_DISABLED + TIMERS_RANGE // - DISABLE_TIMERS done and num timers = // (TimerInitialized - TIMERS_ENABLED) // that have gone through START_TIMER // but not yet executed a LEAVE_TIMER // // >= TIMERS_DISABLED + TIMERS_RANGE // - Multiple DISABLE_TIMERS happened, // Will be corrected in an instant // // Allow basically TIMER_RANGE = 2^24 timers // (and 2^8 / 2 simultaneous stops or starts) // #if DBG_TIMER #define DbgTimer DbgPrint #else #define DbgTimer #endif #define TIMERS_ENABLED 0x08000000 #define TIMERS_DISABLED 0x09000000 #define TIMERS_RANGE_ADD 0x01000000 /* TIMERS_DISABLED - TIMERS_ENABLED */ #define TIMERS_RANGE_SUB 0xFF000000 /* TIMERS_ENABLED - TIMERS_DISABLED */ #define INITIALIZE_TIMER_STATE(DeviceContext) \ DbgTimer("*--------------- Timers State Initialized ---------*\n"); \ /* Initial state is set to timers disabled */ \ DeviceContext->TimerState = TIMERS_DISABLED; \ #define TIMERS_INITIALIZED(DeviceContext) \ (DeviceContext->TimerState == TIMERS_DISABLED) \ #define ENABLE_TIMERS(DeviceContext) \ { \ ULONG Count; \ \ DbgTimer("*--------------- Enabling Timers ------------------*\n"); \ Count= InterlockedExchangeAdd(&DeviceContext->TimerState, \ TIMERS_RANGE_SUB); \ DbgTimer("Count = %08x, TimerState = %08x\n", Count, \ DeviceContext->TimerState); \ if (Count < TIMERS_ENABLED) \ { \ DbgTimer("*--------------- Timers Already Enabled -----------*\n"); \ /* We have already enabled the timers */ \ InterlockedExchangeAdd(&DeviceContext->TimerState, \ TIMERS_RANGE_ADD); \ DbgTimer("Count = %08x, TimerState = %08x\n", Count, \ DeviceContext->TimerState); \ } \ DbgTimer("*--------------- Enabling Timers Done -------------*\n"); \ } \ #define DISABLE_TIMERS(DeviceContext) \ { \ ULONG Count; \ \ DbgTimer("*--------------- Disabling Timers -----------------*\n"); \ Count= InterlockedExchangeAdd(&DeviceContext->TimerState, \ TIMERS_RANGE_ADD); \ DbgTimer("Count = %08x, TimerState = %08x\n", Count, \ DeviceContext->TimerState); \ if (Count >= TIMERS_DISABLED) \ { \ DbgTimer("*--------------- Timers Already Disabled ----------*\n"); \ /* We have already disabled the timers */ \ InterlockedExchangeAdd(&DeviceContext->TimerState, \ TIMERS_RANGE_SUB); \ DbgTimer("Count = %08x, TimerState = %08x\n", Count, \ DeviceContext->TimerState); \ } \ \ /* Loop until we have zero timers active */ \ while (*((ULONG volatile *)&DeviceContext->TimerState)!=TIMERS_DISABLED)\ DbgTimer("Number of timers active = %08x\n", \ DeviceContext->TimerState \ - TIMERS_DISABLED); \ DbgTimer("*--------------- Disabling Timers Done ------------*\n"); \ } \ #define START_TIMER(DeviceContext, TimerId, Timer, DueTime, Dpc) \ /*DbgTimer("*---------- Entering Timer %d ---------*\n", TimerId);*/\ if (InterlockedIncrement(&DeviceContext->TimerState) < \ TIMERS_DISABLED) \ { \ KeSetTimer(Timer, DueTime, Dpc); \ } \ else \ { \ /* Timers disabled - get out and reset */ \ NbfDereferenceDeviceContext("Timers disabled", \ DeviceContext, \ DCREF_SCAN_TIMER); \ LEAVE_TIMER(DeviceContext, TimerId); \ } \ /*DbgTimer("*---------- Entering Done %d ---------*\n", TimerId);*/\ #define LEAVE_TIMER(DeviceContext, TimerId) \ /* Get out and adjust the time count */ \ /*DbgTimer("*---------- Leaving Timer %d ---------*\n", TimerId);*/ \ InterlockedDecrement(&DeviceContext->TimerState); \ /*DbgTimer("*---------- Leaving Done %d ---------*\n", TimerId);*/ \ // Basic timer types (just for debugging) #define LONG_TIMER 0 #define SHORT_TIMER 1 // // These macros are used to create and destroy packets, due // to the allocation or deallocation of structure which // need them. // #define NbfAddUIFrame(DeviceContext) { \ PTP_UI_FRAME _UIFrame; \ NbfAllocateUIFrame ((DeviceContext), &_UIFrame); \ if (_UIFrame != NULL) { \ ExInterlockedInsertTailList( \ &(DeviceContext)->UIFramePool, \ &_UIFrame->Linkage, \ &(DeviceContext)->Interlock); \ } \ } #define NbfRemoveUIFrame(DeviceContext) { \ PLIST_ENTRY p; \ if (DeviceContext->UIFrameAllocated > DeviceContext->UIFrameInitAllocated) { \ p = ExInterlockedRemoveHeadList( \ &(DeviceContext)->UIFramePool, \ &(DeviceContext)->Interlock); \ if (p != NULL) { \ NbfDeallocateUIFrame((DeviceContext), \ (PTP_UI_FRAME)CONTAINING_RECORD(p, TP_UI_FRAME, Linkage)); \ } \ } \ } #define NbfAddSendPacket(DeviceContext) { \ PTP_PACKET _SendPacket; \ NbfAllocateSendPacket ((DeviceContext), &_SendPacket); \ if (_SendPacket != NULL) { \ ExInterlockedPushEntryList( \ &(DeviceContext)->PacketPool, \ (PSINGLE_LIST_ENTRY)&_SendPacket->Linkage, \ &(DeviceContext)->Interlock); \ } \ } #define NbfRemoveSendPacket(DeviceContext) { \ PSINGLE_LIST_ENTRY s; \ if (DeviceContext->PacketAllocated > DeviceContext->PacketInitAllocated) { \ s = ExInterlockedPopEntryList( \ &(DeviceContext)->PacketPool, \ &(DeviceContext)->Interlock); \ if (s != NULL) { \ NbfDeallocateSendPacket((DeviceContext), \ (PTP_PACKET)CONTAINING_RECORD(s, TP_PACKET, Linkage)); \ } \ } \ } #define NbfAddReceivePacket(DeviceContext) { \ if (!(DeviceContext)->MacInfo.SingleReceive) { \ PNDIS_PACKET _ReceivePacket; \ NbfAllocateReceivePacket ((DeviceContext), &_ReceivePacket); \ if (_ReceivePacket != NULL) { \ ExInterlockedPushEntryList( \ &(DeviceContext)->ReceivePacketPool, \ &((PRECEIVE_PACKET_TAG)_ReceivePacket->ProtocolReserved)->Linkage, \ &(DeviceContext)->Interlock); \ } \ } \ } #define NbfRemoveReceivePacket(DeviceContext) { \ PSINGLE_LIST_ENTRY s; \ if (DeviceContext->ReceivePacketAllocated > DeviceContext->ReceivePacketInitAllocated) { \ s = ExInterlockedPopEntryList( \ &(DeviceContext)->ReceivePacketPool, \ &(DeviceContext)->Interlock); \ if (s != NULL) { \ NbfDeallocateReceivePacket((DeviceContext), \ (PNDIS_PACKET)CONTAINING_RECORD(s, NDIS_PACKET, ProtocolReserved[0])); \ } \ } \ } #define NbfAddReceiveBuffer(DeviceContext) { \ if (!(DeviceContext)->MacInfo.SingleReceive) { \ PBUFFER_TAG _ReceiveBuffer; \ NbfAllocateReceiveBuffer ((DeviceContext), &_ReceiveBuffer); \ if (_ReceiveBuffer != NULL) { \ ExInterlockedPushEntryList( \ &(DeviceContext)->ReceiveBufferPool, \ (PSINGLE_LIST_ENTRY)&_ReceiveBuffer->Linkage, \ &(DeviceContext)->Interlock); \ } \ } \ } #define NbfRemoveReceiveBuffer(DeviceContext) { \ PSINGLE_LIST_ENTRY s; \ if (DeviceContext->ReceiveBufferAllocated > DeviceContext->ReceiveBufferInitAllocated) { \ s = ExInterlockedPopEntryList( \ &(DeviceContext)->ReceiveBufferPool, \ &(DeviceContext)->Interlock); \ if (s != NULL) { \ NbfDeallocateReceiveBuffer(DeviceContext, \ (PBUFFER_TAG)CONTAINING_RECORD(s, BUFFER_TAG, Linkage)); \ } \ } \ } // // These routines are used to maintain counters. // #define INCREMENT_COUNTER(_DeviceContext,_Field) \ ++(_DeviceContext)->Statistics._Field #define DECREMENT_COUNTER(_DeviceContext,_Field) \ --(_DeviceContext)->Statistics._Field #define ADD_TO_LARGE_INTEGER(_LargeInteger,_Ulong) \ ExInterlockedAddLargeStatistic((_LargeInteger), (ULONG)(_Ulong)) // // Routines in PACKET.C (TP_PACKET object manager). // VOID NbfAllocateUIFrame( IN PDEVICE_CONTEXT DeviceContext, OUT PTP_UI_FRAME *TransportUIFrame ); VOID NbfAllocateSendPacket( IN PDEVICE_CONTEXT DeviceContext, OUT PTP_PACKET *TransportSendPacket ); VOID NbfAllocateReceivePacket( IN PDEVICE_CONTEXT DeviceContext, OUT PNDIS_PACKET *TransportReceivePacket ); VOID NbfAllocateReceiveBuffer( IN PDEVICE_CONTEXT DeviceContext, OUT PBUFFER_TAG *TransportReceiveBuffer ); VOID NbfDeallocateUIFrame( IN PDEVICE_CONTEXT DeviceContext, IN PTP_UI_FRAME TransportUIFrame ); VOID NbfDeallocateSendPacket( IN PDEVICE_CONTEXT DeviceContext, IN PTP_PACKET TransportSendPacket ); VOID NbfDeallocateReceivePacket( IN PDEVICE_CONTEXT DeviceContext, IN PNDIS_PACKET TransportReceivePacket ); VOID NbfDeallocateReceiveBuffer( IN PDEVICE_CONTEXT DeviceContext, IN PBUFFER_TAG TransportReceiveBuffer ); NTSTATUS NbfCreatePacket( IN PDEVICE_CONTEXT DeviceContext, IN PTP_LINK Link, OUT PTP_PACKET *Packet ); NTSTATUS NbfCreateRrPacket( IN PDEVICE_CONTEXT DeviceContext, IN PTP_LINK Link, OUT PTP_PACKET *Packet ); VOID NbfDestroyPacket( IN PTP_PACKET Packet ); VOID NbfGrowSendPacketPool( IN PDEVICE_CONTEXT DeviceContext ); #if DBG VOID NbfReferencePacket( IN PTP_PACKET Packet ); VOID NbfDereferencePacket( IN PTP_PACKET Packet ); #endif VOID NbfWaitPacket( IN PTP_CONNECTION Connection, IN ULONG Flags ); #if DBG #define MAGIC 1 extern BOOLEAN NbfEnableMagic; #else #define MAGIC 0 #endif #if MAGIC VOID NbfSendMagicBullet ( IN PDEVICE_CONTEXT DeviceContext, IN PTP_LINK Link ); #endif // // Routines in RCVENG.C (Receive engine). // VOID AwakenReceive( IN PTP_CONNECTION Connection ); VOID ActivateReceive( IN PTP_CONNECTION Connection ); VOID CompleteReceive ( IN PTP_CONNECTION Connection, IN BOOLEAN EndOfMessage, IN ULONG BytesTransferred ); VOID NbfCancelReceive( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID NbfCancelReceiveDatagram( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); // // Routines in SEND.C (Receive engine). // NTSTATUS NbfTdiSend( IN PIRP Irp ); NTSTATUS NbfTdiSendDatagram( IN PIRP Irp ); // // Routines in SENDENG.C (Send engine). // #if DBG VOID InitializeSend( PTP_CONNECTION Connection ); #else // See SENDENG.C for the fully-commented description of InitializeSend. #define InitializeSend(_conn_) { \ PIRP _irp_; \ (_conn_)->SendState = CONNECTION_SENDSTATE_PACKETIZE; \ _irp_ = CONTAINING_RECORD ((_conn_)->SendQueue.Flink, \ IRP, \ Tail.Overlay.ListEntry); \ (_conn_)->FirstSendIrp = (_conn_)->sp.CurrentSendIrp = _irp_; \ (_conn_)->FirstSendMdl = (_conn_)->sp.CurrentSendMdl = \ _irp_->MdlAddress; \ (_conn_)->FirstSendByteOffset = (_conn_)->sp.SendByteOffset = 0; \ (_conn_)->sp.MessageBytesSent = 0; \ (_conn_)->CurrentSendLength = \ IRP_SEND_LENGTH(IoGetCurrentIrpStackLocation(_irp_)); \ (_conn_)->StallCount = 0; \ (_conn_)->StallBytesSent = 0; \ if ((_conn_)->NetbiosHeader.ResponseCorrelator == 0xffff) { \ (_conn_)->NetbiosHeader.ResponseCorrelator = 1; \ } else { \ ++((_conn_)->NetbiosHeader.ResponseCorrelator); \ } \ } #endif // See SENDENG.C for the fully-commented description of // StartPacketizingConnection. On a free build this is a // macro for speed. #if DBG VOID StartPacketizingConnection( PTP_CONNECTION Connection, IN BOOLEAN Immediate ); #else #define StartPacketizingConnection(_conn_,_immed_) { \ PDEVICE_CONTEXT _devctx_; \ _devctx_ = (_conn_)->Provider; \ if (((_conn_)->SendState == CONNECTION_SENDSTATE_PACKETIZE) && \ !((_conn_)->Flags & CONNECTION_FLAGS_PACKETIZE)) { \ (_conn_)->Flags |= CONNECTION_FLAGS_PACKETIZE; \ if (!(_immed_)) { \ NbfReferenceConnection("Packetize", \ (_conn_), \ CREF_PACKETIZE_QUEUE); \ } \ ExInterlockedInsertTailList (&_devctx_->PacketizeQueue, \ &(_conn_)->PacketizeLinkage, \ &_devctx_->SpinLock); \ RELEASE_DPC_SPIN_LOCK ((_conn_)->LinkSpinLock); \ } else { \ RELEASE_DPC_SPIN_LOCK ((_conn_)->LinkSpinLock); \ if (_immed_) { \ NbfDereferenceConnection("temp TdiSend", (_conn_), CREF_BY_ID); \ } \ } \ if (_immed_) { \ PacketizeConnections (_devctx_); \ } \ } #endif VOID PacketizeConnections( IN PDEVICE_CONTEXT DeviceContext ); VOID PacketizeSend( IN PTP_CONNECTION Connection, IN BOOLEAN Direct ); BOOLEAN ResendLlcPackets( IN PTP_LINK Link, IN UCHAR AckSequenceNumber, IN BOOLEAN Resend ); VOID CompleteSend( IN PTP_CONNECTION Connection, IN USHORT Correlator ); VOID FailSend( IN PTP_CONNECTION Connection, IN NTSTATUS RequestStatus, IN BOOLEAN StopConnection ); VOID ReframeSend( IN PTP_CONNECTION Connection, IN ULONG BytesReceived ); VOID NbfCancelSend( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SendOnePacket( IN PTP_CONNECTION Connection, IN PTP_PACKET Packet, IN BOOLEAN ForceAck, OUT PBOOLEAN LinkCheckpoint OPTIONAL ); VOID SendControlPacket( IN PTP_LINK Link, IN PTP_PACKET Packet ); VOID NbfNdisSend( IN PTP_LINK Link, IN PTP_PACKET Packet ); VOID RestartLinkTraffic( IN PTP_LINK Link ); VOID NbfSendCompletionHandler( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET NdisPacket, IN NDIS_STATUS NdisStatus ); NTSTATUS BuildBufferChainFromMdlChain ( IN PDEVICE_CONTEXT DeviceContext, IN PMDL CurrentMdl, IN ULONG ByteOffset, IN ULONG DesiredLength, OUT PNDIS_BUFFER *Destination, OUT PMDL *NewCurrentMdl, OUT ULONG *NewByteOffset, OUT ULONG *TrueLength ); // // Routines in DEVCTX.C (TP_DEVCTX object manager). // VOID NbfRefDeviceContext( IN PDEVICE_CONTEXT DeviceContext ); VOID NbfDerefDeviceContext( IN PDEVICE_CONTEXT DeviceContext ); NTSTATUS NbfCreateDeviceContext( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING DeviceName, IN OUT PDEVICE_CONTEXT *DeviceContext ); VOID NbfDestroyDeviceContext( IN PDEVICE_CONTEXT DeviceContext ); // // Routines in ADDRESS.C (TP_ADDRESS object manager). // #if DBG VOID NbfRefAddress( IN PTP_ADDRESS Address ); #endif VOID NbfDerefAddress( IN PTP_ADDRESS Address ); VOID NbfAllocateAddressFile( IN PDEVICE_CONTEXT DeviceContext, OUT PTP_ADDRESS_FILE *TransportAddressFile ); VOID NbfDeallocateAddressFile( IN PDEVICE_CONTEXT DeviceContext, IN PTP_ADDRESS_FILE TransportAddressFile ); NTSTATUS NbfCreateAddressFile( IN PDEVICE_CONTEXT DeviceContext, OUT PTP_ADDRESS_FILE * AddressFile ); VOID NbfReferenceAddressFile( IN PTP_ADDRESS_FILE AddressFile ); VOID NbfDereferenceAddressFile( IN PTP_ADDRESS_FILE AddressFile ); VOID NbfDestroyAddress( IN PVOID Parameter ); NTSTATUS NbfOpenAddress( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS NbfCloseAddress( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); VOID NbfStopAddress( IN PTP_ADDRESS Address ); VOID NbfRegisterAddress( IN PTP_ADDRESS Address ); BOOLEAN NbfMatchNetbiosAddress( IN PTP_ADDRESS Address, IN UCHAR NameType, IN PUCHAR NetBIOSName ); VOID NbfAllocateAddress( IN PDEVICE_CONTEXT DeviceContext, OUT PTP_ADDRESS *TransportAddress ); VOID NbfDeallocateAddress( IN PDEVICE_CONTEXT DeviceContext, IN PTP_ADDRESS TransportAddress ); NTSTATUS NbfCreateAddress( IN PDEVICE_CONTEXT DeviceContext, IN PNBF_NETBIOS_ADDRESS NetworkName, OUT PTP_ADDRESS *Address ); PTP_ADDRESS NbfLookupAddress( IN PDEVICE_CONTEXT DeviceContext, IN PNBF_NETBIOS_ADDRESS NetworkName ); PTP_CONNECTION NbfLookupRemoteName( IN PTP_ADDRESS Address, IN PUCHAR RemoteName, IN UCHAR RemoteSessionNumber ); NTSTATUS NbfStopAddressFile( IN PTP_ADDRESS_FILE AddressFile, IN PTP_ADDRESS Address ); VOID AddressTimeoutHandler( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); TDI_ADDRESS_NETBIOS * NbfParseTdiAddress( IN TRANSPORT_ADDRESS UNALIGNED * TransportAddress, IN BOOLEAN BroadcastAddressOk ); BOOLEAN NbfValidateTdiAddress( IN TRANSPORT_ADDRESS UNALIGNED * TransportAddress, IN ULONG TransportAddressLength ); NTSTATUS NbfVerifyAddressObject ( IN PTP_ADDRESS_FILE AddressFile ); NTSTATUS NbfSendDatagramsOnAddress( PTP_ADDRESS Address ); // // Routines in CONNECT.C. // NTSTATUS NbfTdiAccept( IN PIRP Irp ); NTSTATUS NbfTdiConnect( IN PIRP Irp ); NTSTATUS NbfTdiDisconnect( IN PIRP Irp ); NTSTATUS NbfTdiDisassociateAddress ( IN PIRP Irp ); NTSTATUS NbfTdiAssociateAddress( IN PIRP Irp ); NTSTATUS NbfTdiListen( IN PIRP Irp ); NTSTATUS NbfOpenConnection( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS NbfCloseConnection( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); // // // Routines in CONNOBJ.C (TP_CONNECTION object manager). // #if DBG VOID NbfRefConnection( IN PTP_CONNECTION TransportConnection ); #endif VOID NbfDerefConnection( IN PTP_CONNECTION TransportConnection ); VOID NbfDerefConnectionSpecial( IN PTP_CONNECTION TransportConnection ); VOID NbfClearConnectionLsn( IN PTP_CONNECTION TransportConnection ); VOID NbfStopConnection( IN PTP_CONNECTION TransportConnection, IN NTSTATUS Status ); VOID NbfCancelConnection( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID NbfStartConnectionTimer( IN PTP_CONNECTION TransportConnection, IN PKDEFERRED_ROUTINE TimeoutFunction, IN ULONG WaitTime ); PTP_CONNECTION NbfLookupListeningConnection( IN PTP_ADDRESS Address, IN PUCHAR RemoteName ); PTP_CONNECTION NbfLookupConnectingConnection( IN PTP_ADDRESS Address ); VOID NbfAllocateConnection( IN PDEVICE_CONTEXT DeviceContext, OUT PTP_CONNECTION *TransportConnection ); VOID NbfDeallocateConnection( IN PDEVICE_CONTEXT DeviceContext, IN PTP_CONNECTION TransportConnection ); NTSTATUS NbfCreateConnection( IN PDEVICE_CONTEXT DeviceContext, OUT PTP_CONNECTION *TransportConnection ); PTP_CONNECTION NbfLookupConnectionById( IN PTP_ADDRESS Address, IN USHORT ConnectionId ); PTP_CONNECTION NbfLookupConnectionByContext( IN PTP_ADDRESS Address, IN CONNECTION_CONTEXT ConnectionContext ); #if 0 VOID NbfWaitConnectionOnLink( IN PTP_CONNECTION Connection, IN ULONG Flags ); #endif VOID ConnectionEstablishmentTimeout( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); NTSTATUS NbfVerifyConnectionObject ( IN PTP_CONNECTION Connection ); NTSTATUS NbfIndicateDisconnect( IN PTP_CONNECTION TransportConnection ); // // Routines in INFO.C (QUERY_INFO manager). // NTSTATUS NbfTdiQueryInformation( IN PDEVICE_CONTEXT DeviceContext, IN PIRP Irp ); NTSTATUS NbfTdiSetInformation( IN PIRP Irp ); VOID NbfSendQueryFindName( IN PDEVICE_CONTEXT DeviceContext, IN PTP_REQUEST Request ); NTSTATUS NbfProcessQueryNameRecognized( IN PDEVICE_CONTEXT DeviceContext, IN PUCHAR Packet, PNBF_HDR_CONNECTIONLESS UiFrame ); VOID NbfSendStatusQuery( IN PDEVICE_CONTEXT DeviceContext, IN PTP_REQUEST Request, IN PHARDWARE_ADDRESS DestinationAddress, IN PUCHAR SourceRouting, IN UINT SourceRoutingLength ); NTSTATUS NbfProcessStatusResponse( IN PDEVICE_CONTEXT DeviceContext, IN NDIS_HANDLE ReceiveContext, IN PNBF_HDR_CONNECTIONLESS UiFrame, IN PHARDWARE_ADDRESS SourceAddress, IN PUCHAR SourceRouting, IN UINT SourceRoutingLength ); NTSTATUS NbfProcessStatusQuery( IN PDEVICE_CONTEXT DeviceContext, IN PTP_ADDRESS Address OPTIONAL, IN PNBF_HDR_CONNECTIONLESS UiFrame, IN PHARDWARE_ADDRESS SourceAddress, IN PUCHAR SourceRouting, IN UINT SourceRoutingLength ); // // Routines in EVENT.C. // NTSTATUS NbfTdiSetEventHandler( IN PIRP Irp ); // // Routines in REQUEST.C (TP_REQUEST object manager). // VOID TdiRequestTimeoutHandler( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); #if DBG VOID NbfRefRequest( IN PTP_REQUEST Request ); #endif VOID NbfDerefRequest( IN PTP_REQUEST Request ); VOID NbfCompleteRequest( IN PTP_REQUEST Request, IN NTSTATUS Status, IN ULONG Information ); #if DBG VOID NbfRefSendIrp( IN PIO_STACK_LOCATION IrpSp ); VOID NbfDerefSendIrp( IN PIO_STACK_LOCATION IrpSp ); #endif VOID NbfCompleteSendIrp( IN PIRP Irp, IN NTSTATUS Status, IN ULONG Information ); #if DBG VOID NbfRefReceiveIrpLocked( IN PIO_STACK_LOCATION IrpSp ); #endif VOID NbfDerefReceiveIrp( IN PIO_STACK_LOCATION IrpSp ); #if DBG VOID NbfDerefReceiveIrpLocked( IN PIO_STACK_LOCATION IrpSp ); #endif VOID NbfCompleteReceiveIrp( IN PIRP Irp, IN NTSTATUS Status, IN ULONG Information ); VOID NbfAllocateRequest( IN PDEVICE_CONTEXT DeviceContext, OUT PTP_REQUEST *TransportRequest ); VOID NbfDeallocateRequest( IN PDEVICE_CONTEXT DeviceContext, IN PTP_REQUEST TransportRequest ); NTSTATUS NbfCreateRequest( IN PIRP Irp, IN PVOID Context, IN ULONG Flags, IN PMDL Buffer2, IN ULONG Buffer2Length, IN LARGE_INTEGER Timeout, OUT PTP_REQUEST * TpRequest ); // // Routines in LINK.C (TP_LINK object manager). // NTSTATUS NbfDestroyLink( IN PTP_LINK TransportLink ); VOID NbfDisconnectLink( IN PTP_LINK Link ); #if DBG VOID NbfRefLink( IN PTP_LINK TransportLink ); #endif VOID NbfDerefLink( IN PTP_LINK TransportLink ); VOID NbfRefLinkSpecial( IN PTP_LINK TransportLink ); VOID NbfDerefLinkSpecial( IN PTP_LINK TransportLink ); VOID NbfResetLink( IN PTP_LINK Link ); VOID NbfStopLink( IN PTP_LINK Link ); VOID NbfCompleteLink( IN PTP_LINK Link ); VOID NbfActivateLink( IN PTP_LINK Link ); VOID NbfWaitLink( IN PTP_LINK Link ); BOOLEAN NbfDisconnectFromLink( IN PTP_CONNECTION TransportConnection, IN BOOLEAN VerifyReferenceCount ); NTSTATUS NbfAssignGroupLsn( IN PTP_CONNECTION TransportConnection ); NTSTATUS NbfConnectToLink( IN PTP_LINK Link, IN PTP_CONNECTION TransportConnection ); PTP_CONNECTION NbfLookupPendingConnectOnLink( IN PTP_LINK Link ); PTP_CONNECTION NbfLookupPendingListenOnLink( IN PTP_LINK Link ); VOID NbfAllocateLink( IN PDEVICE_CONTEXT DeviceContext, OUT PTP_LINK *TransportLink ); VOID NbfDeallocateLink( IN PDEVICE_CONTEXT DeviceContext, IN PTP_LINK TransportLink ); NTSTATUS NbfCreateLink( IN PDEVICE_CONTEXT DeviceContext, IN PHARDWARE_ADDRESS HardwareAddress, IN PUCHAR SourceRouting, IN UINT SourceRoutingLength, IN USHORT LoopbackLinkIndex, OUT PTP_LINK *TransportLink ); VOID NbfDumpLinkInfo ( IN PTP_LINK Link ); // // routines in linktree.c // NTSTATUS NbfAddLinkToTree ( IN PDEVICE_CONTEXT DeviceContext, IN PTP_LINK Link ); NTSTATUS NbfRemoveLinkFromTree( IN PDEVICE_CONTEXT DeviceContext, IN PTP_LINK Link ); PTP_LINK NbfFindLinkInTree( IN PDEVICE_CONTEXT DeviceContext, IN PUCHAR Remote ); PTP_LINK NbfFindLink( IN PDEVICE_CONTEXT DeviceContext, IN PUCHAR Remote ); // // Routines in DLC.C (LLC frame cracker, entrypoints from NDIS interface). // VOID NbfInsertInLoopbackQueue ( IN PDEVICE_CONTEXT DeviceContext, IN PNDIS_PACKET NdisPacket, IN UCHAR LinkIndex ); VOID NbfProcessLoopbackQueue ( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); NDIS_STATUS NbfReceiveIndication( IN NDIS_HANDLE BindingContext, IN NDIS_HANDLE ReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookaheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize ); VOID NbfGeneralReceiveHandler ( IN PDEVICE_CONTEXT DeviceContext, IN NDIS_HANDLE ReceiveContext, IN PHARDWARE_ADDRESS SourceAddress, IN PTP_LINK Link, IN PVOID HeaderBuffer, IN UINT PacketSize, IN PDLC_FRAME DlcHeader, IN UINT DlcSize, IN BOOLEAN Loopback ); VOID NbfReceiveComplete ( IN NDIS_HANDLE BindingContext ); VOID NbfProcessWanDelayedQueue( IN PVOID Parameter ); VOID NbfTransferDataComplete( IN NDIS_HANDLE BindingContext, IN PNDIS_PACKET NdisPacket, IN NDIS_STATUS Status, IN UINT BytesTransferred ); VOID NbfTransferLoopbackData ( OUT PNDIS_STATUS NdisStatus, IN PDEVICE_CONTEXT DeviceContext, IN NDIS_HANDLE ReceiveContext, IN UINT ByteOffset, IN UINT BytesToTransfer, IN PNDIS_PACKET Packet, OUT PUINT BytesTransferred ); // // Routines in UFRAMES.C, the UI-frame NBF frame processor. // NTSTATUS NbfIndicateDatagram( IN PDEVICE_CONTEXT DeviceContext, IN PTP_ADDRESS Address, IN PUCHAR Dsdu, IN ULONG Length ); NTSTATUS NbfProcessUi( IN PDEVICE_CONTEXT DeviceContext, IN PHARDWARE_ADDRESS SourceAddress, IN PUCHAR Header, IN PUCHAR DlcHeader, IN ULONG DlcLength, IN PUCHAR SourceRouting, IN UINT SourceRoutingLength, OUT PTP_ADDRESS * DatagramAddress ); // // Routines in IFRAMES.C, the I-frame NBF frame processor. // VOID NbfAcknowledgeDataOnlyLast( IN PTP_CONNECTION Connection, IN ULONG MessageLength ); VOID NbfProcessIIndicate( IN BOOLEAN Command, IN BOOLEAN PollFinal, IN PTP_LINK Link, IN PUCHAR DlcHeader, IN UINT DlcIndicatedLength, IN UINT DlcTotalLength, IN NDIS_HANDLE ReceiveContext, IN BOOLEAN Loopback ); NTSTATUS ProcessIndicateData( IN PTP_CONNECTION Connection, IN PUCHAR DlcHeader, IN UINT DlcIndicatedLength, IN PUCHAR DataHeader, IN UINT DataTotalLength, IN NDIS_HANDLE ReceiveContext, IN BOOLEAN Last, IN BOOLEAN Loopback ); // // Routines in RCV.C (data copying routines for receives). // NTSTATUS NbfTdiReceive( IN PIRP Irp ); NTSTATUS NbfTdiReceiveDatagram( IN PIRP Irp ); // // Routines in FRAMESND.C, the UI-frame (non-link) shipper. // VOID NbfSendNameQuery( IN PTP_CONNECTION Connection, IN BOOLEAN SourceRoutingOptional ); VOID NbfSendNameRecognized( IN PTP_ADDRESS Address, IN UCHAR LocalSessionNumber, // LSN assigned to session. IN PNBF_HDR_CONNECTIONLESS Header, IN PHARDWARE_ADDRESS SourceAddress, IN PUCHAR SourceRouting, IN UINT SourceRoutingLength ); VOID NbfSendNameInConflict( IN PTP_ADDRESS Address, IN PUCHAR ConflictingName ); NTSTATUS NbfSendAddNameQuery( IN PTP_ADDRESS Address ); VOID NbfSendSessionInitialize( IN PTP_CONNECTION Connection ); VOID NbfSendSessionConfirm( IN PTP_CONNECTION Connection ); VOID NbfSendSessionEnd( IN PTP_CONNECTION Connection, IN BOOLEAN Abort ); VOID NbfSendNoReceive( IN PTP_CONNECTION Connection ); VOID NbfSendReceiveContinue( IN PTP_CONNECTION Connection ); VOID NbfSendReceiveOutstanding( IN PTP_CONNECTION Connection ); VOID NbfSendDataAck( IN PTP_CONNECTION Connection ); VOID NbfSendSabme( IN PTP_LINK Link, IN BOOLEAN PollFinal ); VOID NbfSendDisc( IN PTP_LINK Link, IN BOOLEAN PollFinal ); VOID NbfSendUa( IN PTP_LINK Link, IN BOOLEAN PollFinal ); VOID NbfSendDm( IN PTP_LINK Link, IN BOOLEAN PollFinal ); VOID NbfSendRr( IN PTP_LINK Link, IN BOOLEAN Command, IN BOOLEAN PollFinal ); #if 0 // // These functions are not currently called, so they are commented // out. // VOID NbfSendRnr( IN PTP_LINK Link, IN BOOLEAN Command, IN BOOLEAN PollFinal ); VOID NbfSendTest( IN PTP_LINK Link, IN BOOLEAN Command, IN BOOLEAN PollFinal, IN PMDL Psdu ); VOID NbfSendFrmr( IN PTP_LINK Link, IN BOOLEAN PollFinal ); #endif VOID NbfSendXid( IN PTP_LINK Link, IN BOOLEAN Command, IN BOOLEAN PollFinal ); VOID NbfSendRej( IN PTP_LINK Link, IN BOOLEAN Command, IN BOOLEAN PollFinal ); NTSTATUS NbfCreateConnectionlessFrame( IN PDEVICE_CONTEXT DeviceContext, OUT PTP_UI_FRAME *OuterFrame ); VOID NbfDestroyConnectionlessFrame( IN PDEVICE_CONTEXT DeviceContext, IN PTP_UI_FRAME RawFrame ); VOID NbfSendUIFrame( IN PDEVICE_CONTEXT DeviceContext, IN PTP_UI_FRAME RawFrame, IN BOOLEAN Loopback ); VOID NbfSendUIMdlFrame( IN PTP_ADDRESS Address ); VOID NbfSendDatagramCompletion( IN PTP_ADDRESS Address, IN PNDIS_PACKET NdisPacket, IN NDIS_STATUS NdisStatus ); // // Routines in FRAMECON.C, the NetBIOS Frames Protocol Frame Constructors. // To understand the various constant parameters to these functions (such // as special data1 & data2 values, see NBFCONST.H for details. // VOID ConstructAddGroupNameQuery( IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format. IN USHORT Correlator, // correlator for ADD_NAME_RESPONSE. IN PNAME GroupName // NetBIOS group name to be added. ); VOID ConstructAddNameQuery( IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format. IN USHORT Correlator, // correlator for ADD_NAME_RESPONSE. IN PNAME Name // NetBIOS name to be added. ); VOID ConstructNameInConflict( IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format. IN PNAME ConflictingName, // NetBIOS name that is conflicting. IN PNAME SendingPermanentName // NetBIOS permanent node name of sender. ); VOID ConstructStatusQuery( IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format. IN UCHAR RequestType, // type of request, defined below. IN USHORT BufferLength, // length of user's status buffer. IN USHORT Correlator, // correlator for STATUS_RESPONSE. IN PNAME ReceiverName, // NetBIOS name of receiver. IN PNAME SendingPermanentName // NetBIOS permanent node name of sender. ); VOID ConstructTerminateTrace( IN PNBF_HDR_CONNECTIONLESS RawFrame // frame buffer to format. ); VOID ConstructDatagram( IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format. IN PNAME ReceiverName, // NetBIOS name of receiver. IN PNAME SenderName // NetBIOS name of sender. ); VOID ConstructDatagramBroadcast( IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format. IN PNAME SenderName // NetBIOS name of sender. ); VOID ConstructNameQuery( IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format. IN UCHAR NameType, // type of name. IN UCHAR LocalSessionNumber, // LSN assigned to session (0=FIND_NAME). IN USHORT Correlator, // correlator in NAME_RECOGNIZED. IN PNAME SenderName, // NetBIOS name of sender. IN PNAME ReceiverName // NetBIOS name of sender. ); VOID ConstructAddNameResponse( IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format. IN UCHAR NameType, // type of name. IN USHORT Correlator, // correlator from ADD_[GROUP_]NAME_QUERY. IN PNAME Name // NetBIOS name being responded to. ); VOID ConstructNameRecognized( IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format. IN UCHAR NameType, // type of name. IN UCHAR LocalSessionNumber, // LSN assigned to session. IN USHORT NameQueryCorrelator, // correlator from NAME_QUERY. IN USHORT Correlator, // correlator expected from next response. IN PNAME SenderName, // NetBIOS name of sender. IN PNAME ReceiverName // NetBIOS name of receiver. ); VOID ConstructStatusResponse( IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format. IN UCHAR RequestType, // type of request, defined below. IN BOOLEAN Truncated, // data is truncated. IN BOOLEAN DataOverflow, // too much data for user's buffer. IN USHORT DataLength, // length of data sent. IN USHORT Correlator, // correlator from STATUS_QUERY. IN PNAME ReceivingPermanentName, // NetBIOS permanent node name of receiver. IN PNAME SenderName // NetBIOS name of sender. ); VOID ConstructDataAck( IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format. IN USHORT Correlator, // correlator from DATA_ONLY_LAST. IN UCHAR LocalSessionNumber, // session number of SENDER. IN UCHAR RemoteSessionNumber // session number of RECEIVER. ); VOID ConstructDataOnlyLast( IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format. IN BOOLEAN Resynched, // TRUE if we are resynching. IN USHORT Correlator, // correlator for RECEIVE_CONTINUE. IN UCHAR LocalSessionNumber, // session number of SENDER. IN UCHAR RemoteSessionNumber // session number of RECEIVER. ); VOID ConstructSessionConfirm( IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format. IN UCHAR Options, // bitflag options, defined below. IN USHORT MaximumUserBufferSize, // max size of user frame on session. IN USHORT Correlator, // correlator from SESSION_INITIALIZE. IN UCHAR LocalSessionNumber, // session number of SENDER. IN UCHAR RemoteSessionNumber // session number of RECEIVER. ); VOID ConstructSessionEnd( IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format. IN USHORT Reason, // reason for termination, defined below. IN UCHAR LocalSessionNumber, // session number of SENDER. IN UCHAR RemoteSessionNumber // session number of RECEIVER. ); VOID ConstructSessionInitialize( IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format. IN UCHAR Options, // bitflag options, defined below. IN USHORT MaximumUserBufferSize, // max size of user frame on session. IN USHORT NameRecognizedCorrelator, // correlator from NAME_RECOGNIZED. IN USHORT Correlator, // correlator for SESSION_CONFIRM. IN UCHAR LocalSessionNumber, // session number of SENDER. IN UCHAR RemoteSessionNumber // session number of RECEIVER. ); VOID ConstructNoReceive( IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format. IN USHORT Options, // option bitflags, defined below. IN USHORT BytesAccepted, // number of bytes accepted. IN UCHAR LocalSessionNumber, // session number of SENDER. IN UCHAR RemoteSessionNumber // session number of RECEIVER. ); VOID ConstructReceiveOutstanding( IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format. IN USHORT BytesAccepted, // number of bytes accepted. IN UCHAR LocalSessionNumber, // session number of SENDER. IN UCHAR RemoteSessionNumber // session number of RECEIVER. ); VOID ConstructReceiveContinue( IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format. IN USHORT Correlator, // correlator from DATA_FIRST_MIDDLE IN UCHAR LocalSessionNumber, // session number of SENDER. IN UCHAR RemoteSessionNumber // session number of RECEIVER. ); #if 0 VOID ConstructSessionAlive( IN PNBF_HDR_CONNECTION RawFrame // frame buffer to format. ); #endif // // Routines in nbfndis.c. // #if DBG PUCHAR NbfGetNdisStatus ( IN NDIS_STATUS NdisStatus ); #endif // // Routines in nbfdrvr.c // VOID NbfWriteResourceErrorLog( IN PDEVICE_CONTEXT DeviceContext, IN NTSTATUS ErrorCode, IN ULONG UniqueErrorValue, IN ULONG BytesNeeded, IN ULONG ResourceId ); VOID NbfWriteGeneralErrorLog( IN PDEVICE_CONTEXT DeviceContext, IN NTSTATUS ErrorCode, IN ULONG UniqueErrorValue, IN NTSTATUS FinalStatus, IN PWSTR SecondString, IN ULONG DumpDataCount, IN ULONG DumpData[] ); VOID NbfWriteOidErrorLog( IN PDEVICE_CONTEXT DeviceContext, IN NTSTATUS ErrorCode, IN NTSTATUS FinalStatus, IN PWSTR AdapterString, IN ULONG OidValue ); VOID NbfFreeResources( IN PDEVICE_CONTEXT DeviceContext ); extern ULONG NbfInitializeOneDeviceContext( OUT PNDIS_STATUS NdisStatus, IN PDRIVER_OBJECT DriverObject, IN PCONFIG_DATA NbfConfig, IN PUNICODE_STRING BindName, IN PUNICODE_STRING ExportName, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2 ); extern VOID NbfReInitializeDeviceContext( OUT PNDIS_STATUS NdisStatus, IN PDRIVER_OBJECT DriverObject, IN PCONFIG_DATA NbfConfig, IN PUNICODE_STRING BindName, IN PUNICODE_STRING ExportName, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2 ); // // routines in nbfcnfg.c // NTSTATUS NbfConfigureTransport ( IN PUNICODE_STRING RegistryPath, IN PCONFIG_DATA * ConfigData ); NTSTATUS NbfGetExportNameFromRegistry( IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING BindName, OUT PUNICODE_STRING ExportName ); // // Routines in nbfndis.c // NTSTATUS NbfRegisterProtocol ( IN PUNICODE_STRING NameString ); VOID NbfDeregisterProtocol ( VOID ); NTSTATUS NbfInitializeNdis ( IN PDEVICE_CONTEXT DeviceContext, IN PCONFIG_DATA ConfigInfo, IN PUNICODE_STRING AdapterString ); VOID NbfCloseNdis ( IN PDEVICE_CONTEXT DeviceContext ); // // Routines in action.c // NTSTATUS NbfTdiAction( IN PDEVICE_CONTEXT DeviceContext, IN PIRP Irp ); VOID NbfActionQueryIndication( PDEVICE_CONTEXT DeviceContext, PNBF_HDR_CONNECTIONLESS UiFrame ); VOID NbfActionDatagramIndication( PDEVICE_CONTEXT DeviceContext, PNBF_HDR_CONNECTIONLESS UiFrame, ULONG Length ); VOID NbfStopControlChannel( IN PDEVICE_CONTEXT DeviceContext, IN USHORT ChannelIdentifier ); // // Routines in nbfdebug.c // #if DBG VOID DisplayOneFrame( PTP_PACKET Packet ); VOID NbfDisplayUIFrame( PTP_UI_FRAME OuterFrame ); VOID NbfFormattedDump( PCHAR far_p, ULONG len ); #endif // // Routines in nbflog.c // #if PKT_LOG VOID NbfLogRcvPacket( PTP_CONNECTION Connection, PTP_LINK Link, PUCHAR Header, UINT TotalLength, UINT AvailLength ); VOID NbfLogSndPacket( PTP_LINK Link, PTP_PACKET Packet ); VOID NbfLogIndPacket( PTP_CONNECTION Connection, PUCHAR Header, UINT TotalLength, UINT AvailLength, UINT TakenLength, ULONG Status ); #endif // PKT_LOG #endif // def _NBFPROCS_