245 lines
6.8 KiB
C
245 lines
6.8 KiB
C
|
/*++
|
||
|
|
||
|
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 <ntddk.h>
|
||
|
|
||
|
#include <windef.h>
|
||
|
#include <nb30.h>
|
||
|
//#include <ntiologc.h>
|
||
|
//#include <ctype.h>
|
||
|
//#include <assert.h>
|
||
|
//#include <stdio.h>
|
||
|
//#include <stdlib.h>
|
||
|
//#include <memory.h>
|
||
|
//#include <nt.h>
|
||
|
//#include <ntrtl.h>
|
||
|
//#include <nturtl.h>
|
||
|
//#include <string.h>
|
||
|
//#include <windows.h>
|
||
|
|
||
|
#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 <tdikrnl.h> // Transport Driver Interface.
|
||
|
|
||
|
#include <ndis.h> // 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
|
||
|
|