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.

473 lines
9.8 KiB

4 years ago
  1. #include <ntddk.h>
  2. #include <ndismain.h>
  3. #include <ndismac.h>
  4. #include <ndismini.h>
  5. #if defined(BUILD_FOR_3_5) || defined(BUILD_FOR_3_1)
  6. #define Increment(a,b) ExInterlockedIncrementLong(a,b)
  7. #define Decrement(a,b) ExInterlockedDecrementLong(a,b)
  8. #else
  9. #define Increment(a,b) InterlockedIncrement(a)
  10. #define Decrement(a,b) InterlockedDecrement(a)
  11. #endif
  12. #if defined(BUILD_FOR_3_1)
  13. #define FASTCALL
  14. #define MmLockPagableImageSection(a) NULL
  15. #define MmUnlockPagableImageSection(a)
  16. #define COMPUTE_PAGES_SPANNED(Va, Size) \
  17. ((((ULONG)Va & (PAGE_SIZE -1)) + (Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)
  18. #define Int32x32To64(a,b) RtlEnlargedIntegerMultiply((a),(b)).QuadPart
  19. #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool((a),(b))
  20. NTSTATUS
  21. NTAPI
  22. RtlCharToInteger (
  23. PCSZ String,
  24. ULONG Base,
  25. PULONG Value
  26. );
  27. #endif
  28. #if defined(BUILD_FOR_3_5)
  29. #define MmLockPagableCodeSection(x) MmLockPagableImageSection(x)
  30. #endif
  31. #define ACQUIRE_SPIN_LOCK(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql)
  32. #define RELEASE_SPIN_LOCK(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock, (_SpinLock)->OldIrql)
  33. #define ACQUIRE_SPIN_LOCK_DPC(_SpinLock) KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock)
  34. #define RELEASE_SPIN_LOCK_DPC(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock)
  35. #if DBG
  36. #define NDISDBG 0
  37. #endif
  38. #if !defined(NDISDBG)
  39. #define NDISDBG 0
  40. #endif
  41. #if NDISDBG
  42. #if defined(MEMPRINT)
  43. #include "memprint.h" //DavidTr's memprint program at ntos\srv
  44. #endif // MEMPRINT
  45. extern int NdisMsgLevel;
  46. extern BOOLEAN NdisChkErrorFlag;
  47. #define TRACE_NONE 0x0000
  48. #define TRACE_IMPT 0x0001
  49. #define TRACE_ALL 0x0002
  50. #define IF_TRACE(level) if ( NdisMsgLevel >= (level) ) //for tracing
  51. #define IF_ERROR_CHK if (NdisChkErrorFlag) // for parameter checking
  52. #define DbgIsNonPaged(_Address) \
  53. ( MmIsNonPagedSystemAddressValid((PVOID)(_Address)) )
  54. #define DbgIsPacket(_Packet) \
  55. ( ((_Packet)->Private.Pool->PacketLength) > sizeof(_Packet) )
  56. #define DbgIsNull(_Ptr) ( ((PVOID)(_Ptr)) == NULL )
  57. #define NdisPrint1(fmt) DbgPrint(fmt)
  58. #define NdisPrint2(fmt,v1) DbgPrint(fmt,v1)
  59. #define NdisPrint3(fmt,v1,v2) DbgPrint(fmt,v1,v2)
  60. #define NdisPrint4(fmt,v1,v2,v3) DbgPrint(fmt,v1,v2,v3)
  61. #define NdisPrint5(fmt,v1,v2,v3,v4) DbgPrint(fmt,v1,v2,v3,v4)
  62. #else // NDISDBG
  63. #define IF_TRACE(level) if (FALSE)
  64. #define IF_ERROR_CHK if (FALSE)
  65. #define DbgIsNonPaged(_Address) TRUE
  66. #define DbgIsPacket(_Packet) TRUE
  67. #define DbgIsNull(_Ptr) FALSE
  68. #define NdisPrint1(fmt)
  69. #define NdisPrint2(fmt,v1)
  70. #define NdisPrint3(fmt,v1,v2)
  71. #define NdisPrint4(fmt,v1,v2,v3)
  72. #define NdisPrint5(fmt,v1,v2,v3,v4)
  73. #endif // NDISDBG
  74. #if DBG
  75. #define MINIPORT_AT_DPC_LEVEL (KeGetCurrentIrql() == DISPATCH_LEVEL)
  76. #else
  77. #define MINIPORT_AT_DPC_LEVEL 1
  78. #endif
  79. //
  80. // This is the number of extra OIDs that ARCnet with Ethernet encapsulation
  81. // supports.
  82. //
  83. #define ARC_NUMBER_OF_EXTRA_OIDS 2
  84. //
  85. // Internal wrapper data structures.
  86. //
  87. //
  88. // NDIS_WRAPPER_CONTEXT
  89. //
  90. // This data structure contains internal data items for use by the wrapper.
  91. //
  92. typedef struct _NDIS_WRAPPER_CONTEXT {
  93. //
  94. // Mac/miniport defined shutdown context.
  95. //
  96. PVOID ShutdownContext;
  97. //
  98. // Mac/miniport registered shutdown handler.
  99. //
  100. ADAPTER_SHUTDOWN_HANDLER ShutdownHandler;
  101. #if !defined(BUILD_FOR_3_1)
  102. //
  103. // Kernel bugcheck record for bugcheck handling.
  104. //
  105. KBUGCHECK_CALLBACK_RECORD BugcheckCallbackRecord;
  106. #endif
  107. //
  108. // Miniport assigned resources for PCI, PCMCIA, EISA, etc.
  109. //
  110. PCM_RESOURCE_LIST AssignedSlotResources;
  111. //
  112. // HAL common buffer cache.
  113. //
  114. PVOID SharedMemoryPage[2];
  115. ULONG SharedMemoryLeft[2];
  116. NDIS_PHYSICAL_ADDRESS SharedMemoryAddress[2];
  117. } NDIS_WRAPPER_CONTEXT, *PNDIS_WRAPPER_CONTEXT;
  118. //
  119. // Lock/unlock miniport macros.
  120. //
  121. #define LOCK_MINIPORT(_M_, _L) \
  122. { \
  123. if (_M_->LockAcquired) { \
  124. _L = FALSE; \
  125. } else { \
  126. _L = TRUE; \
  127. _M_->LockAcquired = TRUE; \
  128. } \
  129. }
  130. #define UNLOCK_MINIPORT(_M_, _L) \
  131. { \
  132. if (_L) { \
  133. _M_->LockAcquired = FALSE; \
  134. } \
  135. }
  136. NDIS_STATUS
  137. NdisInitialInit(
  138. PDRIVER_OBJECT Driver OPTIONAL
  139. );
  140. VOID
  141. FASTCALL
  142. MiniportProcessDeferred(
  143. PNDIS_MINIPORT_BLOCK Miniport
  144. );
  145. NDIS_STATUS
  146. NdisMTransferDataSync(
  147. IN NDIS_HANDLE NdisBindingHandle,
  148. IN NDIS_HANDLE MacReceiveContext,
  149. IN UINT ByteOffset,
  150. IN UINT BytesToTransfer,
  151. IN OUT PNDIS_PACKET Packet,
  152. OUT PUINT BytesTransferred
  153. );
  154. #define MINIPORT_DISABLE_INTERRUPT(_M_) \
  155. { \
  156. ASSERT(_M_->DriverHandle->MiniportCharacteristics.DisableInterruptHandler != NULL); \
  157. (_M_->DriverHandle->MiniportCharacteristics.DisableInterruptHandler)( \
  158. _M_->MiniportAdapterContext \
  159. ); \
  160. }
  161. #define MINIPORT_SYNC_DISABLE_INTERRUPT(_M_) \
  162. { \
  163. if (_M_->DriverHandle->MiniportCharacteristics.DisableInterruptHandler != NULL) { \
  164. KeSynchronizeExecution( \
  165. (_M_)->Interrupt->InterruptObject, \
  166. (PKSYNCHRONIZE_ROUTINE)(_M_->DriverHandle->MiniportCharacteristics.DisableInterruptHandler),\
  167. _M_->MiniportAdapterContext \
  168. ); \
  169. } \
  170. }
  171. #define CHECK_FOR_NORMAL_INTERRUPTS(_Miniport) \
  172. _Miniport->NormalInterrupts = (BOOLEAN)(!_Miniport->HaltingMiniport && \
  173. !_Miniport->InInitialize && \
  174. (_Miniport->Interrupt != NULL) && \
  175. !_Miniport->Interrupt->IsrRequested && \
  176. !_Miniport->Interrupt->SharedInterrupt)
  177. //
  178. // general reference/dereference functions
  179. //
  180. BOOLEAN
  181. NdisReferenceRef(
  182. IN PREFERENCE RefP
  183. );
  184. BOOLEAN
  185. NdisDereferenceRef(
  186. PREFERENCE RefP
  187. );
  188. VOID
  189. NdisInitializeRef(
  190. PREFERENCE RefP
  191. );
  192. BOOLEAN
  193. NdisCloseRef(
  194. PREFERENCE RefP
  195. );
  196. /*++
  197. BOOLEAN
  198. NdisReferenceProtocol(
  199. IN PNDIS_PROTOCOL_BLOCK ProtP
  200. );
  201. --*/
  202. #define NdisReferenceProtocol(ProtP) \
  203. NdisReferenceRef(&(ProtP)->Ref)
  204. BOOLEAN
  205. QueueOpenOnProtocol(
  206. IN PNDIS_OPEN_BLOCK OpenP,
  207. IN PNDIS_PROTOCOL_BLOCK ProtP
  208. );
  209. /*++
  210. VOID
  211. NdisDereferenceProtocol(
  212. PNDIS_PROTOCOL_BLOCK ProtP
  213. );
  214. --*/
  215. #define NdisDereferenceProtocol(ProtP) { \
  216. if (NdisDereferenceRef(&(ProtP)->Ref)) { \
  217. ExFreePool((PVOID)(ProtP)); \
  218. } \
  219. }
  220. VOID
  221. NdisDeQueueOpenOnProtocol(
  222. PNDIS_OPEN_BLOCK OpenP,
  223. PNDIS_PROTOCOL_BLOCK ProtP
  224. );
  225. BOOLEAN
  226. NdisFinishOpen(
  227. PNDIS_OPEN_BLOCK OpenP
  228. );
  229. VOID
  230. NdisKillOpenAndNotifyProtocol(
  231. PNDIS_OPEN_BLOCK OldOpenP
  232. );
  233. BOOLEAN
  234. NdisKillOpen(
  235. PNDIS_OPEN_BLOCK OldOpenP
  236. );
  237. /*++
  238. BOOLEAN
  239. NdisReferenceMac(
  240. IN PNDIS_MAC_BLOCK MacP
  241. );
  242. --*/
  243. #define NdisReferenceMac(MacP) \
  244. NdisReferenceRef(&(MacP)->Ref)
  245. static
  246. VOID
  247. NdisDereferenceMac(
  248. PNDIS_MAC_BLOCK MacP
  249. );
  250. BOOLEAN
  251. NdisQueueAdapterOnMac(
  252. PNDIS_ADAPTER_BLOCK AdaptP,
  253. PNDIS_MAC_BLOCK MacP
  254. );
  255. VOID
  256. NdisDeQueueAdapterOnMac(
  257. PNDIS_ADAPTER_BLOCK AdaptP,
  258. PNDIS_MAC_BLOCK MacP
  259. );
  260. /*++
  261. BOOLEAN
  262. NdisReferenceAdapter(
  263. IN PNDIS_ADAPTER_BLOCK AdaptP
  264. );
  265. --*/
  266. #define NdisReferenceAdapter(AdaptP) \
  267. NdisReferenceRef(&(AdaptP)->Ref)
  268. BOOLEAN
  269. NdisQueueOpenOnAdapter(
  270. PNDIS_OPEN_BLOCK OpenP,
  271. PNDIS_ADAPTER_BLOCK AdaptP
  272. );
  273. VOID
  274. NdisKillAdapter(
  275. PNDIS_ADAPTER_BLOCK OldAdaptP
  276. );
  277. VOID
  278. NdisDereferenceAdapter(
  279. PNDIS_ADAPTER_BLOCK AdaptP
  280. );
  281. VOID
  282. NdisDeQueueOpenOnAdapter(
  283. PNDIS_OPEN_BLOCK OpenP,
  284. PNDIS_ADAPTER_BLOCK AdaptP
  285. );
  286. NDIS_STATUS
  287. NdisCallDriverAddAdapter(
  288. IN PNDIS_MAC_BLOCK NewMacP
  289. );
  290. /*++
  291. BOOLEAN
  292. NdisReferenceDriver(
  293. IN PNDIS_M_DRIVER_BLOCK DriverP
  294. );
  295. --*/
  296. #define NdisReferenceDriver(DriverP) \
  297. NdisReferenceRef(&(DriverP)->Ref)
  298. VOID
  299. NdisDereferenceDriver(
  300. PNDIS_M_DRIVER_BLOCK DriverP
  301. );
  302. BOOLEAN
  303. NdisQueueMiniportOnDriver(
  304. PNDIS_MINIPORT_BLOCK MiniportP,
  305. PNDIS_M_DRIVER_BLOCK DriverP
  306. );
  307. VOID
  308. NdisDequeueMiniportOnDriver(
  309. PNDIS_MINIPORT_BLOCK MiniportP,
  310. PNDIS_M_DRIVER_BLOCK DriverP
  311. );
  312. BOOLEAN
  313. NdisQueueOpenOnMiniport(
  314. PNDIS_M_OPEN_BLOCK OpenP,
  315. PNDIS_MINIPORT_BLOCK MiniportP
  316. );
  317. VOID
  318. NdisKillMiniport(
  319. PNDIS_MINIPORT_BLOCK OldMiniportP
  320. );
  321. /*++
  322. BOOLEAN
  323. NdisReferenceMiniport(
  324. IN PNDIS_MINIPORT_BLOCK MiniportP
  325. );
  326. --*/
  327. #define NdisReferenceMiniport(MiniportP) \
  328. NdisReferenceRef(&(MiniportP)->Ref)
  329. VOID
  330. NdisDereferenceMiniport(
  331. PNDIS_MINIPORT_BLOCK MiniportP
  332. );
  333. VOID
  334. NdisDeQueueOpenOnMiniport(
  335. PNDIS_M_OPEN_BLOCK OpenP,
  336. PNDIS_MINIPORT_BLOCK MiniportP
  337. );
  338. VOID
  339. MiniportInitializePackage(
  340. VOID
  341. );
  342. VOID
  343. MiniportReferencePackage(
  344. VOID
  345. );
  346. VOID
  347. MiniportDereferencePackage(
  348. VOID
  349. );
  350. NDIS_STATUS ArcConvertOidListToEthernet(
  351. IN PNDIS_OID pOidList,
  352. IN PULONG pcbOidList,
  353. IN PNDIS_OID pTmpBuffer
  354. );
  355. VOID
  356. NdisBugcheckHandler(
  357. IN PNDIS_WRAPPER_CONTEXT WrapperContext,
  358. IN ULONG Size
  359. );