Leaked source code of windows server 2003
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.

251 lines
7.2 KiB

  1. /*++
  2. Copyright (c) 1990-1995 Microsoft Corporation
  3. Module Name:
  4. data.c
  5. Abstract:
  6. NDIS wrapper Data
  7. Author:
  8. 01-Jun-1995 JameelH Re-organization
  9. Environment:
  10. Kernel mode, FSD
  11. Revision History:
  12. 10-July-1995 KyleB Added spinlock logging debug code.
  13. --*/
  14. #include <precomp.h>
  15. #pragma hdrstop
  16. //
  17. // Define the module number for debug code.
  18. //
  19. #define MODULE_NUMBER MODULE_DATA
  20. UCHAR ndisValidProcessors[NDIS_MAX_CPU_COUNT] = { 0 };
  21. UCHAR ndisMaximumProcessor = 0;
  22. UCHAR ndisCurrentProcessor = 0;
  23. UCHAR ndisNumberOfProcessors = 0;
  24. BOOLEAN ndisSkipProcessorAffinity = FALSE;
  25. const NDIS_PHYSICAL_ADDRESS HighestAcceptableMax = NDIS_PHYSICAL_ADDRESS_CONST(-1,-1);
  26. KSPIN_LOCK ndisGlobalLock;
  27. PNDIS_M_DRIVER_BLOCK ndisMiniDriverList = NULL;
  28. PNDIS_PROTOCOL_BLOCK ndisProtocolList = NULL;
  29. PNDIS_MINIPORT_BLOCK ndisMiniportList = NULL;
  30. PNDIS_OPEN_BLOCK ndisGlobalOpenList = NULL;
  31. LIST_ENTRY ndisGlobalPacketPoolList = {0};
  32. TDI_REGISTER_CALLBACK ndisTdiRegisterCallback = NULL;
  33. TDI_PNP_HANDLER ndisTdiPnPHandler = NULL;
  34. ULONG ndisDmaAlignment = 0;
  35. ULONG ndisTimeIncrement = 0;
  36. ERESOURCE SharedMemoryResource = {0};
  37. HANDLE ndisSystemProcess = {0};
  38. PDEVICE_OBJECT ndisDeviceObject = NULL;
  39. PDRIVER_OBJECT ndisDriverObject = NULL;
  40. PETHREAD ndisThreadObject = NULL;
  41. NDIS_STATUS ndisLastFailedInitErrorCode = NDIS_STATUS_SUCCESS;
  42. NDIS_STRING ndisDeviceStr = NDIS_STRING_CONST("\\DEVICE\\");
  43. // NDIS_STRING ndisDosDevicesStr = NDIS_STRING_CONST("\\DOSDEVICES\\");
  44. NDIS_STRING ndisDosDevicesStr = NDIS_STRING_CONST("\\GLOBAL??\\");
  45. #if NDIS_NO_REGISTRY
  46. PWSTR ndisDefaultExportName = NDIS_DEFAULT_EXPORT_NAME;
  47. #endif
  48. ULONG ndisVerifierLevel = 0;
  49. ULONG ndisVeriferFailedAllocations = 0;
  50. PCALLBACK_OBJECT ndisPowerStateCallbackObject = NULL;
  51. PVOID ndisPowerStateCallbackHandle = NULL;
  52. ULONG ndisAcOnLine = 1;
  53. LONG ndisCancelId = 0;
  54. BOOLEAN VerifierSystemSufficientlyBooted = FALSE;
  55. BOOLEAN ndisGuidsSecured = FALSE;
  56. KQUEUE ndisWorkerQueue = {0};
  57. #if NDIS_UNLOAD
  58. WORK_QUEUE_ITEM ndisPoisonPill = {0};
  59. #endif
  60. LARGE_INTEGER PoolAgingTicks = {0};
  61. PKG_REF ndisPkgs[MAX_PKG] =
  62. {
  63. { 0, FALSE, (PVOID)NdisSend, NULL},
  64. { 0, FALSE, (PVOID)ndisMIsr, NULL},
  65. { 0, FALSE, (PVOID)ndisDispatchRequest, NULL},
  66. { 0, FALSE, (PVOID)NdisCoSendPackets, NULL},
  67. { 0, FALSE, (PVOID)EthFilterDprIndicateReceive, NULL},
  68. { 0, FALSE, (PVOID)FddiFilterDprIndicateReceive, NULL},
  69. { 0, FALSE, (PVOID)TrFilterDprIndicateReceive, NULL},
  70. #if ARCNET
  71. { 0, FALSE, (PVOID)ArcFilterDprIndicateReceive, NULL}
  72. #endif
  73. };
  74. LONG ndisFlags = 0;
  75. LARGE_INTEGER KeBootTime = {0, 0};
  76. #if DBG
  77. ULONG ndisDebugSystems = 0;
  78. LONG ndisDebugLevel = DBG_LEVEL_FATAL;
  79. ULONG ndisDebugBreakPoint = 0;
  80. ULONG MiniportDebug = 0; // MINIPORT_DEBUG_LOUD;
  81. #endif
  82. #if TRACK_MEMORY
  83. KSPIN_LOCK ALock = 0;
  84. #define MAX_PTR_COUNT 2048
  85. struct _MemPtr
  86. {
  87. PVOID Ptr;
  88. ULONG Size;
  89. ULONG ModLine;
  90. ULONG Tag;
  91. } ndisMemPtrs[MAX_PTR_COUNT] = { 0 };
  92. PVOID
  93. AllocateM(
  94. IN UINT Size,
  95. IN ULONG ModLine,
  96. IN ULONG Tag
  97. )
  98. {
  99. PVOID p;
  100. p = ExAllocatePoolWithTag(NonPagedPool, Size, Tag);
  101. if (p != NULL)
  102. {
  103. KIRQL OldIrql;
  104. UINT i;
  105. ACQUIRE_SPIN_LOCK(&ALock, &OldIrql);
  106. for (i = 0; i < MAX_PTR_COUNT; i++)
  107. {
  108. if (ndisMemPtrs[i].Ptr == NULL)
  109. {
  110. ndisMemPtrs[i].Ptr = p;
  111. ndisMemPtrs[i].Size = Size;
  112. ndisMemPtrs[i].ModLine = ModLine;
  113. ndisMemPtrs[i].Tag = Tag;
  114. break;
  115. }
  116. }
  117. RELEASE_SPIN_LOCK(&ALock, OldIrql);
  118. }
  119. return(p);
  120. }
  121. VOID
  122. FreeM(
  123. IN PVOID MemPtr
  124. )
  125. {
  126. KIRQL OldIrql;
  127. UINT i;
  128. ACQUIRE_SPIN_LOCK(&ALock, &OldIrql);
  129. for (i = 0; i < MAX_PTR_COUNT; i++)
  130. {
  131. if (ndisMemPtrs[i].Ptr == MemPtr)
  132. {
  133. ndisMemPtrs[i].Ptr = NULL;
  134. ndisMemPtrs[i].Size = 0;
  135. ndisMemPtrs[i].ModLine = 0;
  136. ndisMemPtrs[i].Tag = 0;
  137. }
  138. }
  139. RELEASE_SPIN_LOCK(&ALock, OldIrql);
  140. ExFreePool(MemPtr);
  141. }
  142. #endif
  143. #ifdef TRACK_MOPEN_REFCOUNTS
  144. USHORT ndisLogfileIndex = 0;
  145. ULONG_PTR ndisLogfile[NDIS_LOGFILE_SIZE];
  146. #endif //TRACK_MOPEN_REFCOUNTS
  147. #ifdef TRACK_MINIPORT_REFCOUNTS
  148. USHORT ndisMiniportLogfileIndex = 0;
  149. ULONG_PTR ndisMiniportLogfile[NDIS_MINIPORT_LOGFILE_SIZE];
  150. #endif //TRACK_MINIPORT_REFCOUNTS
  151. #if TRACK_RECEIVED_PACKETS
  152. USHORT ndisRcvLogfileIndex = 0;
  153. ULONG_PTR ndisRcvLogfile[NDIS_RCV_LOGFILE_SIZE];
  154. #endif
  155. KSPIN_LOCK ndisProtocolListLock;
  156. KSPIN_LOCK ndisMiniDriverListLock;
  157. KSPIN_LOCK ndisMiniportListLock;
  158. KSPIN_LOCK ndisGlobalPacketPoolListLock;
  159. KSPIN_LOCK ndisGlobalOpenListLock;
  160. NDIS_STRING ndisBuildDate = {0, 0, NULL};
  161. NDIS_STRING ndisBuildTime = {0, 0, NULL};
  162. NDIS_STRING ndisBuiltBy = {0, 0, NULL};
  163. KMUTEX ndisPnPMutex;
  164. ULONG ndisPnPMutexOwner = 0;
  165. #if DBG
  166. ULONG ndisChecked = 1;
  167. #else
  168. ULONG ndisChecked = 0;
  169. #endif
  170. PNDIS_MINIPORT_BLOCK ndisMiniportTrackAlloc = NULL;
  171. LIST_ENTRY ndisMiniportTrackAllocList;
  172. PNDIS_M_DRIVER_BLOCK ndisDriverTrackAlloc = NULL;
  173. LIST_ENTRY ndisDriverTrackAllocList;
  174. KSPIN_LOCK ndisTrackMemLock;
  175. PCALLBACK_OBJECT ndisBindUnbindCallbackObject = NULL;
  176. PVOID ndisBindUnbindCallbackRegisterationHandle = NULL;
  177. LUID SeWmiAccessPrivilege = {SE_LOAD_DRIVER_PRIVILEGE, 0};
  178. #if NDIS_LOG_ABORTED_REQUESTS
  179. NDIS_REQUEST ndisAbortedRequests[16];
  180. ULONG ndisAbortedRequestsIndex = 0;
  181. #endif
  182. volatile ULONG ndisSpin = 0;
  183. PSECURITY_DESCRIPTOR ndisSecurityDescriptor = NULL;
  184. WORK_QUEUE_ITEM LastWorkerThreadWI = {0} ;
  185. CHAR AllUsersReadSecurityDescriptor[SECURITY_DESCRIPTOR_MIN_LENGTH];
  186. CHAR AllUsersWriteSecurityDescriptor[SECURITY_DESCRIPTOR_MIN_LENGTH];
  187. CHAR AllUsersReadWriteSecurityDescriptor[SECURITY_DESCRIPTOR_MIN_LENGTH];
  188. CHAR AllUsersNotificationSecurityDescriptor[SECURITY_DESCRIPTOR_MIN_LENGTH];
  189. CHAR AdminsSecurityDescriptor[SECURITY_DESCRIPTOR_MIN_LENGTH];
  190. PACL AllUsersAclRead = NULL;
  191. PACL AllUsersAclWrite = NULL;
  192. PACL AllUsersAclReadWrite = NULL;
  193. PACL AllUsersAclNotification = NULL;
  194. PACL AdminsAcl = NULL;