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.

641 lines
19 KiB

  1. /*++
  2. Copyright (c) 1998-2002 Microsoft Corporation
  3. Module Name:
  4. data.c
  5. Abstract:
  6. This module contains global data for UL.
  7. Author:
  8. Keith Moore (keithmo) 10-Jun-1998
  9. Revision History:
  10. --*/
  11. #include "precomp.h"
  12. #ifdef ALLOC_PRAGMA
  13. #pragma alloc_text( INIT, UlInitializeData )
  14. #pragma alloc_text( PAGE, UlTerminateData )
  15. #endif // ALLOC_PRAGMA
  16. //
  17. // The number of processors in the system.
  18. //
  19. CLONG g_UlNumberOfProcessors = 1;
  20. ULONGLONG g_UlThreadAffinityMask = 1;
  21. BOOLEAN g_HttpClientEnabled; // Will be initialized in init.c
  22. //
  23. // The largest cache line size the system
  24. //
  25. ULONG g_UlCacheLineSize = 0;
  26. ULONG g_UlCacheLineBits = 0; // see init.c
  27. //
  28. // Total memory in the system
  29. //
  30. SIZE_T g_UlTotalPhysicalMemMB = 0;
  31. SIZE_T g_UlTotalNonPagedPoolBytes = 0;
  32. //
  33. // Our nonpaged data.
  34. //
  35. PUL_NONPAGED_DATA g_pUlNonpagedData = NULL;
  36. //
  37. // A pointer to the system process.
  38. //
  39. PKPROCESS g_pUlSystemProcess = NULL;
  40. //
  41. // Our device objects and their container.
  42. //
  43. HANDLE g_UlDirectoryObject = NULL;
  44. PDEVICE_OBJECT g_pUlControlDeviceObject = NULL;
  45. PDEVICE_OBJECT g_pUlFilterDeviceObject = NULL;
  46. PDEVICE_OBJECT g_pUlAppPoolDeviceObject = NULL;
  47. PDEVICE_OBJECT g_pUcServerDeviceObject = NULL;
  48. //
  49. // This handle references all the client functions. This allows us to quickly
  50. // demand page the client code.
  51. //
  52. PVOID g_ClientImageHandle = NULL;
  53. //
  54. // Cached Date header string.
  55. //
  56. LARGE_INTEGER g_UlSystemTime;
  57. UCHAR g_UlDateString[DATE_HDR_LENGTH+1];
  58. ULONG g_UlDateStringLength;
  59. //
  60. // Security descriptor that has fileAll for Admin & Local System
  61. //
  62. PSECURITY_DESCRIPTOR g_pAdminAllSystemAll;
  63. //
  64. // ComputerName string.
  65. //
  66. WCHAR g_UlComputerName[MAX_COMPUTER_NAME_LEN+1];
  67. //
  68. // Error logging config
  69. //
  70. HTTP_ERROR_LOGGING_CONFIG g_UlErrLoggingConfig;
  71. //
  72. // Various pieces of configuration information, with default values.
  73. //
  74. ULONG g_UlMaxWorkQueueDepth = DEFAULT_MAX_WORK_QUEUE_DEPTH;
  75. ULONG g_UlMinWorkDequeueDepth = DEFAULT_MIN_WORK_DEQUEUE_DEPTH;
  76. USHORT g_UlIdleConnectionsHighMark = DEFAULT_IDLE_CONNECTIONS_HIGH_MARK;
  77. USHORT g_UlIdleConnectionsLowMark = DEFAULT_IDLE_CONNECTIONS_LOW_MARK;
  78. ULONG g_UlIdleListTrimmerPeriod = DEFAULT_IDLE_LIST_TRIMMER_PERIOD;
  79. USHORT g_UlMaxEndpoints = DEFAULT_MAX_ENDPOINTS;
  80. ULONG g_UlReceiveBufferSize = DEFAULT_RCV_BUFFER_SIZE;
  81. ULONG g_UlMaxRequestBytes = DEFAULT_MAX_REQUEST_BYTES;
  82. BOOLEAN g_UlOptForIntrMod = DEFAULT_OPT_FOR_INTR_MOD;
  83. BOOLEAN g_UlEnableNagling = DEFAULT_ENABLE_NAGLING;
  84. BOOLEAN g_UlEnableThreadAffinity = DEFAULT_ENABLE_THREAD_AFFINITY;
  85. ULONG g_UlMaxFieldLength = DEFAULT_MAX_FIELD_LENGTH;
  86. BOOLEAN g_UlDisableLogBuffering = DEFAULT_DISABLE_LOG_BUFFERING;
  87. ULONG g_UlLogBufferSize = DEFAULT_LOG_BUFFER_SIZE;
  88. ULONG g_UlResponseBufferSize = DEFAULT_RESP_BUFFER_SIZE;
  89. URL_C14N_CONFIG g_UrlC14nConfig;
  90. ULONG g_UlMaxInternalUrlLength = DEFAULT_MAX_INTERNAL_URL_LENGTH;
  91. ULONG g_UlMaxBufferedBytes = DEFAULT_MAX_BUFFERED_BYTES;
  92. ULONG g_UlMaxCopyThreshold = DEFAULT_MAX_COPY_THRESHOLD;
  93. ULONG g_UlMaxBufferedSends = DEFAULT_MAX_BUFFERED_SENDS;
  94. ULONG g_UlMaxBytesPerSend = DEFAULT_MAX_BYTES_PER_SEND;
  95. ULONG g_UlMaxBytesPerRead = DEFAULT_MAX_BYTES_PER_READ;
  96. ULONG g_UlMaxPipelinedRequests = DEFAULT_MAX_PIPELINED_REQUESTS;
  97. BOOLEAN g_UlEnableCopySend = DEFAULT_ENABLE_COPY_SEND;
  98. ULONG g_UlOpaqueIdTableSize = DEFAULT_OPAQUE_ID_TABLE_SIZE;
  99. ULONG g_UlMaxZombieHttpConnectionCount = DEFAULT_MAX_ZOMBIE_HTTP_CONN_COUNT;
  100. ULONG g_UlDisableServerHeader = DEFAULT_DISABLE_SERVER_HEADER;
  101. ULONG g_UlConnectionSendLimit = DEFAULT_CONNECTION_SEND_LIMIT;
  102. ULONGLONG g_UlGlobalSendLimit = DEFAULT_GLOBAL_SEND_LIMIT;
  103. //
  104. // The following are generated during initialization.
  105. //
  106. ULONG g_UlMaxVariableHeaderSize = 0;
  107. ULONG g_UlMaxFixedHeaderSize = 0;
  108. ULONG g_UlFixedHeadersMdlLength = 0;
  109. ULONG g_UlVariableHeadersMdlLength = 0;
  110. ULONG g_UlContentMdlLength = 0;
  111. ULONG g_UlChunkTrackerSize = 0;
  112. ULONG g_UlFullTrackerSize = 0;
  113. ULONG g_UlMaxRequestsQueued = (ULONG) DEFAULT_MAX_REQUESTS_QUEUED;
  114. //
  115. // Make life easier for the debugger extension.
  116. //
  117. #if DBG
  118. ULONG g_UlCheckedBuild = TRUE;
  119. #else
  120. ULONG g_UlCheckedBuild = FALSE;
  121. #endif
  122. //
  123. // Debug stuff.
  124. //
  125. #if DBG
  126. ULONGLONG g_UlDebug = DEFAULT_DEBUG_FLAGS;
  127. ULONG g_UlBreakOnError = DEFAULT_BREAK_ON_ERROR;
  128. ULONG g_UlVerboseErrors = DEFAULT_VERBOSE_ERRORS;
  129. #endif // DBG
  130. #if REFERENCE_DEBUG
  131. // If you add tracelogs here, please update !ulkd.glob
  132. PTRACE_LOG g_pEndpointUsageTraceLog = NULL;
  133. PTRACE_LOG g_pMondoGlobalTraceLog = NULL;
  134. PTRACE_LOG g_pPoolAllocTraceLog = NULL;
  135. PTRACE_LOG g_pUriTraceLog = NULL;
  136. PTRACE_LOG g_pTdiTraceLog = NULL;
  137. PTRACE_LOG g_pHttpRequestTraceLog = NULL;
  138. PTRACE_LOG g_pHttpConnectionTraceLog = NULL;
  139. PTRACE_LOG g_pHttpResponseTraceLog = NULL;
  140. PTRACE_LOG g_pAppPoolTraceLog = NULL;
  141. PTRACE_LOG g_pAppPoolProcessTraceLog = NULL;
  142. PTRACE_LOG g_pConfigGroupTraceLog = NULL;
  143. PTRACE_LOG g_pControlChannelTraceLog = NULL;
  144. PTRACE_LOG g_pThreadTraceLog = NULL;
  145. PTRACE_LOG g_pFilterTraceLog = NULL;
  146. PTRACE_LOG g_pIrpTraceLog = NULL;
  147. PTRACE_LOG g_pTimeTraceLog = NULL;
  148. PTRACE_LOG g_pAppPoolTimeTraceLog = NULL;
  149. PTRACE_LOG g_pReplenishTraceLog = NULL;
  150. PTRACE_LOG g_pMdlTraceLog = NULL;
  151. PTRACE_LOG g_pSiteCounterTraceLog = NULL;
  152. PTRACE_LOG g_pConnectionCountTraceLog = NULL;
  153. PTRACE_LOG g_pConfigGroupInfoTraceLog = NULL;
  154. PTRACE_LOG g_pChunkTrackerTraceLog = NULL;
  155. PTRACE_LOG g_pWorkItemTraceLog = NULL;
  156. PTRACE_LOG g_pUcTraceLog = NULL;
  157. #endif // REFERENCE_DEBUG
  158. PSTRING_LOG g_pGlobalStringLog = NULL;
  159. //
  160. // Generic access map for url acls
  161. //
  162. GENERIC_MAPPING g_UrlAccessGenericMapping = {
  163. 0,
  164. HTTP_ALLOW_DELEGATE_URL,
  165. HTTP_ALLOW_REGISTER_URL,
  166. HTTP_ALLOW_DELEGATE_URL | HTTP_ALLOW_REGISTER_URL
  167. };
  168. //
  169. // Public functions.
  170. //
  171. /***************************************************************************++
  172. Routine Description:
  173. Performs global data initialization.
  174. Return Value:
  175. NTSTATUS - Completion status.
  176. --***************************************************************************/
  177. NTSTATUS
  178. UlInitializeData(
  179. PUL_CONFIG pConfig
  180. )
  181. {
  182. //
  183. // Sanity check.
  184. //
  185. PAGED_CODE();
  186. //
  187. // Initialize the nonpaged data.
  188. //
  189. g_pUlNonpagedData = UL_ALLOCATE_STRUCT(
  190. NonPagedPool,
  191. UL_NONPAGED_DATA,
  192. UL_NONPAGED_DATA_POOL_TAG
  193. );
  194. if (g_pUlNonpagedData == NULL )
  195. {
  196. return STATUS_INSUFFICIENT_RESOURCES;
  197. }
  198. RtlZeroMemory(g_pUlNonpagedData, sizeof(*g_pUlNonpagedData));
  199. #if DBG
  200. //
  201. // Initialize any debug-specific data.
  202. //
  203. UlDbgInitializeDebugData( );
  204. #endif // DBG
  205. //
  206. // Initialize the maximum variable header size.
  207. //
  208. g_UlMaxVariableHeaderSize = UlComputeMaxVariableHeaderSize();
  209. g_UlMaxVariableHeaderSize = ALIGN_UP(g_UlMaxVariableHeaderSize, PVOID);
  210. g_UlMaxFixedHeaderSize = DEFAULT_MAX_FIXED_HEADER_SIZE;
  211. //
  212. // MDL Length for FixedHeaders or UserBuffer.
  213. //
  214. g_UlFixedHeadersMdlLength = (ULONG)
  215. MmSizeOfMdl(
  216. (PVOID)(PAGE_SIZE - 1),
  217. MAX(
  218. g_UlMaxBytesPerSend,
  219. g_UlMaxFixedHeaderSize
  220. )
  221. );
  222. g_UlFixedHeadersMdlLength = ALIGN_UP(g_UlFixedHeadersMdlLength, PVOID);
  223. //
  224. // MDL Length for VariableHeaders or FixedHeaders + VariablesHeaders +
  225. // CopiedBuffer.
  226. //
  227. g_UlVariableHeadersMdlLength = (ULONG)
  228. MmSizeOfMdl(
  229. (PVOID)(PAGE_SIZE - 1),
  230. g_UlMaxFixedHeaderSize +
  231. g_UlMaxVariableHeaderSize +
  232. g_UlMaxCopyThreshold
  233. );
  234. g_UlVariableHeadersMdlLength = ALIGN_UP(g_UlVariableHeadersMdlLength, PVOID);
  235. //
  236. // MDL Length for Content.
  237. //
  238. g_UlContentMdlLength = (ULONG)
  239. MmSizeOfMdl(
  240. (PVOID)(PAGE_SIZE - 1),
  241. pConfig->UriConfig.MaxUriBytes
  242. );
  243. g_UlContentMdlLength = ALIGN_UP(g_UlContentMdlLength, PVOID);
  244. //
  245. // Initialize the default internal response buffer size.
  246. //
  247. if (DEFAULT_RESP_BUFFER_SIZE == g_UlResponseBufferSize)
  248. {
  249. g_UlResponseBufferSize =
  250. ALIGN_UP(sizeof(UL_INTERNAL_RESPONSE), PVOID) +
  251. UL_LOCAL_CHUNKS * sizeof(UL_INTERNAL_DATA_CHUNK) +
  252. g_UlMaxVariableHeaderSize +
  253. g_UlMaxFixedHeaderSize;
  254. }
  255. //
  256. // Initialize chunk and cache tracker size.
  257. //
  258. g_UlChunkTrackerSize =
  259. ALIGN_UP(sizeof(UL_CHUNK_TRACKER), PVOID) +
  260. ALIGN_UP(IoSizeOfIrp(DEFAULT_MAX_IRP_STACK_SIZE), PVOID);
  261. g_UlFullTrackerSize =
  262. ALIGN_UP(sizeof(UL_FULL_TRACKER), PVOID) +
  263. ALIGN_UP(IoSizeOfIrp(DEFAULT_MAX_IRP_STACK_SIZE), PVOID) +
  264. g_UlMaxFixedHeaderSize +
  265. g_UlMaxVariableHeaderSize +
  266. g_UlMaxCopyThreshold +
  267. g_UlFixedHeadersMdlLength +
  268. g_UlVariableHeadersMdlLength +
  269. g_UlContentMdlLength;
  270. g_UlFullTrackerSize = ALIGN_UP(g_UlFullTrackerSize, PVOID);
  271. if (DEFAULT_MAX_COPY_THRESHOLD == g_UlMaxCopyThreshold &&
  272. g_UlFullTrackerSize > UL_PAGE_SIZE &&
  273. (g_UlFullTrackerSize - UL_PAGE_SIZE) < (g_UlMaxFixedHeaderSize / 2))
  274. {
  275. g_UlMaxFixedHeaderSize -= (g_UlFullTrackerSize - UL_PAGE_SIZE);
  276. g_UlFullTrackerSize = UL_PAGE_SIZE;
  277. ASSERT(g_UlMaxFixedHeaderSize >= DEFAULT_MAX_FIXED_HEADER_SIZE / 2);
  278. }
  279. if (DEFAULT_GLOBAL_SEND_LIMIT == g_UlGlobalSendLimit)
  280. {
  281. //
  282. // Set GlobalSendLimit based on the size of NonPagedPool. Our
  283. // rudimentary algorithm says we want to use 1/8 of the total NPP
  284. // memory.
  285. //
  286. g_UlGlobalSendLimit = g_UlTotalNonPagedPoolBytes / 8;
  287. }
  288. //
  289. // Initialize the lookaside lists.
  290. //
  291. g_pUlNonpagedData->IrpContextLookaside =
  292. PplCreatePool(
  293. &UlAllocateIrpContextPool, // Allocate
  294. &UlFreeIrpContextPool, // Free
  295. 0, // Flags
  296. sizeof(UL_IRP_CONTEXT), // Size
  297. UL_IRP_CONTEXT_POOL_TAG, // Tag
  298. pConfig->IrpContextLookasideDepth // Depth
  299. );
  300. if (!g_pUlNonpagedData->IrpContextLookaside)
  301. {
  302. return STATUS_INSUFFICIENT_RESOURCES;
  303. }
  304. g_pUlNonpagedData->ReceiveBufferLookaside =
  305. PplCreatePool(
  306. &UlAllocateReceiveBufferPool, // Allocate
  307. &UlFreeReceiveBufferPool, // Free
  308. 0, // Flags
  309. sizeof(UL_RECEIVE_BUFFER), // Size
  310. UL_RCV_BUFFER_POOL_TAG, // Tag
  311. pConfig->ReceiveBufferLookasideDepth // Depth
  312. );
  313. if (!g_pUlNonpagedData->ReceiveBufferLookaside)
  314. {
  315. return STATUS_INSUFFICIENT_RESOURCES;
  316. }
  317. g_pUlNonpagedData->ResponseBufferLookaside =
  318. PplCreatePool(
  319. &UlAllocateResponseBufferPool, // Allocate
  320. &UlFreeResponseBufferPool, // Free
  321. 0, // Flags
  322. g_UlResponseBufferSize, // Size
  323. UL_INTERNAL_RESPONSE_POOL_TAG, // Tag
  324. pConfig->ResponseBufferLookasideDepth // Depth
  325. );
  326. if (!g_pUlNonpagedData->ResponseBufferLookaside)
  327. {
  328. return STATUS_INSUFFICIENT_RESOURCES;
  329. }
  330. g_pUlNonpagedData->RequestBufferLookaside =
  331. PplCreatePool(
  332. &UlAllocateRequestBufferPool, // Allocate
  333. &UlFreeRequestBufferPool, // Free
  334. 0, // Flags
  335. DEFAULT_MAX_REQUEST_BUFFER_SIZE, // Size
  336. UL_REQUEST_BUFFER_POOL_TAG, // Tag
  337. pConfig->RequestBufferLookasideDepth // Depth
  338. );
  339. if (!g_pUlNonpagedData->RequestBufferLookaside)
  340. {
  341. return STATUS_INSUFFICIENT_RESOURCES;
  342. }
  343. g_pUlNonpagedData->InternalRequestLookaside =
  344. PplCreatePool(
  345. &UlAllocateInternalRequestPool, // Allocate
  346. &UlFreeInternalRequestPool, // Free
  347. 0, // Flags
  348. sizeof(UL_INTERNAL_REQUEST), // Size
  349. UL_INTERNAL_REQUEST_POOL_TAG, // Tag
  350. pConfig->InternalRequestLookasideDepth // Depth
  351. );
  352. if (!g_pUlNonpagedData->InternalRequestLookaside)
  353. {
  354. return STATUS_INSUFFICIENT_RESOURCES;
  355. }
  356. g_pUlNonpagedData->ChunkTrackerLookaside =
  357. PplCreatePool(
  358. &UlAllocateChunkTrackerPool, // Allocate
  359. &UlFreeChunkTrackerPool, // Free
  360. 0, // Flags
  361. g_UlChunkTrackerSize, // Size
  362. UL_CHUNK_TRACKER_POOL_TAG, // Tag
  363. pConfig->SendTrackerLookasideDepth // Depth
  364. );
  365. if (!g_pUlNonpagedData->ChunkTrackerLookaside)
  366. {
  367. return STATUS_INSUFFICIENT_RESOURCES;
  368. }
  369. g_pUlNonpagedData->FullTrackerLookaside =
  370. PplCreatePool(
  371. &UlAllocateFullTrackerPool, // Allocate
  372. &UlFreeFullTrackerPool, // Free
  373. 0, // Flags
  374. g_UlFullTrackerSize, // Size
  375. UL_FULL_TRACKER_POOL_TAG, // Tag
  376. pConfig->SendTrackerLookasideDepth // Depth
  377. );
  378. if (!g_pUlNonpagedData->FullTrackerLookaside)
  379. {
  380. return STATUS_INSUFFICIENT_RESOURCES;
  381. }
  382. g_pUlNonpagedData->LogFileBufferLookaside =
  383. PplCreatePool(
  384. &UlAllocateLogFileBufferPool, // Allocate
  385. &UlFreeLogFileBufferPool, // Free
  386. 0, // Flags
  387. sizeof(UL_LOG_FILE_BUFFER), // Size
  388. UL_LOG_FILE_BUFFER_POOL_TAG, // Tag
  389. pConfig->LogFileBufferLookasideDepth // Depth
  390. );
  391. if (!g_pUlNonpagedData->LogFileBufferLookaside)
  392. {
  393. return STATUS_INSUFFICIENT_RESOURCES;
  394. }
  395. g_pUlNonpagedData->BinaryLogDataBufferLookaside =
  396. PplCreatePool(
  397. &UlAllocateLogDataBufferPool, // Allocate
  398. &UlFreeLogDataBufferPool, // Free
  399. 0, // Flags
  400. sizeof(UL_LOG_DATA_BUFFER) + UL_BINARY_LOG_LINE_BUFFER_SIZE, // Size
  401. UL_BINARY_LOG_DATA_BUFFER_POOL_TAG, // Tag
  402. pConfig->LogDataBufferLookasideDepth // Depth
  403. );
  404. if (!g_pUlNonpagedData->BinaryLogDataBufferLookaside)
  405. {
  406. return STATUS_INSUFFICIENT_RESOURCES;
  407. }
  408. g_pUlNonpagedData->AnsiLogDataBufferLookaside =
  409. PplCreatePool(
  410. &UlAllocateLogDataBufferPool, // Allocate
  411. &UlFreeLogDataBufferPool, // Free
  412. 0, // Flags
  413. sizeof(UL_LOG_DATA_BUFFER) + UL_ANSI_LOG_LINE_BUFFER_SIZE, // Size
  414. UL_ANSI_LOG_DATA_BUFFER_POOL_TAG, // Tag
  415. pConfig->LogDataBufferLookasideDepth // Depth
  416. );
  417. if (!g_pUlNonpagedData->AnsiLogDataBufferLookaside)
  418. {
  419. return STATUS_INSUFFICIENT_RESOURCES;
  420. }
  421. g_pUlNonpagedData->ErrorLogBufferLookaside =
  422. PplCreatePool(
  423. &UlAllocateErrorLogBufferPool, // Allocate
  424. &UlFreeErrorLogBufferPool, // Free
  425. 0, // Flags
  426. UL_ERROR_LOG_BUFFER_SIZE, // Size
  427. UL_ERROR_LOG_BUFFER_POOL_TAG, // Tag
  428. pConfig->ErrorLogBufferLookasideDepth // Depth
  429. );
  430. if (!g_pUlNonpagedData->ErrorLogBufferLookaside)
  431. {
  432. return STATUS_INSUFFICIENT_RESOURCES;
  433. }
  434. return STATUS_SUCCESS;
  435. } // UlInitializeData
  436. /***************************************************************************++
  437. Routine Description:
  438. Performs global data termination.
  439. --***************************************************************************/
  440. VOID
  441. UlTerminateData(
  442. VOID
  443. )
  444. {
  445. //
  446. // Sanity check.
  447. //
  448. PAGED_CODE();
  449. ASSERT(g_UlTotalSendBytes == 0);
  450. if (g_pUlNonpagedData != NULL)
  451. {
  452. //
  453. // Kill the lookaside lists.
  454. //
  455. if (g_pUlNonpagedData->IrpContextLookaside)
  456. {
  457. PplDestroyPool( g_pUlNonpagedData->IrpContextLookaside, UL_IRP_CONTEXT_POOL_TAG);
  458. }
  459. if (g_pUlNonpagedData->ReceiveBufferLookaside)
  460. {
  461. PplDestroyPool( g_pUlNonpagedData->ReceiveBufferLookaside, UL_RCV_BUFFER_POOL_TAG );
  462. }
  463. if (g_pUlNonpagedData->RequestBufferLookaside)
  464. {
  465. PplDestroyPool( g_pUlNonpagedData->RequestBufferLookaside, UL_REQUEST_BUFFER_POOL_TAG );
  466. }
  467. if (g_pUlNonpagedData->InternalRequestLookaside)
  468. {
  469. PplDestroyPool( g_pUlNonpagedData->InternalRequestLookaside, UL_INTERNAL_REQUEST_POOL_TAG );
  470. }
  471. if (g_pUlNonpagedData->ChunkTrackerLookaside)
  472. {
  473. PplDestroyPool( g_pUlNonpagedData->ChunkTrackerLookaside, UL_CHUNK_TRACKER_POOL_TAG );
  474. }
  475. if (g_pUlNonpagedData->FullTrackerLookaside)
  476. {
  477. PplDestroyPool( g_pUlNonpagedData->FullTrackerLookaside, UL_FULL_TRACKER_POOL_TAG );
  478. }
  479. if (g_pUlNonpagedData->ResponseBufferLookaside)
  480. {
  481. PplDestroyPool( g_pUlNonpagedData->ResponseBufferLookaside, UL_INTERNAL_RESPONSE_POOL_TAG );
  482. }
  483. if (g_pUlNonpagedData->LogFileBufferLookaside)
  484. {
  485. PplDestroyPool( g_pUlNonpagedData->LogFileBufferLookaside, UL_LOG_FILE_BUFFER_POOL_TAG );
  486. }
  487. if (g_pUlNonpagedData->BinaryLogDataBufferLookaside)
  488. {
  489. PplDestroyPool( g_pUlNonpagedData->BinaryLogDataBufferLookaside,UL_BINARY_LOG_DATA_BUFFER_POOL_TAG );
  490. }
  491. if (g_pUlNonpagedData->AnsiLogDataBufferLookaside)
  492. {
  493. PplDestroyPool( g_pUlNonpagedData->AnsiLogDataBufferLookaside,UL_ANSI_LOG_DATA_BUFFER_POOL_TAG );
  494. }
  495. if (g_pUlNonpagedData->ErrorLogBufferLookaside)
  496. {
  497. PplDestroyPool( g_pUlNonpagedData->ErrorLogBufferLookaside,UL_ERROR_LOG_BUFFER_POOL_TAG );
  498. }
  499. //
  500. // Free the nonpaged data.
  501. //
  502. UL_FREE_POOL( g_pUlNonpagedData, UL_NONPAGED_DATA_POOL_TAG );
  503. }
  504. } // UlTerminateData