188 lines
3.5 KiB
C
188 lines
3.5 KiB
C
|
/* ---File: alloc.c -------------------------------------------------------
|
|||
|
*
|
|||
|
* Description:
|
|||
|
* Contains memory allocation routines.
|
|||
|
*
|
|||
|
* This document contains confidential/proprietary information.
|
|||
|
* Copyright (c) 1990-1994 Microsoft Corporation, All Rights Reserved.
|
|||
|
*
|
|||
|
* Revision History:
|
|||
|
*
|
|||
|
* ---------------------------------------------------------------------- */
|
|||
|
/* Notes -
|
|||
|
|
|||
|
Global Functions:
|
|||
|
|
|||
|
AllocMem () -
|
|||
|
AllocStr () -
|
|||
|
FreeMem () -
|
|||
|
FreeStr () -
|
|||
|
ReallocMem () -
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
#include <windows.h>
|
|||
|
#include "mplayer.h"
|
|||
|
|
|||
|
|
|||
|
#ifdef _DEBUG
|
|||
|
|
|||
|
LPVOID AllocMem( DWORD cb )
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function will allocate local memory. It will possibly allocate extra
|
|||
|
memory and fill this with debugging information for the debugging version.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
cb - The amount of memory to allocate
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NON-NULL - A pointer to the allocated memory
|
|||
|
|
|||
|
FALSE/NULL - The operation failed. Extended error status is available
|
|||
|
using GetLastError.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
LPDWORD pMem;
|
|||
|
DWORD cbNew;
|
|||
|
|
|||
|
cbNew = cb + 2 * sizeof( DWORD );
|
|||
|
|
|||
|
if( cbNew & 3 )
|
|||
|
cbNew += sizeof( DWORD ) - ( cbNew & 3 );
|
|||
|
|
|||
|
pMem = (LPDWORD)LocalAlloc (LPTR | LMEM_ZEROINIT, cbNew );
|
|||
|
|
|||
|
if( !pMem )
|
|||
|
{
|
|||
|
DPF0( "LocalAlloc failed.\n" );
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
*pMem=cb;
|
|||
|
|
|||
|
*(LPDWORD)( (LPBYTE)pMem + cbNew - sizeof( DWORD ) ) = 0xdeadbeef;
|
|||
|
|
|||
|
DPF4( "Allocated %d bytes @%08x\n", cbNew, pMem );
|
|||
|
|
|||
|
return (LPVOID)( pMem + 1 );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID FreeMem( LPVOID pMem, DWORD cb )
|
|||
|
{
|
|||
|
DWORD cbNew;
|
|||
|
LPDWORD pNewMem;
|
|||
|
|
|||
|
if( !pMem )
|
|||
|
return;
|
|||
|
|
|||
|
pNewMem = pMem;
|
|||
|
pNewMem--;
|
|||
|
|
|||
|
cbNew = *pNewMem + 2 * sizeof( DWORD );
|
|||
|
|
|||
|
if( cbNew & 3 )
|
|||
|
cbNew += sizeof( DWORD ) - ( cbNew & 3 );
|
|||
|
|
|||
|
/* Check that the size the caller thinks the block is tallies with
|
|||
|
* the size we placed before beginning of the block, and that the
|
|||
|
* end of the block has our signature:
|
|||
|
*/
|
|||
|
if( ( cb && ( *pNewMem != cb ) ) || /* If cb == 0, don't worry about this check */
|
|||
|
( *(LPDWORD)( (LPBYTE)pNewMem + cbNew - sizeof( DWORD ) ) != 0xdeadbeef ) )
|
|||
|
{
|
|||
|
DPF0( "Corrupt Memory detected freeing block: %0lx\n", pNewMem );
|
|||
|
#ifdef DEBUG
|
|||
|
DebugBreak();
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
memset( pNewMem, 0xFE, cbNew ); // Mark frEEd blocks
|
|||
|
|
|||
|
DPF4( "Freed %d bytes @%08x\n", cbNew, pNewMem );
|
|||
|
|
|||
|
LocalFree((HANDLE) pNewMem );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LPVOID ReallocMem( LPVOID lpOldMem, DWORD cbOld, DWORD cbNew )
|
|||
|
{
|
|||
|
LPVOID lpNewMem;
|
|||
|
|
|||
|
lpNewMem = AllocMem( cbNew );
|
|||
|
|
|||
|
if( lpOldMem )
|
|||
|
{
|
|||
|
if( lpNewMem )
|
|||
|
{
|
|||
|
memcpy( lpNewMem, lpOldMem, min( cbNew, cbOld ) );
|
|||
|
}
|
|||
|
|
|||
|
FreeMem( lpOldMem, cbOld );
|
|||
|
}
|
|||
|
|
|||
|
return lpNewMem;
|
|||
|
}
|
|||
|
|
|||
|
#endif // debug
|
|||
|
|
|||
|
|
|||
|
LPTSTR AllocStr( LPTSTR lpStr )
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function will allocate enough local memory to store the specified
|
|||
|
string, and copy that string to the allocated memory
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
lpStr - Pointer to the string that needs to be allocated and stored
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NON-NULL - A pointer to the allocated memory containing the string
|
|||
|
|
|||
|
FALSE/NULL - The operation failed. Extended error status is available
|
|||
|
using GetLastError.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
LPTSTR lpMem;
|
|||
|
|
|||
|
if( !lpStr )
|
|||
|
return NULL;
|
|||
|
|
|||
|
lpMem = AllocMem( STRING_BYTE_COUNT( lpStr ) );
|
|||
|
|
|||
|
if( lpMem )
|
|||
|
lstrcpy( lpMem, lpStr );
|
|||
|
|
|||
|
return lpMem;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID FreeStr( LPTSTR lpStr )
|
|||
|
{
|
|||
|
FreeMem( lpStr, STRING_BYTE_COUNT( lpStr ) );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID ReallocStr( LPTSTR *plpStr, LPTSTR lpStr )
|
|||
|
{
|
|||
|
FreeStr( *plpStr );
|
|||
|
*plpStr = AllocStr( lpStr );
|
|||
|
}
|
|||
|
|
|||
|
|