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.

241 lines
6.3 KiB

  1. /*++
  2. Copyright (c) 1992 Microsoft Corporation
  3. Module Name:
  4. heaptag.c
  5. Abstract:
  6. This module implements the support routines needed for FLG_HEAP_ENABLE_TAG_BY_DLL
  7. Author:
  8. Steve Wood (stevewo) 07-Apr-1995
  9. Revision History:
  10. --*/
  11. #pragma warning(disable:4214) // bit field types other than int
  12. #pragma warning(disable:4201) // nameless struct/union
  13. #pragma warning(disable:4115) // named type definition in parentheses
  14. #pragma warning(disable:4127) // condition expression is constant
  15. #include <ntos.h>
  16. #include "ldrp.h"
  17. #include <stktrace.h>
  18. #include <heap.h>
  19. #include <stdio.h>
  20. #define LDRP_MAXIMUM_DLL_TAGS 64
  21. BOOLEAN LdrpDllTagsInitialized;
  22. ULONG LdrpNumberOfDllTags;
  23. ULONG LdrpBaseDllTag;
  24. ULONG LdrpDllTags[ LDRP_MAXIMUM_DLL_TAGS ];
  25. #define DEFINE_HEAPTAG_ENTRY( n ) \
  26. PVOID LdrpTagAllocateHeap##n( PVOID h, ULONG f, ULONG s ) {return LdrpTagAllocateHeap( h, f, s, n ); }
  27. PVOID
  28. LdrpTagAllocateHeap(
  29. IN PVOID HeapHandle,
  30. IN ULONG Flags,
  31. IN ULONG Size,
  32. IN ULONG n
  33. )
  34. {
  35. if ((Flags & HEAP_TAG_MASK) == 0) {
  36. Flags |= LdrpDllTags[ n ];
  37. }
  38. return RtlAllocateHeap( HeapHandle, Flags, Size );
  39. }
  40. DEFINE_HEAPTAG_ENTRY( 0 );
  41. DEFINE_HEAPTAG_ENTRY( 1 );
  42. DEFINE_HEAPTAG_ENTRY( 2 );
  43. DEFINE_HEAPTAG_ENTRY( 3 );
  44. DEFINE_HEAPTAG_ENTRY( 4 );
  45. DEFINE_HEAPTAG_ENTRY( 5 );
  46. DEFINE_HEAPTAG_ENTRY( 6 );
  47. DEFINE_HEAPTAG_ENTRY( 7 );
  48. DEFINE_HEAPTAG_ENTRY( 8 );
  49. DEFINE_HEAPTAG_ENTRY( 9 );
  50. DEFINE_HEAPTAG_ENTRY( 10 );
  51. DEFINE_HEAPTAG_ENTRY( 11 );
  52. DEFINE_HEAPTAG_ENTRY( 12 );
  53. DEFINE_HEAPTAG_ENTRY( 13 );
  54. DEFINE_HEAPTAG_ENTRY( 14 );
  55. DEFINE_HEAPTAG_ENTRY( 15 );
  56. DEFINE_HEAPTAG_ENTRY( 16 );
  57. DEFINE_HEAPTAG_ENTRY( 17 );
  58. DEFINE_HEAPTAG_ENTRY( 18 );
  59. DEFINE_HEAPTAG_ENTRY( 19 );
  60. DEFINE_HEAPTAG_ENTRY( 20 );
  61. DEFINE_HEAPTAG_ENTRY( 21 );
  62. DEFINE_HEAPTAG_ENTRY( 22 );
  63. DEFINE_HEAPTAG_ENTRY( 23 );
  64. DEFINE_HEAPTAG_ENTRY( 24 );
  65. DEFINE_HEAPTAG_ENTRY( 25 );
  66. DEFINE_HEAPTAG_ENTRY( 26 );
  67. DEFINE_HEAPTAG_ENTRY( 27 );
  68. DEFINE_HEAPTAG_ENTRY( 28 );
  69. DEFINE_HEAPTAG_ENTRY( 29 );
  70. DEFINE_HEAPTAG_ENTRY( 30 );
  71. DEFINE_HEAPTAG_ENTRY( 31 );
  72. DEFINE_HEAPTAG_ENTRY( 32 );
  73. DEFINE_HEAPTAG_ENTRY( 33 );
  74. DEFINE_HEAPTAG_ENTRY( 34 );
  75. DEFINE_HEAPTAG_ENTRY( 35 );
  76. DEFINE_HEAPTAG_ENTRY( 36 );
  77. DEFINE_HEAPTAG_ENTRY( 37 );
  78. DEFINE_HEAPTAG_ENTRY( 38 );
  79. DEFINE_HEAPTAG_ENTRY( 39 );
  80. DEFINE_HEAPTAG_ENTRY( 40 );
  81. DEFINE_HEAPTAG_ENTRY( 41 );
  82. DEFINE_HEAPTAG_ENTRY( 42 );
  83. DEFINE_HEAPTAG_ENTRY( 43 );
  84. DEFINE_HEAPTAG_ENTRY( 44 );
  85. DEFINE_HEAPTAG_ENTRY( 45 );
  86. DEFINE_HEAPTAG_ENTRY( 46 );
  87. DEFINE_HEAPTAG_ENTRY( 47 );
  88. DEFINE_HEAPTAG_ENTRY( 48 );
  89. DEFINE_HEAPTAG_ENTRY( 49 );
  90. DEFINE_HEAPTAG_ENTRY( 50 );
  91. DEFINE_HEAPTAG_ENTRY( 51 );
  92. DEFINE_HEAPTAG_ENTRY( 52 );
  93. DEFINE_HEAPTAG_ENTRY( 53 );
  94. DEFINE_HEAPTAG_ENTRY( 54 );
  95. DEFINE_HEAPTAG_ENTRY( 55 );
  96. DEFINE_HEAPTAG_ENTRY( 56 );
  97. DEFINE_HEAPTAG_ENTRY( 57 );
  98. DEFINE_HEAPTAG_ENTRY( 58 );
  99. DEFINE_HEAPTAG_ENTRY( 59 );
  100. DEFINE_HEAPTAG_ENTRY( 60 );
  101. DEFINE_HEAPTAG_ENTRY( 61 );
  102. DEFINE_HEAPTAG_ENTRY( 62 );
  103. DEFINE_HEAPTAG_ENTRY( 63 );
  104. typedef PVOID (*PLDRP_DLL_TAG_PROCEDURE)(
  105. PVOID HeapHandle,
  106. ULONG Flags,
  107. ULONG Size
  108. );
  109. const PLDRP_DLL_TAG_PROCEDURE LdrpDllTagProcedures[ LDRP_MAXIMUM_DLL_TAGS ] = {
  110. LdrpTagAllocateHeap0,
  111. LdrpTagAllocateHeap1,
  112. LdrpTagAllocateHeap2,
  113. LdrpTagAllocateHeap3,
  114. LdrpTagAllocateHeap4,
  115. LdrpTagAllocateHeap5,
  116. LdrpTagAllocateHeap6,
  117. LdrpTagAllocateHeap7,
  118. LdrpTagAllocateHeap8,
  119. LdrpTagAllocateHeap9,
  120. LdrpTagAllocateHeap10,
  121. LdrpTagAllocateHeap11,
  122. LdrpTagAllocateHeap12,
  123. LdrpTagAllocateHeap13,
  124. LdrpTagAllocateHeap14,
  125. LdrpTagAllocateHeap15,
  126. LdrpTagAllocateHeap16,
  127. LdrpTagAllocateHeap17,
  128. LdrpTagAllocateHeap18,
  129. LdrpTagAllocateHeap19,
  130. LdrpTagAllocateHeap20,
  131. LdrpTagAllocateHeap21,
  132. LdrpTagAllocateHeap22,
  133. LdrpTagAllocateHeap23,
  134. LdrpTagAllocateHeap24,
  135. LdrpTagAllocateHeap25,
  136. LdrpTagAllocateHeap26,
  137. LdrpTagAllocateHeap27,
  138. LdrpTagAllocateHeap28,
  139. LdrpTagAllocateHeap29,
  140. LdrpTagAllocateHeap30,
  141. LdrpTagAllocateHeap31,
  142. LdrpTagAllocateHeap32,
  143. LdrpTagAllocateHeap33,
  144. LdrpTagAllocateHeap34,
  145. LdrpTagAllocateHeap35,
  146. LdrpTagAllocateHeap36,
  147. LdrpTagAllocateHeap37,
  148. LdrpTagAllocateHeap38,
  149. LdrpTagAllocateHeap39,
  150. LdrpTagAllocateHeap40,
  151. LdrpTagAllocateHeap41,
  152. LdrpTagAllocateHeap42,
  153. LdrpTagAllocateHeap43,
  154. LdrpTagAllocateHeap44,
  155. LdrpTagAllocateHeap45,
  156. LdrpTagAllocateHeap46,
  157. LdrpTagAllocateHeap47,
  158. LdrpTagAllocateHeap48,
  159. LdrpTagAllocateHeap49,
  160. LdrpTagAllocateHeap50,
  161. LdrpTagAllocateHeap51,
  162. LdrpTagAllocateHeap52,
  163. LdrpTagAllocateHeap53,
  164. LdrpTagAllocateHeap54,
  165. LdrpTagAllocateHeap55,
  166. LdrpTagAllocateHeap56,
  167. LdrpTagAllocateHeap57,
  168. LdrpTagAllocateHeap58,
  169. LdrpTagAllocateHeap59,
  170. LdrpTagAllocateHeap60,
  171. LdrpTagAllocateHeap61,
  172. LdrpTagAllocateHeap62,
  173. LdrpTagAllocateHeap63
  174. };
  175. PVOID
  176. LdrpDefineDllTag (
  177. PWSTR TagName,
  178. PUSHORT TagIndex
  179. )
  180. {
  181. PVOID Result;
  182. WCHAR TagNameBuffer[ 260 ];
  183. if (RtlpGlobalTagHeap == NULL) {
  184. RtlpGlobalTagHeap = RtlAllocateHeap( RtlProcessHeap( ), HEAP_ZERO_MEMORY, sizeof( HEAP ));
  185. if (RtlpGlobalTagHeap == NULL) {
  186. return NULL;
  187. }
  188. }
  189. if (!LdrpDllTagsInitialized) {
  190. //
  191. // Keep QUERY.C happy
  192. //
  193. InitializeListHead( &RtlpGlobalTagHeap->VirtualAllocdBlocks );
  194. LdrpDllTagsInitialized = TRUE;
  195. }
  196. Result = NULL;
  197. if (LdrpNumberOfDllTags < LDRP_MAXIMUM_DLL_TAGS) {
  198. memset( TagNameBuffer, 0, sizeof( TagNameBuffer ) );
  199. wcsncpy( TagNameBuffer, TagName, ( sizeof( TagNameBuffer ) / sizeof( TagNameBuffer[0] ) ) - 1 );
  200. LdrpDllTags[ LdrpNumberOfDllTags ] =
  201. RtlCreateTagHeap( NULL,
  202. 0,
  203. NULL,
  204. TagNameBuffer
  205. );
  206. if (LdrpDllTags[ LdrpNumberOfDllTags ] != 0) {
  207. Result = (PVOID) (ULONG_PTR) LdrpDllTagProcedures[ LdrpNumberOfDllTags ];
  208. }
  209. if (Result != NULL) {
  210. *TagIndex = (USHORT)(LdrpDllTags[ LdrpNumberOfDllTags ] >> HEAP_TAG_SHIFT);
  211. LdrpNumberOfDllTags += 1;
  212. }
  213. }
  214. return Result;
  215. }