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.

349 lines
9.5 KiB

4 years ago
  1. /*++
  2. Copyright (c) 1989 Microsoft Corporation
  3. Module Name:
  4. afddata.c
  5. Abstract:
  6. This module contains global data for AFD.
  7. Author:
  8. David Treadwell (davidtr) 21-Feb-1992
  9. Revision History:
  10. --*/
  11. #include "afdp.h"
  12. #ifdef ALLOC_PRAGMA
  13. #pragma alloc_text( INIT, AfdInitializeData )
  14. #endif
  15. PDEVICE_OBJECT AfdDeviceObject;
  16. KSPIN_LOCK AfdSpinLock;
  17. PERESOURCE AfdResource;
  18. LIST_ENTRY AfdEndpointListHead;
  19. LIST_ENTRY AfdDisconnectListHead;
  20. LIST_ENTRY AfdPollListHead;
  21. LIST_ENTRY AfdTransportInfoListHead;
  22. LIST_ENTRY AfdConstrainedEndpointListHead;
  23. PKPROCESS AfdSystemProcess;
  24. //
  25. // Global lookaside lists. These must always be in nonpaged pool,
  26. // even when the driver is paged out.
  27. //
  28. PAFD_LOOKASIDE_LISTS AfdLookasideLists;
  29. //
  30. // Globals for dealing with AFD's executive worker thread.
  31. //
  32. KSPIN_LOCK AfdWorkQueueSpinLock;
  33. LIST_ENTRY AfdWorkQueueListHead;
  34. BOOLEAN AfdWorkThreadRunning = FALSE;
  35. WORK_QUEUE_ITEM AfdWorkQueueItem;
  36. //
  37. // Globals to track the buffers used by AFD.
  38. //
  39. ULONG AfdLargeBufferListDepth;
  40. ULONG AfdMediumBufferListDepth;
  41. ULONG AfdSmallBufferListDepth;
  42. CLONG AfdLargeBufferSize; // default == AfdBufferLengthForOnePage
  43. CLONG AfdMediumBufferSize = AFD_DEFAULT_MEDIUM_BUFFER_SIZE;
  44. CLONG AfdSmallBufferSize = AFD_DEFAULT_SMALL_BUFFER_SIZE;
  45. ULONG AfdCacheLineSize;
  46. CLONG AfdBufferLengthForOnePage;
  47. //
  48. // Globals for tuning TransmitFile().
  49. //
  50. LIST_ENTRY AfdQueuedTransmitFileListHead;
  51. ULONG AfdActiveTransmitFileCount;
  52. ULONG AfdMaxActiveTransmitFileCount;
  53. //
  54. // Various pieces of configuration information, with default values.
  55. //
  56. CLONG AfdStandardAddressLength = AFD_DEFAULT_STD_ADDRESS_LENGTH;
  57. CCHAR AfdIrpStackSize = AFD_DEFAULT_IRP_STACK_SIZE;
  58. CCHAR AfdPriorityBoost = AFD_DEFAULT_PRIORITY_BOOST;
  59. ULONG AfdFastSendDatagramThreshold = AFD_FAST_SEND_DATAGRAM_THRESHOLD;
  60. CLONG AfdReceiveWindowSize;
  61. CLONG AfdSendWindowSize;
  62. CLONG AfdBufferMultiplier = AFD_DEFAULT_BUFFER_MULTIPLIER;
  63. CLONG AfdTransmitIoLength;
  64. CLONG AfdMaxFastTransmit = AFD_DEFAULT_MAX_FAST_TRANSMIT;
  65. CLONG AfdMaxFastCopyTransmit = AFD_DEFAULT_MAX_FAST_COPY_TRANSMIT;
  66. ULONG AfdEndpointsOpened = 0;
  67. ULONG AfdEndpointsCleanedUp = 0;
  68. ULONG AfdEndpointsClosed = 0;
  69. BOOLEAN AfdIgnorePushBitOnReceives = FALSE;
  70. BOOLEAN AfdEnableDynamicBacklog = AFD_DEFAULT_ENABLE_DYNAMIC_BACKLOG;
  71. LONG AfdMinimumDynamicBacklog = AFD_DEFAULT_MINIMUM_DYNAMIC_BACKLOG;
  72. LONG AfdMaximumDynamicBacklog = AFD_DEFAULT_MAXIMUM_DYNAMIC_BACKLOG;
  73. LONG AfdDynamicBacklogGrowthDelta = AFD_DEFAULT_DYNAMIC_BACKLOG_GROWTH_DELTA;
  74. BOOLEAN AfdDisableRawSecurity = FALSE;
  75. //
  76. // Global which holds AFD's discardable code handle, and a BOOLEAN
  77. // that tells whether AFD is loaded.
  78. //
  79. PVOID AfdDiscardableCodeHandle;
  80. BOOLEAN AfdLoaded = FALSE;
  81. FAST_IO_DISPATCH AfdFastIoDispatch =
  82. {
  83. 11, // SizeOfFastIoDispatch
  84. NULL, // FastIoCheckIfPossible
  85. AfdFastIoRead, // FastIoRead
  86. AfdFastIoWrite, // FastIoWrite
  87. NULL, // FastIoQueryBasicInfo
  88. NULL, // FastIoQueryStandardInfo
  89. NULL, // FastIoLock
  90. NULL, // FastIoUnlockSingle
  91. NULL, // FastIoUnlockAll
  92. NULL, // FastIoUnlockAllByKey
  93. AfdFastIoDeviceControl // FastIoDeviceControl
  94. };
  95. #if DBG
  96. ULONG AfdDebug = 0;
  97. ULONG AfdLocksAcquired = 0;
  98. BOOLEAN AfdUsePrivateAssert = FALSE;
  99. #endif
  100. //
  101. // Some counters used for monitoring performance. These are not enabled
  102. // in the normal build.
  103. //
  104. #if AFD_PERF_DBG
  105. CLONG AfdFullReceiveIndications = 0;
  106. CLONG AfdPartialReceiveIndications = 0;
  107. CLONG AfdFullReceiveDatagramIndications = 0;
  108. CLONG AfdPartialReceiveDatagramIndications = 0;
  109. CLONG AfdFastPollsSucceeded = 0;
  110. CLONG AfdFastPollsFailed = 0;
  111. CLONG AfdFastSendsSucceeded = 0;
  112. CLONG AfdFastSendsFailed = 0;
  113. CLONG AfdFastReceivesSucceeded = 0;
  114. CLONG AfdFastReceivesFailed = 0;
  115. CLONG AfdFastSendDatagramsSucceeded = 0;
  116. CLONG AfdFastSendDatagramsFailed = 0;
  117. CLONG AfdFastReceiveDatagramsSucceeded = 0;
  118. CLONG AfdFastReceiveDatagramsFailed = 0;
  119. BOOLEAN AfdDisableFastIo = FALSE;
  120. BOOLEAN AfdDisableConnectionReuse = FALSE;
  121. #endif // AFD_PERF_DBG
  122. #if AFD_KEEP_STATS
  123. AFD_QUOTA_STATS AfdQuotaStats;
  124. AFD_HANDLE_STATS AfdHandleStats;
  125. AFD_QUEUE_STATS AfdQueueStats;
  126. AFD_CONNECTION_STATS AfdConnectionStats;
  127. #endif // AFD_KEEP_STATS
  128. #if ENABLE_ABORT_TIMER_HACK
  129. LARGE_INTEGER AfdAbortTimerTimeout;
  130. #endif // ENABLE_ABORT_TIMER_HACK
  131. QOS AfdDefaultQos =
  132. {
  133. { // SendingFlowspec
  134. -1, // TokenRate
  135. -1, // TokenBucketSize
  136. -1, // PeakBandwidth
  137. -1, // Latency
  138. -1, // DelayVariation
  139. BestEffortService, // LevelOfGuarantee
  140. 0, // CostOfCall
  141. 1 // NetworkAvailability
  142. },
  143. { // ReceivingFlowspec
  144. -1, // TokenRate
  145. -1, // TokenBucketSize
  146. -1, // PeakBandwidth
  147. -1, // Latency
  148. -1, // DelayVariation
  149. BestEffortService, // LevelOfGuarantee
  150. 0, // CostOfCall
  151. 1 // NetworkAvailability
  152. },
  153. { // ProviderSpecific
  154. 0, // len
  155. NULL // buf
  156. }
  157. };
  158. BOOLEAN
  159. AfdInitializeData (
  160. VOID
  161. )
  162. {
  163. PAGED_CODE( );
  164. #if DBG || REFERENCE_DEBUG
  165. AfdInitializeDebugData( );
  166. #endif
  167. //
  168. // Initialize global spin locks and resources used by AFD.
  169. //
  170. KeInitializeSpinLock( &AfdSpinLock );
  171. KeInitializeSpinLock( &AfdWorkQueueSpinLock );
  172. AfdResource = AFD_ALLOCATE_POOL(
  173. NonPagedPool,
  174. sizeof(*AfdResource),
  175. AFD_RESOURCE_POOL_TAG
  176. );
  177. if ( AfdResource == NULL ) {
  178. return FALSE;
  179. }
  180. ExInitializeResource( AfdResource );
  181. //
  182. // Initialize global lists.
  183. //
  184. InitializeListHead( &AfdEndpointListHead );
  185. InitializeListHead( &AfdDisconnectListHead );
  186. InitializeListHead( &AfdPollListHead );
  187. InitializeListHead( &AfdTransportInfoListHead );
  188. InitializeListHead( &AfdWorkQueueListHead );
  189. InitializeListHead( &AfdConstrainedEndpointListHead );
  190. InitializeListHead( &AfdQueuedTransmitFileListHead );
  191. AfdCacheLineSize= HalGetDmaAlignmentRequirement( );
  192. AfdBufferLengthForOnePage = PAGE_SIZE - AfdCalculateBufferSize( 4, 0 );
  193. AfdLargeBufferSize = AfdBufferLengthForOnePage;
  194. #if ENABLE_ABORT_TIMER_HACK
  195. //
  196. // Initialize the abort timer timeout value.
  197. //
  198. AfdAbortTimerTimeout = RtlEnlargedIntegerMultiply(
  199. AFD_ABORT_TIMER_TIMEOUT_VALUE,
  200. -10*1000*1000
  201. );
  202. #endif // ENABLE_ABORT_TIMER_HACK
  203. //
  204. // Set up buffer counts based on machine size. For smaller
  205. // machines, it is OK to take the perf hit of the additional
  206. // allocations in order to save the nonpaged pool overhead.
  207. //
  208. switch ( MmQuerySystemSize( ) ) {
  209. case MmSmallSystem:
  210. AfdReceiveWindowSize = AFD_SM_DEFAULT_RECEIVE_WINDOW;
  211. AfdSendWindowSize = AFD_SM_DEFAULT_SEND_WINDOW;
  212. AfdTransmitIoLength = AFD_SM_DEFAULT_TRANSMIT_IO_LENGTH;
  213. AfdLargeBufferListDepth = AFD_SM_DEFAULT_LARGE_LIST_DEPTH;
  214. AfdMediumBufferListDepth = AFD_SM_DEFAULT_MEDIUM_LIST_DEPTH;
  215. AfdSmallBufferListDepth = AFD_SM_DEFAULT_SMALL_LIST_DEPTH;
  216. break;
  217. case MmMediumSystem:
  218. AfdReceiveWindowSize = AFD_MM_DEFAULT_RECEIVE_WINDOW;
  219. AfdSendWindowSize = AFD_MM_DEFAULT_SEND_WINDOW;
  220. AfdTransmitIoLength = AFD_MM_DEFAULT_TRANSMIT_IO_LENGTH;
  221. AfdLargeBufferListDepth = AFD_MM_DEFAULT_LARGE_LIST_DEPTH;
  222. AfdMediumBufferListDepth = AFD_MM_DEFAULT_MEDIUM_LIST_DEPTH;
  223. AfdSmallBufferListDepth = AFD_MM_DEFAULT_SMALL_LIST_DEPTH;
  224. break;
  225. case MmLargeSystem:
  226. AfdReceiveWindowSize = AFD_LM_DEFAULT_RECEIVE_WINDOW;
  227. AfdSendWindowSize = AFD_LM_DEFAULT_SEND_WINDOW;
  228. AfdTransmitIoLength = AFD_LM_DEFAULT_TRANSMIT_IO_LENGTH;
  229. AfdLargeBufferListDepth = AFD_LM_DEFAULT_LARGE_LIST_DEPTH;
  230. AfdMediumBufferListDepth = AFD_LM_DEFAULT_MEDIUM_LIST_DEPTH;
  231. AfdSmallBufferListDepth = AFD_LM_DEFAULT_SMALL_LIST_DEPTH;
  232. break;
  233. default:
  234. ASSERT( FALSE );
  235. }
  236. if( MmIsThisAnNtAsSystem() ) {
  237. //
  238. // On the NT Server product, there is no maximum active TransmitFile
  239. // count. Setting this counter to zero short-circuits a number of
  240. // tests for queueing TransmitFile IRPs.
  241. //
  242. AfdMaxActiveTransmitFileCount = 0;
  243. } else {
  244. //
  245. // On the workstation product, the TransmitFile default I/O length
  246. // is always a page size. This conserves memory on workstatioons
  247. // and keeps the server product's performance high.
  248. //
  249. AfdTransmitIoLength = PAGE_SIZE;
  250. //
  251. // Enforce a maximum active TransmitFile count.
  252. //
  253. AfdMaxActiveTransmitFileCount =
  254. AFD_DEFAULT_MAX_ACTIVE_TRANSMIT_FILE_COUNT;
  255. }
  256. return TRUE;
  257. } // AfdInitializeData