390 lines
20 KiB
C
390 lines
20 KiB
C
/*++
|
|
|
|
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)
|
|
|