windows-nt/Source/XPSP1/NT/ds/dns/dnsapi/memory.c

332 lines
5.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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
//