Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

325 lines
10 KiB

4 years ago
  1. /*++
  2. Copyright (c) 1990-1995 Microsoft Corporation
  3. Module Name:
  4. ndisnt.h
  5. Abstract:
  6. Windows NT Specific macros
  7. Author:
  8. Environment:
  9. Kernel mode, FSD
  10. Revision History:
  11. Nov-95 Jameel Hyder Split up from a monolithic file
  12. --*/
  13. #define Increment(a,b) InterlockedIncrement(a)
  14. #define Decrement(a,b) InterlockedDecrement(a)
  15. #define CURRENT_THREAD ((LONG)PsGetCurrentThread())
  16. #define CopyMemory(Destination,Source,Length) RtlCopyMemory(Destination,Source,Length)
  17. #define MoveMemory(Destination,Source,Length) RtlMoveMemory(Destination,Source,Length)
  18. #define ZeroMemory(Destination,Length) RtlZeroMemory(Destination,Length)
  19. #define INITIALIZE_SPIN_LOCK(_L_) KeInitializeSpinLock(_L_)
  20. #define ACQUIRE_SPIN_LOCK(_SpinLock, _pOldIrql) ExAcquireSpinLock(_SpinLock, _pOldIrql)
  21. #define RELEASE_SPIN_LOCK(_SpinLock, _OldIrql) ExReleaseSpinLock(_SpinLock, _OldIrql)
  22. #define ACQUIRE_SPIN_LOCK_DPC(_SpinLock) \
  23. { \
  24. ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
  25. ExAcquireSpinLockAtDpcLevel(_SpinLock); \
  26. }
  27. #define RELEASE_SPIN_LOCK_DPC(_SpinLock) \
  28. { \
  29. ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
  30. ExReleaseSpinLockFromDpcLevel(_SpinLock); \
  31. }
  32. #define NDIS_ACQUIRE_SPIN_LOCK(_SpinLock, _pOldIrql) ExAcquireSpinLock(&(_SpinLock)->SpinLock, _pOldIrql)
  33. #define NDIS_RELEASE_SPIN_LOCK(_SpinLock, _OldIrql) ExReleaseSpinLock(&(_SpinLock)->SpinLock, _OldIrql)
  34. #define NDIS_ACQUIRE_SPIN_LOCK_DPC(_SpinLock) \
  35. { \
  36. ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
  37. ExAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock); \
  38. }
  39. #define NDIS_RELEASE_SPIN_LOCK_DPC(_SpinLock) \
  40. { \
  41. ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
  42. ExReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock); \
  43. }
  44. //
  45. // Debug versions for the miniport locks.
  46. //
  47. #if DBG && _DBG
  48. //
  49. // LOG macro for use at unknown IRQL.
  50. //
  51. #define DBG_LOG_LOCK(_M, _SpinLock, _Ident) \
  52. { \
  53. KIRQL _OldIrql; \
  54. IF_DBG(DBG_COMP_LOCKS, DBG_LEVEL_LOG) \
  55. { \
  56. ACQUIRE_SPIN_LOCK(&SL_LOCK(_M), &_OldIrql); \
  57. SL_HEAD(_M) = &SL_LOG(_M)[SL_CURRENT_ENTRY(_M)]; \
  58. SL_HEAD(_M)->Ident = (ULONG)(MODULE_NUMBER | __LINE__); \
  59. SL_HEAD(_M)->Function = (ULONG)(_Ident); \
  60. SL_HEAD(_M)->SpinLock = (ULONG)_SpinLock; \
  61. if (SL_CURRENT_ENTRY(_M)-- == 0) \
  62. SL_CURRENT_ENTRY(_M) = (LOG_SIZE - 1); \
  63. RELEASE_SPIN_LOCK(&SL_LOCK(_M), _OldIrql); \
  64. } \
  65. }
  66. //
  67. // LOG macro for use at DPC level.
  68. //
  69. #define DBG_LOG_LOCK_DPC(_M, _SpinLock, _Ident) \
  70. { \
  71. IF_DBG(DBG_COMP_LOCKS, DBG_LEVEL_LOG) \
  72. { \
  73. ACQUIRE_SPIN_LOCK_DPC(&SL_LOCK(_M)); \
  74. SL_HEAD(_M) = &SL_LOG(_M)[SL_CURRENT_ENTRY(_M)]; \
  75. SL_HEAD(_M)->Ident = (ULONG)(MODULE_NUMBER | __LINE__); \
  76. SL_HEAD(_M)->Function = (ULONG)(_Ident); \
  77. SL_HEAD(_M)->SpinLock = (ULONG)_SpinLock; \
  78. if (SL_CURRENT_ENTRY(_M)-- == 0) \
  79. SL_CURRENT_ENTRY(_M) = (LOG_SIZE - 1); \
  80. RELEASE_SPIN_LOCK_DPC(&SL_LOCK(_M)); \
  81. } \
  82. }
  83. // Miniport Lock macros
  84. //
  85. // Debug versions of these macros will log where
  86. // and by whom they were called.
  87. //
  88. #define DBG_LOG_LOCAL_LOCK(_M, _L, _Ident) \
  89. { \
  90. IF_DBG(DBG_COMP_LOCKS, DBG_LEVEL_LOG) \
  91. { \
  92. KIRQL lockOldIrql; \
  93. ACQUIRE_SPIN_LOCK(&LL_LOCK(_M), &lockOldIrql); \
  94. LL_HEAD(_M) = &LL_LOG(_M)[LL_CURRENT_ENTRY(_M)]; \
  95. LL_HEAD(_M)->Ident = (ULONG)(MODULE_NUMBER | __LINE__); \
  96. LL_HEAD(_M)->Function = (ULONG)(_Ident); \
  97. LL_HEAD(_M)->Status = (_L) ? 's' : 'f'; \
  98. if (LL_CURRENT_ENTRY(_M)-- == 0) \
  99. LL_CURRENT_ENTRY(_M) = (LOG_SIZE - 1); \
  100. RELEASE_SPIN_LOCK(&LL_LOCK(_M), lockOldIrql); \
  101. } \
  102. }
  103. #else
  104. #define DBG_LOG_LOCK(_M, _SpinLock, _Ident)
  105. #define DBG_LOG_LOCK_DPC(_M, _SpinLock, _Ident)
  106. #define DBG_LOG_LOCAL_LOCK(_M, _L, _Ident)
  107. #endif
  108. #define NDIS_ACQUIRE_COMMON_SPIN_LOCK(_M, _pS, _pIrql, _pT) \
  109. { \
  110. LONG _original; \
  111. \
  112. DBG_LOG_LOCK((_M), (_pS), 'a'); \
  113. \
  114. ExAcquireSpinLock(&(_pS)->SpinLock, _pIrql); \
  115. _original = InterlockedExchange((_pT), CURRENT_THREAD); \
  116. ASSERT(0 == _original); \
  117. }
  118. #define NDIS_RELEASE_COMMON_SPIN_LOCK(_M, _pS, _Irql, _pT) \
  119. { \
  120. DBG_LOG_LOCK((_M), (_pS), 'r'); \
  121. \
  122. InterlockedExchange((_pT), 0); \
  123. ExReleaseSpinLock(&(_pS)->SpinLock, _Irql); \
  124. }
  125. #define NDIS_ACQUIRE_COMMON_SPIN_LOCK_DPC(_M, _pS, _pT) \
  126. { \
  127. LONG _original; \
  128. ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
  129. \
  130. DBG_LOG_LOCK_DPC((_M), (_pS), 'a'); \
  131. \
  132. ExAcquireSpinLockAtDpcLevel(&(_pS)->SpinLock); \
  133. _original = InterlockedExchange((_pT), CURRENT_THREAD); \
  134. ASSERT(0 == _original); \
  135. }
  136. #define NDIS_RELEASE_COMMON_SPIN_LOCK_DPC(_M, _pS, _pT) \
  137. { \
  138. ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); \
  139. \
  140. DBG_LOG_LOCK_DPC((_M), (_pS), 'r'); \
  141. \
  142. InterlockedExchange((_pT), 0); \
  143. ExReleaseSpinLockFromDpcLevel(&(_pS)->SpinLock); \
  144. }
  145. #define NDIS_ACQUIRE_MINIPORT_SPIN_LOCK(_M, _pIrql) \
  146. NDIS_ACQUIRE_COMMON_SPIN_LOCK((_M), &(_M)->Lock, (_pIrql), &(_M)->MiniportThread)
  147. #define NDIS_ACQUIRE_SEND_SPIN_LOCK(_M, _pIrql) \
  148. NDIS_ACQUIRE_COMMON_SPIN_LOCK((_M), &(_M)->SendLock, (_pIrql), &(_M)->SendThread)
  149. #define NDIS_RELEASE_MINIPORT_SPIN_LOCK(_M, _Irql) \
  150. NDIS_RELEASE_COMMON_SPIN_LOCK((_M), &(_M)->Lock, (_Irql), &(_M)->MiniportThread)
  151. #define NDIS_RELEASE_SEND_SPIN_LOCK(_M, _Irql) \
  152. NDIS_RELEASE_COMMON_SPIN_LOCK((_M), &(_M)->SendLock, (_Irql), &(_M)->SendThread)
  153. #define NDIS_ACQUIRE_MINIPORT_SPIN_LOCK_DPC(_M) \
  154. NDIS_ACQUIRE_COMMON_SPIN_LOCK_DPC((_M), &(_M)->Lock, &(_M)->MiniportThread)
  155. #define NDIS_ACQUIRE_SEND_SPIN_LOCK_DPC(_M) \
  156. NDIS_ACQUIRE_COMMON_SPIN_LOCK_DPC((_M), &(_M)->SendLock, &(_M)->SendThread)
  157. #define NDIS_RELEASE_MINIPORT_SPIN_LOCK_DPC(_M) \
  158. NDIS_RELEASE_COMMON_SPIN_LOCK_DPC(_M, &(_M)->Lock, &(_M)->MiniportThread)
  159. #define NDIS_RELEASE_SEND_SPIN_LOCK_DPC(_M) \
  160. NDIS_RELEASE_COMMON_SPIN_LOCK_DPC(_M, &(_M)->SendLock, &(_M)->SendThread)
  161. #define LOCK_MINIPORT(_M, _L) \
  162. { \
  163. if ((_M)->LockAcquired) \
  164. { \
  165. (_L) = FALSE; \
  166. } \
  167. else \
  168. { \
  169. (_M)->LockAcquired = TRUE; \
  170. (_L) = TRUE; \
  171. } \
  172. \
  173. DBG_LOG_LOCAL_LOCK((_M), (_L), 'l'); \
  174. }
  175. #define UNLOCK_MINIPORT(_M, _L) \
  176. { \
  177. if (_L) \
  178. { \
  179. (_M)->LockAcquired = FALSE; \
  180. } \
  181. \
  182. DBG_LOG_LOCAL_LOCK((_M), (_L), 'u'); \
  183. }
  184. #define BLOCK_LOCK_MINIPORT(_M, _L) \
  185. { \
  186. KIRQL OldIrql; \
  187. \
  188. NDIS_ACQUIRE_MINIPORT_SPIN_LOCK(_M, &OldIrql); \
  189. LOCK_MINIPORT(_M, _L); \
  190. while (!_L) { \
  191. NDIS_RELEASE_MINIPORT_SPIN_LOCK(_M, OldIrql); \
  192. NDIS_ACQUIRE_MINIPORT_SPIN_LOCK(_M, &OldIrql); \
  193. LOCK_MINIPORT(_M, _L); \
  194. } \
  195. NDIS_RELEASE_MINIPORT_SPIN_LOCK(_M, OldIrql); \
  196. }
  197. #define BLOCK_LOCK_MINIPORT_DPC(_M, _L) \
  198. { \
  199. KIRQL OldIrql; \
  200. \
  201. NDIS_ACQUIRE_MINIPORT_SPIN_LOCK_DPC(_M); \
  202. LOCK_MINIPORT(_M, _L); \
  203. while (!_L) { \
  204. NDIS_RELEASE_MINIPORT_SPIN_LOCK_DPC(_M); \
  205. NDIS_ACQUIRE_MINIPORT_SPIN_LOCK_DPC(_M); \
  206. LOCK_MINIPORT(_M, _L); \
  207. } \
  208. NDIS_RELEASE_MINIPORT_SPIN_LOCK_DPC(_M); \
  209. }
  210. //
  211. // Some macros for platform independence
  212. //
  213. #if TRACK_MEMORY
  214. #define ALLOC_FROM_POOL(_Size_, _Tag_) AllocateM(_Size_, \
  215. MODULE_NUMBER | __LINE__, \
  216. _Tag_)
  217. #define FREE_POOL(_P_) FreeM(_P_)
  218. #else
  219. #define ALLOC_FROM_POOL(_Size_, _Tag_) ExAllocatePoolWithTag(NonPagedPool, \
  220. _Size_, \
  221. _Tag_)
  222. #define FREE_POOL(_P_) ExFreePool(_P_)
  223. #endif
  224. #define INITIALIZE_WORK_ITEM(_W, _R, _C) ExInitializeWorkItem(_W, _R, _C)
  225. #define QUEUE_WORK_ITEM(_W, _Q) ExQueueWorkItem(_W, _Q)
  226. #define CURRENT_IRQL KeGetCurrentIrql()
  227. #define RAISE_IRQL_TO_DISPATCH(_pIrql_) KeRaiseIrql(DISPATCH_LEVEL, _pIrql_)
  228. #define LOWER_IRQL(_Irql_) KeLowerIrql(_Irql_)
  229. #define INITIALIZE_TIMER(_Timer_) KeInitializeTimer(_Timer_)
  230. #define INITIALIZE_TIMER_EX(_Timer_,_Type_) KeInitializeTimerEx(_Timer_, _Type_)
  231. #define CANCEL_TIMER(_Timer_) KeCancelTimer(_Timer_)
  232. #define SET_TIMER(_Timer_, _Time_, _Dpc_) KeSetTimer(_Timer_, _Time_, _Dpc_)
  233. #define SET_PERIODIC_TIMER(_Timer_, _DueTime_, _PeriodicTime_, _Dpc_) \
  234. KeSetTimerEx(_Timer_, _DueTime_, _PeriodicTime_, _Dpc_)
  235. #define INITIALIZE_EVENT(_pEvent_) KeInitializeEvent(_pEvent_, NotificationEvent, FALSE)
  236. #define SET_EVENT(_pEvent_) KeSetEvent(_pEvent_, 0, FALSE)
  237. #define RESET_EVENT(_pEvent_) KeResetEvent(_pEvent_)
  238. #define INITIALIZE_MUTEX(_M_) KeInitializeMutex(_M_, 0xFFFF)
  239. #define RELEASE_MUTEX(_M_) KeReleaseMutex(_M_, FALSE)
  240. #define WAIT_FOR_OBJECT(_O_, _TO_) KeWaitForSingleObject(_O_, \
  241. Executive, \
  242. KernelMode, \
  243. TRUE, \
  244. _TO_) \
  245. #define QUEUE_DPC(_pDpc_) KeInsertQueueDpc(_pDpc_, NULL, NULL)
  246. #define INITIALIZE_DPC(_pDpc_, _R_, _C_) KeInitializeDpc(_pDpc_, _R_, _C_)
  247. #define SET_DPC_IMPORTANCE(_pDpc_) KeSetImportanceDpc(_pDpc_, LowImportance)
  248. #define SET_PROCESSOR_DPC(_pDpc_, _R_) if (!ndisSkipProcessorAffinity) \
  249. KeSetTargetProcessorDpc(_pDpc_, _R_)
  250. #define SYNC_WITH_ISR(_O_, _F_, _C_) KeSynchronizeExecution(_O_, \
  251. (PKSYNCHRONIZE_ROUTINE)(_F_), \
  252. _C_)
  253. #define MDL_ADDRESS(_MDL_) MmGetSystemAddressForMdl(_MDL_)
  254. #define MDL_SIZE(_MDL_) MmGetMdlByteCount(_MDL_)
  255. #define MDL_OFFSET(_MDL_) MmGetMdlByteOffset(_MDL_)
  256. #define MDL_VA(_MDL_) MmGetMdlVirtualAddress(_MDL_)
  257. #define NDIS_EQUAL_UNICODE_STRING(s1, s2) (((s1)->Length == (s2)->Length) && \
  258. RtlEqualMemory((s1)->Buffer, (s2)->Buffer, (s1)->Length))
  259. #define CHAR_TO_INT(_s, _b, _p) RtlCharToInteger(_s, _b, _p)