/*++ Copyright (c) 1989 Microsoft Corporation Module Name: nbf.h Abstract: Private include file for the NBF (NetBIOS Frames Protocol) transport provider subcomponent of the NTOS project. Author: Stephen E. Jones (stevej) 25-Oct-1989 Revision History: David Beaver (dbeaver) 24-Sep-1990 Remove PDI and PC586-specific support; add NDIS support --*/ #include #include #include //#include //#include //#include //#include //#include //#include //#include //#include //#include //#include //#include #ifdef BUILD_FOR_511 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b) #endif typedef struct _RTL_SPLAY_LINKS { struct _RTL_SPLAY_LINKS *Parent; struct _RTL_SPLAY_LINKS *LeftChild; struct _RTL_SPLAY_LINKS *RightChild; } RTL_SPLAY_LINKS; typedef RTL_SPLAY_LINKS *PRTL_SPLAY_LINKS; #define RtlInitializeSplayLinks(Links) { \ PRTL_SPLAY_LINKS _SplayLinks; \ _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \ _SplayLinks->Parent = _SplayLinks; \ _SplayLinks->LeftChild = NULL; \ _SplayLinks->RightChild = NULL; \ } #define RtlLeftChild(Links) ( \ (PRTL_SPLAY_LINKS)(Links)->LeftChild \ ) #define RtlRightChild(Links) ( \ (PRTL_SPLAY_LINKS)(Links)->RightChild \ ) #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) { \ PRTL_SPLAY_LINKS _SplayParent; \ PRTL_SPLAY_LINKS _SplayChild; \ _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ _SplayParent->LeftChild = _SplayChild; \ _SplayChild->Parent = _SplayParent; \ } #define RtlInsertAsRightChild(ParentLinks,ChildLinks) { \ PRTL_SPLAY_LINKS _SplayParent; \ PRTL_SPLAY_LINKS _SplayChild; \ _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ _SplayParent->RightChild = _SplayChild; \ _SplayChild->Parent = _SplayParent; \ } PRTL_SPLAY_LINKS NTAPI RtlDelete ( PRTL_SPLAY_LINKS Links ); #include // Transport Driver Interface. #include // Physical Driver Interface. #if DEVL #define STATIC #else #define STATIC static #endif #include "nbfconst.h" // private NETBEUI constants. #include "nbfmac.h" // mac-specific definitions #include "nbfhdrs.h" // private NETBEUI protocol headers. #include "nbfcnfg.h" // configuration information. #include "nbftypes.h" // private NETBEUI types. #include "nbfprocs.h" // private NETBEUI function prototypes. #ifdef MEMPRINT #include "memprint.h" // drt's memory debug print #endif #if defined(NT_UP) && defined(DRIVERS_UP) #define NBF_UP 1 #endif // // Resource and Mutex Macros // // // We wrap each of these macros using // Enter,Leave critical region macros // to disable APCs which might occur // while we are holding the resource // resulting in deadlocks in the OS. // #define ACQUIRE_RESOURCE_EXCLUSIVE(Resource, Wait) \ KeEnterCriticalRegion(); ExAcquireResourceExclusiveLite(Resource, Wait); #define RELEASE_RESOURCE(Resource) \ ExReleaseResourceLite(Resource); KeLeaveCriticalRegion(); #define ACQUIRE_FAST_MUTEX_UNSAFE(Mutex) \ KeEnterCriticalRegion(); ExAcquireFastMutexUnsafe(Mutex); #define RELEASE_FAST_MUTEX_UNSAFE(Mutex) \ ExReleaseFastMutexUnsafe(Mutex); KeLeaveCriticalRegion(); #ifndef NBF_LOCKS #if !defined(NBF_UP) #define ACQUIRE_SPIN_LOCK(lock,irql) KeAcquireSpinLock(lock,irql) #define RELEASE_SPIN_LOCK(lock,irql) KeReleaseSpinLock(lock,irql) #define ACQUIRE_DPC_SPIN_LOCK(lock) KeAcquireSpinLockAtDpcLevel(lock) #define RELEASE_DPC_SPIN_LOCK(lock) KeReleaseSpinLockFromDpcLevel(lock) #else // NBF_UP #define ACQUIRE_SPIN_LOCK(lock,irql) ExAcquireSpinLock(lock,irql) #define RELEASE_SPIN_LOCK(lock,irql) ExReleaseSpinLock(lock,irql) #define ACQUIRE_DPC_SPIN_LOCK(lock) #define RELEASE_DPC_SPIN_LOCK(lock) #endif #if DBG #define ACQUIRE_C_SPIN_LOCK(lock,irql) { \ PTP_CONNECTION _conn = CONTAINING_RECORD(lock,TP_CONNECTION,SpinLock); \ KeAcquireSpinLock(lock,irql); \ _conn->LockAcquired = TRUE; \ strncpy(_conn->LastAcquireFile, strrchr(__FILE__,'\\')+1, 7); \ _conn->LastAcquireLine = __LINE__; \ } #define RELEASE_C_SPIN_LOCK(lock,irql) { \ PTP_CONNECTION _conn = CONTAINING_RECORD(lock,TP_CONNECTION,SpinLock); \ _conn->LockAcquired = FALSE; \ strncpy(_conn->LastReleaseFile, strrchr(__FILE__,'\\')+1, 7); \ _conn->LastReleaseLine = __LINE__; \ KeReleaseSpinLock(lock,irql); \ } #define ACQUIRE_DPC_C_SPIN_LOCK(lock) { \ PTP_CONNECTION _conn = CONTAINING_RECORD(lock,TP_CONNECTION,SpinLock); \ KeAcquireSpinLockAtDpcLevel(lock); \ _conn->LockAcquired = TRUE; \ strncpy(_conn->LastAcquireFile, strrchr(__FILE__,'\\')+1, 7); \ _conn->LastAcquireLine = __LINE__; \ } #define RELEASE_DPC_C_SPIN_LOCK(lock) { \ PTP_CONNECTION _conn = CONTAINING_RECORD(lock,TP_CONNECTION,SpinLock); \ _conn->LockAcquired = FALSE; \ strncpy(_conn->LastReleaseFile, strrchr(__FILE__,'\\')+1, 7); \ _conn->LastReleaseLine = __LINE__; \ KeReleaseSpinLockFromDpcLevel(lock); \ } #else // DBG #define ACQUIRE_C_SPIN_LOCK(lock,irql) ACQUIRE_SPIN_LOCK(lock,irql) #define RELEASE_C_SPIN_LOCK(lock,irql) RELEASE_SPIN_LOCK(lock,irql) #define ACQUIRE_DPC_C_SPIN_LOCK(lock) ACQUIRE_DPC_SPIN_LOCK(lock) #define RELEASE_DPC_C_SPIN_LOCK(lock) RELEASE_DPC_SPIN_LOCK(lock) #endif // DBG #define ENTER_NBF #define LEAVE_NBF #else VOID NbfAcquireSpinLock( IN PKSPIN_LOCK Lock, OUT PKIRQL OldIrql, IN PSZ LockName, IN PSZ FileName, IN ULONG LineNumber ); VOID NbfReleaseSpinLock( IN PKSPIN_LOCK Lock, IN KIRQL OldIrql, IN PSZ LockName, IN PSZ FileName, IN ULONG LineNumber ); #define ACQUIRE_SPIN_LOCK(lock,irql) \ NbfAcquireSpinLock( lock, irql, #lock, __FILE__, __LINE__ ) #define RELEASE_SPIN_LOCK(lock,irql) \ NbfReleaseSpinLock( lock, irql, #lock, __FILE__, __LINE__ ) #define ACQUIRE_DPC_SPIN_LOCK(lock) \ { \ KIRQL OldIrql; \ NbfAcquireSpinLock( lock, &OldIrql, #lock, __FILE__, __LINE__ ); \ } #define RELEASE_DPC_SPIN_LOCK(lock) \ NbfReleaseSpinLock( lock, DISPATCH_LEVEL, #lock, __FILE__, __LINE__ ) #define ENTER_NBF \ NbfAcquireSpinLock( (PKSPIN_LOCK)NULL, (PKIRQL)NULL, "(Global)", __FILE__, __LINE__ ) #define LEAVE_NBF \ NbfReleaseSpinLock( (PKSPIN_LOCK)NULL, (KIRQL)-1, "(Global)", __FILE__, __LINE__ ) #endif