Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

heaptag.c

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1992 Microsoft Corporation 00004 00005 Module Name: 00006 00007 heaptag.c 00008 00009 Abstract: 00010 00011 This module implements the support routines needed for FLG_HEAP_ENABLE_TAG_BY_DLL 00012 00013 Author: 00014 00015 Steve Wood (stevewo) 07-Apr-1995 00016 00017 Revision History: 00018 00019 --*/ 00020 00021 #include <ntos.h> 00022 #include "ldrp.h" 00023 #include <stktrace.h> 00024 #include <heap.h> 00025 #include <stdio.h> 00026 00027 #define LDRP_MAXIMUM_DLL_TAGS 64 00028 00029 BOOLEAN LdrpDllTagsInitialized; 00030 ULONG LdrpNumberOfDllTags; 00031 ULONG LdrpBaseDllTag; 00032 ULONG LdrpDllTags[ LDRP_MAXIMUM_DLL_TAGS ]; 00033 00034 #define DEFINE_HEAPTAG_ENTRY( n ) \ 00035 PVOID LdrpTagAllocateHeap##n( PVOID h, ULONG f, ULONG s ) {return LdrpTagAllocateHeap( h, f, s, n ); } 00036 00037 PVOID 00038 LdrpTagAllocateHeap( 00039 IN PVOID HeapHandle, 00040 IN ULONG Flags, 00041 IN ULONG Size, 00042 IN ULONG n 00043 ) 00044 { 00045 if ((Flags & HEAP_TAG_MASK) == 0) { 00046 Flags |= LdrpDllTags[ n ]; 00047 } 00048 00049 return RtlAllocateHeap( HeapHandle, Flags, Size ); 00050 } 00051 00052 DEFINE_HEAPTAG_ENTRY( 0 ); 00053 DEFINE_HEAPTAG_ENTRY( 1 ); 00054 DEFINE_HEAPTAG_ENTRY( 2 ); 00055 DEFINE_HEAPTAG_ENTRY( 3 ); 00056 DEFINE_HEAPTAG_ENTRY( 4 ); 00057 DEFINE_HEAPTAG_ENTRY( 5 ); 00058 DEFINE_HEAPTAG_ENTRY( 6 ); 00059 DEFINE_HEAPTAG_ENTRY( 7 ); 00060 DEFINE_HEAPTAG_ENTRY( 8 ); 00061 DEFINE_HEAPTAG_ENTRY( 9 ); 00062 DEFINE_HEAPTAG_ENTRY( 10 ); 00063 DEFINE_HEAPTAG_ENTRY( 11 ); 00064 DEFINE_HEAPTAG_ENTRY( 12 ); 00065 DEFINE_HEAPTAG_ENTRY( 13 ); 00066 DEFINE_HEAPTAG_ENTRY( 14 ); 00067 DEFINE_HEAPTAG_ENTRY( 15 ); 00068 DEFINE_HEAPTAG_ENTRY( 16 ); 00069 DEFINE_HEAPTAG_ENTRY( 17 ); 00070 DEFINE_HEAPTAG_ENTRY( 18 ); 00071 DEFINE_HEAPTAG_ENTRY( 19 ); 00072 DEFINE_HEAPTAG_ENTRY( 20 ); 00073 DEFINE_HEAPTAG_ENTRY( 21 ); 00074 DEFINE_HEAPTAG_ENTRY( 22 ); 00075 DEFINE_HEAPTAG_ENTRY( 23 ); 00076 DEFINE_HEAPTAG_ENTRY( 24 ); 00077 DEFINE_HEAPTAG_ENTRY( 25 ); 00078 DEFINE_HEAPTAG_ENTRY( 26 ); 00079 DEFINE_HEAPTAG_ENTRY( 27 ); 00080 DEFINE_HEAPTAG_ENTRY( 28 ); 00081 DEFINE_HEAPTAG_ENTRY( 29 ); 00082 DEFINE_HEAPTAG_ENTRY( 30 ); 00083 DEFINE_HEAPTAG_ENTRY( 31 ); 00084 DEFINE_HEAPTAG_ENTRY( 32 ); 00085 DEFINE_HEAPTAG_ENTRY( 33 ); 00086 DEFINE_HEAPTAG_ENTRY( 34 ); 00087 DEFINE_HEAPTAG_ENTRY( 35 ); 00088 DEFINE_HEAPTAG_ENTRY( 36 ); 00089 DEFINE_HEAPTAG_ENTRY( 37 ); 00090 DEFINE_HEAPTAG_ENTRY( 38 ); 00091 DEFINE_HEAPTAG_ENTRY( 39 ); 00092 DEFINE_HEAPTAG_ENTRY( 40 ); 00093 DEFINE_HEAPTAG_ENTRY( 41 ); 00094 DEFINE_HEAPTAG_ENTRY( 42 ); 00095 DEFINE_HEAPTAG_ENTRY( 43 ); 00096 DEFINE_HEAPTAG_ENTRY( 44 ); 00097 DEFINE_HEAPTAG_ENTRY( 45 ); 00098 DEFINE_HEAPTAG_ENTRY( 46 ); 00099 DEFINE_HEAPTAG_ENTRY( 47 ); 00100 DEFINE_HEAPTAG_ENTRY( 48 ); 00101 DEFINE_HEAPTAG_ENTRY( 49 ); 00102 DEFINE_HEAPTAG_ENTRY( 50 ); 00103 DEFINE_HEAPTAG_ENTRY( 51 ); 00104 DEFINE_HEAPTAG_ENTRY( 52 ); 00105 DEFINE_HEAPTAG_ENTRY( 53 ); 00106 DEFINE_HEAPTAG_ENTRY( 54 ); 00107 DEFINE_HEAPTAG_ENTRY( 55 ); 00108 DEFINE_HEAPTAG_ENTRY( 56 ); 00109 DEFINE_HEAPTAG_ENTRY( 57 ); 00110 DEFINE_HEAPTAG_ENTRY( 58 ); 00111 DEFINE_HEAPTAG_ENTRY( 59 ); 00112 DEFINE_HEAPTAG_ENTRY( 60 ); 00113 DEFINE_HEAPTAG_ENTRY( 61 ); 00114 DEFINE_HEAPTAG_ENTRY( 62 ); 00115 DEFINE_HEAPTAG_ENTRY( 63 ); 00116 00117 typedef PVOID (*PLDRP_DLL_TAG_PROCEDURE)( 00118 PVOID HeapHandle, 00119 ULONG Flags, 00120 ULONG Size 00121 ); 00122 00123 const PLDRP_DLL_TAG_PROCEDURE LdrpDllTagProcedures[ LDRP_MAXIMUM_DLL_TAGS ] = { 00124 LdrpTagAllocateHeap0, 00125 LdrpTagAllocateHeap1, 00126 LdrpTagAllocateHeap2, 00127 LdrpTagAllocateHeap3, 00128 LdrpTagAllocateHeap4, 00129 LdrpTagAllocateHeap5, 00130 LdrpTagAllocateHeap6, 00131 LdrpTagAllocateHeap7, 00132 LdrpTagAllocateHeap8, 00133 LdrpTagAllocateHeap9, 00134 LdrpTagAllocateHeap10, 00135 LdrpTagAllocateHeap11, 00136 LdrpTagAllocateHeap12, 00137 LdrpTagAllocateHeap13, 00138 LdrpTagAllocateHeap14, 00139 LdrpTagAllocateHeap15, 00140 LdrpTagAllocateHeap16, 00141 LdrpTagAllocateHeap17, 00142 LdrpTagAllocateHeap18, 00143 LdrpTagAllocateHeap19, 00144 LdrpTagAllocateHeap20, 00145 LdrpTagAllocateHeap21, 00146 LdrpTagAllocateHeap22, 00147 LdrpTagAllocateHeap23, 00148 LdrpTagAllocateHeap24, 00149 LdrpTagAllocateHeap25, 00150 LdrpTagAllocateHeap26, 00151 LdrpTagAllocateHeap27, 00152 LdrpTagAllocateHeap28, 00153 LdrpTagAllocateHeap29, 00154 LdrpTagAllocateHeap30, 00155 LdrpTagAllocateHeap31, 00156 LdrpTagAllocateHeap32, 00157 LdrpTagAllocateHeap33, 00158 LdrpTagAllocateHeap34, 00159 LdrpTagAllocateHeap35, 00160 LdrpTagAllocateHeap36, 00161 LdrpTagAllocateHeap37, 00162 LdrpTagAllocateHeap38, 00163 LdrpTagAllocateHeap39, 00164 LdrpTagAllocateHeap40, 00165 LdrpTagAllocateHeap41, 00166 LdrpTagAllocateHeap42, 00167 LdrpTagAllocateHeap43, 00168 LdrpTagAllocateHeap44, 00169 LdrpTagAllocateHeap45, 00170 LdrpTagAllocateHeap46, 00171 LdrpTagAllocateHeap47, 00172 LdrpTagAllocateHeap48, 00173 LdrpTagAllocateHeap49, 00174 LdrpTagAllocateHeap50, 00175 LdrpTagAllocateHeap51, 00176 LdrpTagAllocateHeap52, 00177 LdrpTagAllocateHeap53, 00178 LdrpTagAllocateHeap54, 00179 LdrpTagAllocateHeap55, 00180 LdrpTagAllocateHeap56, 00181 LdrpTagAllocateHeap57, 00182 LdrpTagAllocateHeap58, 00183 LdrpTagAllocateHeap59, 00184 LdrpTagAllocateHeap60, 00185 LdrpTagAllocateHeap61, 00186 LdrpTagAllocateHeap62, 00187 LdrpTagAllocateHeap63 00188 }; 00189 00190 PVOID 00191 LdrpDefineDllTag( 00192 PWSTR TagName, 00193 PUSHORT TagIndex 00194 ) 00195 { 00196 PVOID Result; 00197 WCHAR TagNameBuffer[ 260 ]; 00198 00199 if (RtlpGlobalTagHeap == NULL) { 00200 RtlpGlobalTagHeap = RtlAllocateHeap( RtlProcessHeap( ), HEAP_ZERO_MEMORY, sizeof( HEAP )); 00201 if (RtlpGlobalTagHeap == NULL) { 00202 return NULL; 00203 } 00204 } 00205 00206 if (!LdrpDllTagsInitialized) { 00207 // 00208 // Keep QUERY.C happy 00209 // 00210 InitializeListHead( &RtlpGlobalTagHeap->VirtualAllocdBlocks ); 00211 LdrpDllTagsInitialized = TRUE; 00212 } 00213 00214 Result = NULL; 00215 if (LdrpNumberOfDllTags < LDRP_MAXIMUM_DLL_TAGS) { 00216 memset( TagNameBuffer, 0, sizeof( TagNameBuffer ) ); 00217 wcscpy( TagNameBuffer, TagName ); 00218 LdrpDllTags[ LdrpNumberOfDllTags ] = 00219 RtlCreateTagHeap( NULL, 00220 0, 00221 NULL, 00222 TagNameBuffer 00223 ); 00224 00225 if (LdrpDllTags[ LdrpNumberOfDllTags ] != 0) { 00226 Result = LdrpDllTagProcedures[ LdrpNumberOfDllTags ]; 00227 } 00228 00229 if (Result != NULL) { 00230 *TagIndex = (USHORT)(LdrpDllTags[ LdrpNumberOfDllTags ] >> HEAP_TAG_SHIFT); 00231 LdrpNumberOfDllTags += 1; 00232 } 00233 } 00234 00235 return Result; 00236 }

Generated on Sat May 15 19:40:16 2004 for test by doxygen 1.3.7