windows-nt/Source/XPSP1/NT/net/ndis/sys/ndisnt.h

390 lines
20 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1990-1995 Microsoft Corporation
Module Name:
ndisnt.h
Abstract:
Windows NT Specific macros
Author:
Environment:
Kernel mode, FSD
Revision History:
Nov-95 Jameel Hyder Split up from a monolithic file
--*/
#define Increment(a,b) InterlockedIncrement(a)
#define Decrement(a,b) InterlockedDecrement(a)
#define CURRENT_THREAD PsGetCurrentThread()
#define CURRENT_PROCESSOR KeGetCurrentProcessorNumber()
#define CopyMemory(Destination,Source,Length) RtlCopyMemory(Destination,Source,Length)
#define MoveMemory(Destination,Source,Length) RtlMoveMemory(Destination,Source,Length)
#define ZeroMemory(Destination,Length) RtlZeroMemory(Destination,Length)
#define INITIALIZE_SPIN_LOCK(_L_) KeInitializeSpinLock(_L_)
#define ACQUIRE_SPIN_LOCK(_SpinLock, _pOldIrql) ExAcquireSpinLock(_SpinLock, _pOldIrql)
#define RELEASE_SPIN_LOCK(_SpinLock, _OldIrql) ExReleaseSpinLock(_SpinLock, _OldIrql)
#define ACQUIRE_SPIN_LOCK_DPC(_SpinLock) \
{ \
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
ExAcquireSpinLockAtDpcLevel(_SpinLock); \
}
#define RELEASE_SPIN_LOCK_DPC(_SpinLock) \
{ \
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
ExReleaseSpinLockFromDpcLevel(_SpinLock); \
}
#define NDIS_ACQUIRE_SPIN_LOCK(_SpinLock, _pOldIrql) ExAcquireSpinLock(&(_SpinLock)->SpinLock, _pOldIrql)
#define NDIS_RELEASE_SPIN_LOCK(_SpinLock, _OldIrql) ExReleaseSpinLock(&(_SpinLock)->SpinLock, _OldIrql)
#define NDIS_ACQUIRE_SPIN_LOCK_DPC(_SpinLock) \
{ \
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
ExAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock); \
}
#define NDIS_RELEASE_SPIN_LOCK_DPC(_SpinLock) \
{ \
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
ExReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock); \
}
#define SET_LOCK_DBG(_M) \
{ \
(_M)->LockDbg = (MODULE_NUMBER + __LINE__); \
}
#define SET_LOCK_DBGX(_M) \
{ \
(_M)->LockDbgX = (MODULE_NUMBER + __LINE__); \
(_M)->LockThread = CURRENT_THREAD; \
}
#define CLEAR_LOCK_DBG(_M) \
{ \
(_M)->LockDbg = 0; \
}
#define CLEAR_LOCK_DBGX(_M) \
{ \
(_M)->LockDbgX = 0; \
(_M)->LockThread = NULL; \
}
#define NDIS_ACQUIRE_COMMON_SPIN_LOCK(_M, _pS, _pIrql, _pT) \
{ \
ExAcquireSpinLock(_pS, _pIrql); \
ASSERT((_pT) == NULL); \
(_pT) = CURRENT_THREAD; \
SET_LOCK_DBG(_M); \
}
#define NDIS_RELEASE_COMMON_SPIN_LOCK(_M, _pS, _Irql, _pT) \
{ \
ASSERT(_pT == CURRENT_THREAD); \
_pT = NULL; \
CLEAR_LOCK_DBG(_M); \
ExReleaseSpinLock(_pS, _Irql); \
}
#define NDIS_ACQUIRE_COMMON_SPIN_LOCK_DPC(_M, _pS, _pT) \
{ \
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
\
ExAcquireSpinLockAtDpcLevel(_pS); \
ASSERT((_pT) == NULL); \
(_pT) = CURRENT_THREAD; \
SET_LOCK_DBG(_M); \
}
#define NDIS_RELEASE_COMMON_SPIN_LOCK_DPC(_M, _pS, _pT) \
{ \
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
\
ASSERT(_pT == CURRENT_THREAD); \
_pT = NULL; \
ExReleaseSpinLockFromDpcLevel(_pS); \
CLEAR_LOCK_DBG(_M); \
}
#define NDIS_ACQUIRE_MINIPORT_SPIN_LOCK(_M, _pIrql) \
NDIS_ACQUIRE_COMMON_SPIN_LOCK((_M), &(_M)->Lock, (_pIrql), (_M)->MiniportThread)
#define NDIS_RELEASE_MINIPORT_SPIN_LOCK(_M, _Irql) \
NDIS_RELEASE_COMMON_SPIN_LOCK((_M), &(_M)->Lock, (_Irql), (_M)->MiniportThread)
#define NDIS_ACQUIRE_MINIPORT_SPIN_LOCK_DPC(_M) \
NDIS_ACQUIRE_COMMON_SPIN_LOCK_DPC((_M), &(_M)->Lock, (_M)->MiniportThread)
#define NDIS_RELEASE_MINIPORT_SPIN_LOCK_DPC(_M) \
NDIS_RELEASE_COMMON_SPIN_LOCK_DPC(_M, &(_M)->Lock, (_M)->MiniportThread)
//
// Some macros for platform independence
//
#define NDIS_INTERNAL_STALL(_N_) \
{ \
volatile UINT _cnt; \
for (_cnt = 0; _cnt < _N_; _cnt++) \
NOTHING; \
}
#define LOCK_MINIPORT(_M, _L) \
{ \
(_L) = 0; \
if ((_M)->LockAcquired == 0) \
{ \
(_M)->LockAcquired = 0x01; \
SET_LOCK_DBGX(_M); \
(_L) = 0x01; \
} \
}
#define BLOCK_LOCK_MINIPORT_DPC_L(_M) \
{ \
do \
{ \
if ((_M)->LockAcquired == 0) \
{ \
(_M)->LockAcquired = 0x01; \
SET_LOCK_DBGX(_M); \
break; \
} \
else \
{ \
NDIS_RELEASE_MINIPORT_SPIN_LOCK_DPC(_M); \
NDIS_INTERNAL_STALL(50); \
NDIS_ACQUIRE_MINIPORT_SPIN_LOCK_DPC(_M); \
} \
} while (TRUE); \
}
#define BLOCK_LOCK_MINIPORT_LOCKED(_M, _I) \
{ \
do \
{ \
NDIS_ACQUIRE_MINIPORT_SPIN_LOCK(_M, &(_I)); \
if ((_M)->LockAcquired == 0) \
{ \
(_M)->LockAcquired = 0x01; \
SET_LOCK_DBGX(_M); \
break; \
} \
NDIS_RELEASE_MINIPORT_SPIN_LOCK(_M, _I); \
NDIS_INTERNAL_STALL(50); \
} while (TRUE); \
}
#define UNLOCK_MINIPORT(_M, _L) \
{ \
if (_L) \
{ \
UNLOCK_MINIPORT_L(_M); \
} \
}
#define UNLOCK_MINIPORT_L(_M) \
{ \
ASSERT(MINIPORT_LOCK_ACQUIRED(_M)); \
(_M)->LockAcquired = 0; \
CLEAR_LOCK_DBGX(_M); \
}
#define UNLOCK_MINIPORT_U(_M, _I) \
{ \
ASSERT(MINIPORT_LOCK_ACQUIRED(_M)); \
(_M)->LockAcquired = 0; \
CLEAR_LOCK_DBGX(_M); \
\
NDIS_RELEASE_MINIPORT_SPIN_LOCK(_M, _I); \
}
#if TRACK_MEMORY
#define ALLOC_FROM_POOL(_Size_, _Tag_) AllocateM(_Size_, \
(MODULE_NUMBER + __LINE__),\
_Tag_)
#define FREE_POOL(_P_) FreeM(_P_)
#else
#define ALLOC_FROM_POOL(_Size_, _Tag_) ExAllocatePoolWithTag(NonPagedPool, \
_Size_, \
_Tag_)
#define FREE_POOL(_P_) ExFreePool(_P_)
#endif
#define INITIALIZE_WORK_ITEM(_W, _R, _C) ExInitializeWorkItem(_W, _R, _C)
#define XQUEUE_WORK_ITEM(_W, _Q) ExQueueWorkItem(_W, _Q)
#define QUEUE_WORK_ITEM(_W, _Q) KeInsertQueue(&ndisWorkerQueue, &(_W)->List)
#define CURRENT_IRQL KeGetCurrentIrql()
#define RAISE_IRQL_TO_DISPATCH(_pIrql_) KeRaiseIrql(DISPATCH_LEVEL, _pIrql_)
#define LOWER_IRQL(_OldIrql_, _CurIrql_) \
{ \
if (_OldIrql_ != _CurIrql_) KeLowerIrql(_OldIrql_); \
}
#define CURRENT_PROCESSOR KeGetCurrentProcessorNumber()
#define INITIALIZE_TIMER(_Timer_) KeInitializeTimer(_Timer_)
#define INITIALIZE_TIMER_EX(_Timer_,_Type_) KeInitializeTimerEx(_Timer_, _Type_)
#define CANCEL_TIMER(_Timer_) KeCancelTimer(_Timer_)
#define SET_TIMER(_Timer_, _Time_, _Dpc_) KeSetTimer(_Timer_, _Time_, _Dpc_)
#define SET_PERIODIC_TIMER(_Timer_, _DueTime_, _PeriodicTime_, _Dpc_) \
KeSetTimerEx(_Timer_, _DueTime_, _PeriodicTime_, _Dpc_)
#define INITIALIZE_EVENT(_pEvent_) KeInitializeEvent(_pEvent_, NotificationEvent, FALSE)
#define SET_EVENT(_pEvent_) KeSetEvent(_pEvent_, 0, FALSE)
#define RESET_EVENT(_pEvent_) KeResetEvent(_pEvent_)
#define INITIALIZE_MUTEX(_M_) KeInitializeMutex(_M_, 0xFFFF)
#define RELEASE_MUTEX(_M_) KeReleaseMutex(_M_, FALSE)
#define WAIT_FOR_OBJECT(_O_, _TO_) KeWaitForSingleObject(_O_, \
Executive,\
KernelMode,\
FALSE, \
_TO_) \
#define GET_CURRENT_TICK_IN_SECONDS(_pCurrTick) \
{ \
LARGE_INTEGER _CurrentTick; \
\
KeQueryTickCount(&_CurrentTick); \
/* Convert to seconds */ \
_CurrentTick.QuadPart = (_CurrentTick.QuadPart*ndisTimeIncrement)/(10*1000*1000);\
*(_pCurrTick) = _CurrentTick.LowPart; \
}
#define GET_CURRENT_TICK(_pCurrTick) KeQueryTickCount(_pCurrTick)
#if NOISY_WAIT
#define WAIT_FOR_OBJECT_MSG(_O_, _MSG, _STR) \
{ \
NTSTATUS Status; \
LARGE_INTEGER Time; \
\
/* Block 5 seconds */ \
Time.QuadPart = Int32x32To64(5000, -10000); \
do \
{ \
Status = KeWaitForSingleObject(_O_, \
Executive, \
KernelMode, \
FALSE, \
&Time); \
if (NT_SUCCESS(Status)) \
{ \
break; \
} \
DbgPrint(_MSG, _STR); \
} while (TRUE); \
}
#define WAIT_FOR_PROTOCOL(_pProt, _O) \
{ \
WAIT_FOR_OBJECT_MSG(_O, \
"NDIS: Waiting for protocol %Z\n", \
&(_pProt)->ProtocolCharacteristics.Name); \
}
#define WAIT_FOR_PROTO_MUTEX(_pProt) \
{ \
WAIT_FOR_OBJECT_MSG(&(_pProt)->Mutex, \
"NDIS: Waiting for protocol %Z\n", \
&(_pProt)->ProtocolCharacteristics.Name); \
(_pProt)->MutexOwner = (MODULE_NUMBER + __LINE__);\
}
#else
#define WAIT_FOR_PROTOCOL(_pProt, _O) \
{ \
WAIT_FOR_OBJECT(_O, NULL); \
}
#define WAIT_FOR_PROTO_MUTEX(_pProt) \
{ \
WAIT_FOR_OBJECT(&(_pProt)->Mutex, NULL); \
(_pProt)->MutexOwner = (MODULE_NUMBER + __LINE__); \
}
#endif
#define RELEASE_PROT_MUTEX(_pProt) \
{ \
(_pProt)->MutexOwner = 0; \
RELEASE_MUTEX(&(_pProt)->Mutex); \
}
#define WAIT_FOR_PNP_MUTEX() \
{ \
WAIT_FOR_OBJECT(&ndisPnPMutex, NULL); \
ndisPnPMutexOwner = (MODULE_NUMBER + __LINE__); \
}
#define RELEASE_PNP_MUTEX() \
{ \
ndisPnPMutexOwner = 0; \
RELEASE_MUTEX(&ndisPnPMutex); \
}
#define QUEUE_DPC(_pDpc_) KeInsertQueueDpc(_pDpc_, NULL, NULL)
#define INITIALIZE_DPC(_pDpc_, _R_, _C_) KeInitializeDpc(_pDpc_, _R_, _C_)
#define SET_DPC_IMPORTANCE(_pDpc_) KeSetImportanceDpc(_pDpc_, LowImportance)
#define SET_PROCESSOR_DPC(_pDpc_, _R_) if (!ndisSkipProcessorAffinity) \
KeSetTargetProcessorDpc(_pDpc_, _R_)
#define SYNC_WITH_ISR(_O_, _F_, _C_) KeSynchronizeExecution(_O_, \
(PKSYNCHRONIZE_ROUTINE)(_F_), \
_C_)
#define MDL_ADDRESS(_MDL_) MmGetSystemAddressForMdl(_MDL_) // Don't use
#define MDL_ADDRESS_SAFE(_MDL_, _PRIORITY_) MmGetSystemAddressForMdlSafe(_MDL_, _PRIORITY_)
#define MDL_SIZE(_MDL_) MmGetMdlByteCount(_MDL_)
#define MDL_OFFSET(_MDL_) MmGetMdlByteOffset(_MDL_)
#define MDL_VA(_MDL_) MmGetMdlVirtualAddress(_MDL_)
#define max(_a, _b) (((_a) > (_b)) ? (_a) : (_b))
#define min(_a, _b) (((_a) < (_b)) ? (_a) : (_b))
#define NDIS_EQUAL_UNICODE_STRING(s1, s2) (((s1)->Length == (s2)->Length) && \
RtlEqualMemory((s1)->Buffer, (s2)->Buffer, (s1)->Length))
#define NDIS_PARTIAL_MATCH_UNICODE_STRING(s1, s2) \
(((s1)->Length != (s2)->Length) && \
RtlEqualMemory((s1)->Buffer, (s2)->Buffer, min((s1)->Length, (s2)->Length)))
#define CHAR_TO_INT(_s, _b, _p) RtlCharToInteger(_s, _b, _p)
#define BAD_MINIPORT(_M, _S) DbgPrint(" ***NDIS*** : Miniport %Z - %s\n", (_M)->pAdapterInstanceName, _S)
#define REF_NDIS_DRIVER_OBJECT() ObfReferenceObject(ndisDriverObject)
#define DEREF_NDIS_DRIVER_OBJECT() ObfDereferenceObject(ndisDriverObject)