00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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 }