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

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
heaptag.c
Abstract:
This module implements the support routines needed for FLG_HEAP_ENABLE_TAG_BY_DLL
Author:
Steve Wood (stevewo) 07-Apr-1995
Revision History:
--*/
#pragma warning(disable:4214) // bit field types other than int
#pragma warning(disable:4201) // nameless struct/union
#pragma warning(disable:4115) // named type definition in parentheses
#pragma warning(disable:4127) // condition expression is constant
#include <ntos.h>
#include "ldrp.h"
#include <stktrace.h>
#include <heap.h>
#include <stdio.h>
#define LDRP_MAXIMUM_DLL_TAGS 64
BOOLEAN LdrpDllTagsInitialized;
ULONG LdrpNumberOfDllTags;
ULONG LdrpBaseDllTag;
ULONG LdrpDllTags[ LDRP_MAXIMUM_DLL_TAGS ];
#define DEFINE_HEAPTAG_ENTRY( n ) \
PVOID LdrpTagAllocateHeap##n( PVOID h, ULONG f, ULONG s ) {return LdrpTagAllocateHeap( h, f, s, n ); }
PVOID
LdrpTagAllocateHeap(
IN PVOID HeapHandle,
IN ULONG Flags,
IN ULONG Size,
IN ULONG n
)
{
if ((Flags & HEAP_TAG_MASK) == 0) {
Flags |= LdrpDllTags[ n ];
}
return RtlAllocateHeap( HeapHandle, Flags, Size );
}
DEFINE_HEAPTAG_ENTRY( 0 );
DEFINE_HEAPTAG_ENTRY( 1 );
DEFINE_HEAPTAG_ENTRY( 2 );
DEFINE_HEAPTAG_ENTRY( 3 );
DEFINE_HEAPTAG_ENTRY( 4 );
DEFINE_HEAPTAG_ENTRY( 5 );
DEFINE_HEAPTAG_ENTRY( 6 );
DEFINE_HEAPTAG_ENTRY( 7 );
DEFINE_HEAPTAG_ENTRY( 8 );
DEFINE_HEAPTAG_ENTRY( 9 );
DEFINE_HEAPTAG_ENTRY( 10 );
DEFINE_HEAPTAG_ENTRY( 11 );
DEFINE_HEAPTAG_ENTRY( 12 );
DEFINE_HEAPTAG_ENTRY( 13 );
DEFINE_HEAPTAG_ENTRY( 14 );
DEFINE_HEAPTAG_ENTRY( 15 );
DEFINE_HEAPTAG_ENTRY( 16 );
DEFINE_HEAPTAG_ENTRY( 17 );
DEFINE_HEAPTAG_ENTRY( 18 );
DEFINE_HEAPTAG_ENTRY( 19 );
DEFINE_HEAPTAG_ENTRY( 20 );
DEFINE_HEAPTAG_ENTRY( 21 );
DEFINE_HEAPTAG_ENTRY( 22 );
DEFINE_HEAPTAG_ENTRY( 23 );
DEFINE_HEAPTAG_ENTRY( 24 );
DEFINE_HEAPTAG_ENTRY( 25 );
DEFINE_HEAPTAG_ENTRY( 26 );
DEFINE_HEAPTAG_ENTRY( 27 );
DEFINE_HEAPTAG_ENTRY( 28 );
DEFINE_HEAPTAG_ENTRY( 29 );
DEFINE_HEAPTAG_ENTRY( 30 );
DEFINE_HEAPTAG_ENTRY( 31 );
DEFINE_HEAPTAG_ENTRY( 32 );
DEFINE_HEAPTAG_ENTRY( 33 );
DEFINE_HEAPTAG_ENTRY( 34 );
DEFINE_HEAPTAG_ENTRY( 35 );
DEFINE_HEAPTAG_ENTRY( 36 );
DEFINE_HEAPTAG_ENTRY( 37 );
DEFINE_HEAPTAG_ENTRY( 38 );
DEFINE_HEAPTAG_ENTRY( 39 );
DEFINE_HEAPTAG_ENTRY( 40 );
DEFINE_HEAPTAG_ENTRY( 41 );
DEFINE_HEAPTAG_ENTRY( 42 );
DEFINE_HEAPTAG_ENTRY( 43 );
DEFINE_HEAPTAG_ENTRY( 44 );
DEFINE_HEAPTAG_ENTRY( 45 );
DEFINE_HEAPTAG_ENTRY( 46 );
DEFINE_HEAPTAG_ENTRY( 47 );
DEFINE_HEAPTAG_ENTRY( 48 );
DEFINE_HEAPTAG_ENTRY( 49 );
DEFINE_HEAPTAG_ENTRY( 50 );
DEFINE_HEAPTAG_ENTRY( 51 );
DEFINE_HEAPTAG_ENTRY( 52 );
DEFINE_HEAPTAG_ENTRY( 53 );
DEFINE_HEAPTAG_ENTRY( 54 );
DEFINE_HEAPTAG_ENTRY( 55 );
DEFINE_HEAPTAG_ENTRY( 56 );
DEFINE_HEAPTAG_ENTRY( 57 );
DEFINE_HEAPTAG_ENTRY( 58 );
DEFINE_HEAPTAG_ENTRY( 59 );
DEFINE_HEAPTAG_ENTRY( 60 );
DEFINE_HEAPTAG_ENTRY( 61 );
DEFINE_HEAPTAG_ENTRY( 62 );
DEFINE_HEAPTAG_ENTRY( 63 );
typedef PVOID (*PLDRP_DLL_TAG_PROCEDURE)(
PVOID HeapHandle,
ULONG Flags,
ULONG Size
);
const PLDRP_DLL_TAG_PROCEDURE LdrpDllTagProcedures[ LDRP_MAXIMUM_DLL_TAGS ] = {
LdrpTagAllocateHeap0,
LdrpTagAllocateHeap1,
LdrpTagAllocateHeap2,
LdrpTagAllocateHeap3,
LdrpTagAllocateHeap4,
LdrpTagAllocateHeap5,
LdrpTagAllocateHeap6,
LdrpTagAllocateHeap7,
LdrpTagAllocateHeap8,
LdrpTagAllocateHeap9,
LdrpTagAllocateHeap10,
LdrpTagAllocateHeap11,
LdrpTagAllocateHeap12,
LdrpTagAllocateHeap13,
LdrpTagAllocateHeap14,
LdrpTagAllocateHeap15,
LdrpTagAllocateHeap16,
LdrpTagAllocateHeap17,
LdrpTagAllocateHeap18,
LdrpTagAllocateHeap19,
LdrpTagAllocateHeap20,
LdrpTagAllocateHeap21,
LdrpTagAllocateHeap22,
LdrpTagAllocateHeap23,
LdrpTagAllocateHeap24,
LdrpTagAllocateHeap25,
LdrpTagAllocateHeap26,
LdrpTagAllocateHeap27,
LdrpTagAllocateHeap28,
LdrpTagAllocateHeap29,
LdrpTagAllocateHeap30,
LdrpTagAllocateHeap31,
LdrpTagAllocateHeap32,
LdrpTagAllocateHeap33,
LdrpTagAllocateHeap34,
LdrpTagAllocateHeap35,
LdrpTagAllocateHeap36,
LdrpTagAllocateHeap37,
LdrpTagAllocateHeap38,
LdrpTagAllocateHeap39,
LdrpTagAllocateHeap40,
LdrpTagAllocateHeap41,
LdrpTagAllocateHeap42,
LdrpTagAllocateHeap43,
LdrpTagAllocateHeap44,
LdrpTagAllocateHeap45,
LdrpTagAllocateHeap46,
LdrpTagAllocateHeap47,
LdrpTagAllocateHeap48,
LdrpTagAllocateHeap49,
LdrpTagAllocateHeap50,
LdrpTagAllocateHeap51,
LdrpTagAllocateHeap52,
LdrpTagAllocateHeap53,
LdrpTagAllocateHeap54,
LdrpTagAllocateHeap55,
LdrpTagAllocateHeap56,
LdrpTagAllocateHeap57,
LdrpTagAllocateHeap58,
LdrpTagAllocateHeap59,
LdrpTagAllocateHeap60,
LdrpTagAllocateHeap61,
LdrpTagAllocateHeap62,
LdrpTagAllocateHeap63
};
PVOID
LdrpDefineDllTag (
PWSTR TagName,
PUSHORT TagIndex
)
{
PVOID Result;
WCHAR TagNameBuffer[ 260 ];
if (RtlpGlobalTagHeap == NULL) {
RtlpGlobalTagHeap = RtlAllocateHeap( RtlProcessHeap( ), HEAP_ZERO_MEMORY, sizeof( HEAP ));
if (RtlpGlobalTagHeap == NULL) {
return NULL;
}
}
if (!LdrpDllTagsInitialized) {
//
// Keep QUERY.C happy
//
InitializeListHead( &RtlpGlobalTagHeap->VirtualAllocdBlocks );
LdrpDllTagsInitialized = TRUE;
}
Result = NULL;
if (LdrpNumberOfDllTags < LDRP_MAXIMUM_DLL_TAGS) {
memset( TagNameBuffer, 0, sizeof( TagNameBuffer ) );
wcsncpy( TagNameBuffer, TagName, ( sizeof( TagNameBuffer ) / sizeof( TagNameBuffer[0] ) ) - 1 );
LdrpDllTags[ LdrpNumberOfDllTags ] =
RtlCreateTagHeap( NULL,
0,
NULL,
TagNameBuffer
);
if (LdrpDllTags[ LdrpNumberOfDllTags ] != 0) {
Result = (PVOID) (ULONG_PTR) LdrpDllTagProcedures[ LdrpNumberOfDllTags ];
}
if (Result != NULL) {
*TagIndex = (USHORT)(LdrpDllTags[ LdrpNumberOfDllTags ] >> HEAP_TAG_SHIFT);
LdrpNumberOfDllTags += 1;
}
}
return Result;
}