293 lines
4 KiB
C
293 lines
4 KiB
C
/*++
|
||
|
||
Copyright (c) 1997-2000 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"
|
||
|
||
|
||
//
|
||
// Memory allocation
|
||
//
|
||
// Some DNS library functions -- including the IP array and string utils
|
||
// -- allocate memory. This memory allocation defaults to routines that
|
||
// use LocalAlloc, LocalReAlloc, LocalFree.
|
||
//
|
||
// Dns_Api.dll users can reset the memory allocation through
|
||
// Dns_ApiHeapReset(), which saves pointers to remote allocation functions
|
||
// which will override default allocators.
|
||
//
|
||
|
||
//
|
||
// Allow overide of default memory allocation
|
||
//
|
||
|
||
DNSLIB_ALLOC_FUNCTION pDnsAllocFunction = NULL;
|
||
DNSLIB_REALLOC_FUNCTION pDnsReallocFunction = NULL;
|
||
DNSLIB_FREE_FUNCTION pDnsFreeFunction = NULL;
|
||
|
||
|
||
|
||
VOID
|
||
Dns_LibHeapReset(
|
||
IN DNSLIB_ALLOC_FUNCTION pAlloc,
|
||
IN DNSLIB_REALLOC_FUNCTION pRealloc,
|
||
IN DNSLIB_FREE_FUNCTION pFree
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Resets heap routines used by dnsapi.dll routines.
|
||
|
||
Arguments:
|
||
|
||
pAlloc -- ptr to desired alloc function
|
||
pRealloc -- ptr to desired realloc function
|
||
pFree -- ptr to desired free function
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
pDnsAllocFunction = pAlloc;
|
||
pDnsReallocFunction = pRealloc;
|
||
pDnsFreeFunction = pFree;
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// Exported public memory routines.
|
||
//
|
||
// These use whatever the current memory allocation routines are, and
|
||
// hence will always handle memory in the same fashion as dnsapi.dll
|
||
// internal routines.
|
||
//
|
||
|
||
PVOID
|
||
Dns_Alloc(
|
||
IN INT iSize
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Allocates memory.
|
||
|
||
Arguments:
|
||
|
||
iSize - number of bytes to allocate
|
||
|
||
Return Value:
|
||
|
||
Pointer to memory allocated.
|
||
NULL if allocation fails.
|
||
|
||
--*/
|
||
{
|
||
if ( pDnsAllocFunction )
|
||
{
|
||
return (*pDnsAllocFunction)( iSize );
|
||
}
|
||
|
||
// default
|
||
|
||
return LocalAlloc( LPTR, iSize );
|
||
}
|
||
|
||
|
||
|
||
PVOID
|
||
Dns_Realloc(
|
||
IN OUT PVOID pMem,
|
||
IN INT iSize
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Reallocates memory
|
||
|
||
Arguments:
|
||
|
||
pMem - ptr to existing memory to reallocated
|
||
iSize - number of bytes to reallocate
|
||
|
||
Return Value:
|
||
|
||
Pointer to memory allocated.
|
||
NULL if allocation fails.
|
||
|
||
--*/
|
||
{
|
||
if ( pDnsReallocFunction )
|
||
{
|
||
return (*pDnsReallocFunction)( pMem, iSize );
|
||
}
|
||
|
||
// default
|
||
|
||
return LocalReAlloc( pMem, iSize, 0 );
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
Dns_Free(
|
||
IN OUT PVOID pMem
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Free memory
|
||
|
||
Arguments:
|
||
|
||
pMem - ptr to existing memory to reallocated
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
{
|
||
|
||
if ( !pMem )
|
||
{
|
||
return;
|
||
}
|
||
if ( pDnsFreeFunction )
|
||
{
|
||
(*pDnsFreeFunction)( pMem );
|
||
return;
|
||
}
|
||
|
||
// default
|
||
|
||
LocalFree( pMem );
|
||
}
|
||
|
||
|
||
|
||
PVOID
|
||
Dns_AllocZero(
|
||
IN INT iSize
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Allocates and zeros memory.
|
||
|
||
Arguments:
|
||
|
||
iSize - number of bytes to allocate
|
||
|
||
Return Value:
|
||
|
||
Pointer to memory allocated.
|
||
NULL if allocation fails.
|
||
|
||
--*/
|
||
{
|
||
if ( pDnsAllocFunction )
|
||
{
|
||
PCHAR ptr;
|
||
|
||
ptr = (*pDnsAllocFunction)( iSize );
|
||
if ( !ptr )
|
||
{
|
||
return( NULL );
|
||
}
|
||
RtlZeroMemory( ptr, iSize );
|
||
return( ptr );
|
||
}
|
||
|
||
// default
|
||
|
||
return LocalAlloc( LPTR, iSize );
|
||
}
|
||
|
||
|
||
|
||
|
||
//
|
||
// Helpful util
|
||
//
|
||
|
||
PVOID
|
||
Dns_AllocMemCopy(
|
||
IN PVOID pMem,
|
||
IN INT Size
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Allocates and copies memory
|
||
|
||
Arguments:
|
||
|
||
pMem - memory to copy
|
||
|
||
Size - number of bytes to allocate
|
||
|
||
Return Value:
|
||
|
||
Pointer to memory allocated.
|
||
NULL if allocation fails.
|
||
|
||
--*/
|
||
{
|
||
PBYTE ptr;
|
||
|
||
ptr = Dns_Alloc( Size );
|
||
|
||
if ( ptr )
|
||
{
|
||
if ( pMem )
|
||
{
|
||
RtlCopyMemory(
|
||
ptr,
|
||
pMem,
|
||
Size );
|
||
}
|
||
else
|
||
{
|
||
RtlZeroMemory( ptr, Size );
|
||
}
|
||
}
|
||
return ptr;
|
||
}
|
||
|
||
//
|
||
// End of memory.c
|
||
//
|
||
|
||
|
||
|
||
|
||
|