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
|
||
//
|