332 lines
5.8 KiB
C
332 lines
5.8 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1997-2001 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
memory.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Domain Name System (DNS) Library
|
|||
|
|
|||
|
Memory allocation routines for DNS library.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jim Gilroy (jamesg) January, 1997
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#include "local.h"
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Private default dnsapi heap.
|
|||
|
//
|
|||
|
// Use non-process heap just so i don't have to debug a stress
|
|||
|
// failure every time some yahoo corrupts their heap.
|
|||
|
//
|
|||
|
|
|||
|
HEAP_BLOB g_DnsApiHeap;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Heap flags
|
|||
|
//
|
|||
|
|
|||
|
#if DBG
|
|||
|
#define DNS_HEAP_FLAGS \
|
|||
|
( HEAP_GROWABLE | \
|
|||
|
HEAP_TAIL_CHECKING_ENABLED | \
|
|||
|
HEAP_FREE_CHECKING_ENABLED | \
|
|||
|
HEAP_CREATE_ALIGN_16 | \
|
|||
|
HEAP_CLASS_1 )
|
|||
|
#else
|
|||
|
#define DNS_HEAP_FLAGS \
|
|||
|
( HEAP_GROWABLE | \
|
|||
|
HEAP_CREATE_ALIGN_16 | \
|
|||
|
HEAP_CLASS_1 )
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
Heap_Initialize(
|
|||
|
VOID
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize heap routines.
|
|||
|
|
|||
|
MUST call this in dnsapi.dll attach.
|
|||
|
Note this doesn't actually create the heap. For perf, don't
|
|||
|
do that until we actually get called.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
#ifdef PRIVATE_DNSHEAP
|
|||
|
//
|
|||
|
// use dnslib debug heap as private heap
|
|||
|
//
|
|||
|
|
|||
|
LOCK_GENERAL();
|
|||
|
|
|||
|
Dns_HeapInitialize(
|
|||
|
& g_DnsApiHeap,
|
|||
|
NULL, // no existing heap handle
|
|||
|
DNS_HEAP_FLAGS, // create flags
|
|||
|
#if DBG
|
|||
|
TRUE, // use debug headers
|
|||
|
#else
|
|||
|
FALSE, // no debug headers
|
|||
|
#endif
|
|||
|
TRUE, // dnslib uses this heap
|
|||
|
TRUE, // full heap checks
|
|||
|
0, // no exception
|
|||
|
0, // no default flags
|
|||
|
"dnslib", // bogus file
|
|||
|
0 // bogus line no
|
|||
|
);
|
|||
|
|
|||
|
UNLOCK_GENERAL();
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
Heap_Cleanup(
|
|||
|
VOID
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Delete heap.
|
|||
|
|
|||
|
Need this to allow restart.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
#ifdef PRIVATE_DNSHEAP
|
|||
|
//
|
|||
|
// delete private heap
|
|||
|
//
|
|||
|
|
|||
|
DNSDBG( ANY, ( "Heap_Cleanup()\n" ));
|
|||
|
|
|||
|
Dns_HeapCleanup( &g_DnsApiHeap );
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Exported routines
|
|||
|
//
|
|||
|
|
|||
|
VOID
|
|||
|
DnsApiHeapReset(
|
|||
|
IN DNS_ALLOC_FUNCTION pAlloc,
|
|||
|
IN DNS_REALLOC_FUNCTION pRealloc,
|
|||
|
IN DNS_FREE_FUNCTION pFree
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Resets heap routines used by dnsapi.dll routines.
|
|||
|
|
|||
|
DnsApi.dll allocates memory using the dnslib.lib heap
|
|||
|
routines. This simply resets those routines to use pointers
|
|||
|
to users heap routines.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pAlloc -- ptr to desired alloc function
|
|||
|
pRealloc -- ptr to desired realloc function
|
|||
|
pFree -- ptr to desired free function
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
// redirect heap for dnslib
|
|||
|
|
|||
|
Dns_LibHeapReset( pAlloc, pRealloc, pFree );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// External access to DNS memory routines.
|
|||
|
//
|
|||
|
// Modules that use DNS API memory and can be called in the context
|
|||
|
// of DNS server or other process which points dnsapi.dll at another
|
|||
|
// heap, should use these routines rather than LocalAlloc\Free().
|
|||
|
//
|
|||
|
// Note: that these routines can simply call the dnslib routines.
|
|||
|
// This is because dnsapi ALWAYS keeps its heap in sync with dnslib
|
|||
|
// whether it is default heap or has been redirected. Since dnslib
|
|||
|
// heap routines have the redirection check, we can just call them
|
|||
|
// and they'll do the right thing, we don't need a redirection check
|
|||
|
// ourselves.
|
|||
|
//
|
|||
|
|
|||
|
PVOID
|
|||
|
DnsApiAlloc(
|
|||
|
IN INT iSize
|
|||
|
)
|
|||
|
{
|
|||
|
return Dns_Alloc( iSize );
|
|||
|
}
|
|||
|
|
|||
|
PVOID
|
|||
|
DnsApiRealloc(
|
|||
|
IN OUT PVOID pMem,
|
|||
|
IN INT iSize
|
|||
|
)
|
|||
|
{
|
|||
|
return Dns_Realloc( pMem, iSize );
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
DnsApiFree(
|
|||
|
IN OUT PVOID pMem
|
|||
|
)
|
|||
|
{
|
|||
|
Dns_Free( pMem );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// SDK public free
|
|||
|
//
|
|||
|
// Extensions to DNS_FREE_TYPE enum in windns.h to handle
|
|||
|
// system-public structures.
|
|||
|
// These are only used if freeing with DnsFree(), if using
|
|||
|
// DnsFreeConfigStructure() then use the ConfigId directly.
|
|||
|
//
|
|||
|
// For convenience free type is the same as the config id.
|
|||
|
// If this changes must change DnsFreeConfigStructure()
|
|||
|
// to do mapping.
|
|||
|
//
|
|||
|
|
|||
|
// These conflict with old function defs, so must undef
|
|||
|
#undef DnsFreeNetworkInformation
|
|||
|
#undef DnsFreeSearchInformation
|
|||
|
#undef DnsFreeAdapterInformation
|
|||
|
|
|||
|
#define DnsFreeNetworkInformation (DNS_FREE_TYPE)DnsConfigNetworkInformation
|
|||
|
#define DnsFreeSearchInformation (DNS_FREE_TYPE)DnsConfigSearchInformation
|
|||
|
#define DnsFreeAdapterInformation (DNS_FREE_TYPE)DnsConfigAdapterInformation
|
|||
|
#define DnsFreeNetInfo (DNS_FREE_TYPE)DnsConfigNetInfo
|
|||
|
|
|||
|
VOID
|
|||
|
WINAPI
|
|||
|
DnsFree(
|
|||
|
IN OUT PVOID pData,
|
|||
|
IN DNS_FREE_TYPE FreeType
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Generic DNS data free.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pData -- data to free
|
|||
|
|
|||
|
FreeType -- free type
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DNSDBG( TRACE, (
|
|||
|
"DnsFree( %p, %d )\n",
|
|||
|
pData,
|
|||
|
FreeType ));
|
|||
|
|
|||
|
if ( !pData )
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// free appropriate type
|
|||
|
//
|
|||
|
|
|||
|
switch ( FreeType )
|
|||
|
{
|
|||
|
case DnsFreeFlat:
|
|||
|
|
|||
|
DnsApiFree( pData );
|
|||
|
break;
|
|||
|
|
|||
|
case DnsFreeRecordList:
|
|||
|
|
|||
|
Dns_RecordListFree( (PDNS_RECORD)pData );
|
|||
|
break;
|
|||
|
|
|||
|
case DnsFreeNetworkInformation:
|
|||
|
|
|||
|
FreeNetworkInformation( pData );
|
|||
|
break;
|
|||
|
|
|||
|
case DnsFreeSearchInformation:
|
|||
|
|
|||
|
FreeSearchInformation( pData );
|
|||
|
break;
|
|||
|
|
|||
|
case DnsFreeAdapterInformation:
|
|||
|
|
|||
|
FreeAdapterInformation( pData );
|
|||
|
break;
|
|||
|
|
|||
|
case DnsFreeNetInfo:
|
|||
|
|
|||
|
NetInfo_Free( pData );
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
|
|||
|
ASSERT( FALSE );
|
|||
|
DnsApiFree( pData );
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// End memory.c
|
|||
|
//
|