Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

237 lines
5.8 KiB

/* ---File: memutil.c -----------------------------------------------------
*
* Description:
* Contains Control Panel memory allocation routines.
*
* This document contains confidential/proprietary information.
* Copyright (c) 1990-1994 Microsoft Corporation, All Rights Reserved.
*
* Revision History:
* 6/3/94 [stevecat] Added ANSI only string allocators
*
* ---------------------------------------------------------------------- */
/* Notes -
Global Functions:
AllocMem () - Allocate a block of memory, with error checks
AllocStr () - Allocate memory for a string
AllocStrA () - Allocate memory for an ANSI string
FreeMem () - Check and free memory block allocated with AllocMem
FreeStr () - Free string memory allocated with AllocStr
FreeStrA () - Free string memory allocated with AllocStrA
ReallocMem () - Resize a memory block originally from AllocMem
ReallocStr () - Resize a string memory block from AllocStr
ReallocStrA () - Resize a string memory block from AllocStrA
Local Functions:
*/
//==========================================================================
// Include files
//==========================================================================
// C Runtime
#include <string.h>
#include <memory.h>
// Application specific
#include "main.h"
/////////////////////////////////////////////////////////////////////////////
//
// 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.
//
/////////////////////////////////////////////////////////////////////////////
LPVOID AllocMem (DWORD cb)
{
LPDWORD pMem;
DWORD cbNew;
cbNew = cb + 2 * sizeof(DWORD);
if (cbNew & 3)
cbNew += sizeof(DWORD) - (cbNew & 3);
pMem = (LPDWORD)LocalAlloc (LPTR, cbNew);
if (!pMem)
return NULL;
// memset (pMem, 0, cbNew); // This might go later if done in NT
*pMem = cb;
*(LPDWORD)((LPBYTE)pMem+cbNew-sizeof(DWORD)) = 0xdeadbeef;
return (LPVOID)(pMem+1);
}
BOOL FreeMem (LPVOID pMem, DWORD cb)
{
DWORD cbNew;
LPDWORD pNewMem;
TCHAR szError[128];
if (!pMem)
return TRUE;
pNewMem = pMem;
pNewMem--;
cbNew = cb+2*sizeof(DWORD);
if (cbNew & 3)
cbNew += sizeof(DWORD) - (cbNew & 3);
if ((*pNewMem != cb) ||
(*(LPDWORD)((LPBYTE)pNewMem + cbNew - sizeof(DWORD)) != 0xdeadbeef))
{
#if DBG
wsprintf (szError, TEXT("Corrupt Memory in Control Panel : %0lx\n"), pMem);
OutputDebugString(szError);
// DbgBreakPoint();
// Corrupt Memory in Control Panel - try to free it anyway
return FALSE;
#endif // DBG
}
return (((HLOCAL) pNewMem == LocalFree ((LPVOID)pNewMem)));
}
LPVOID ReallocMem (LPVOID lpOldMem, DWORD cbOld, DWORD cbNew)
{
LPVOID lpNewMem;
lpNewMem = AllocMem (cbNew);
if (lpOldMem)
{
memcpy (lpNewMem, lpOldMem, min(cbNew, cbOld));
FreeMem (lpOldMem, cbOld);
}
return lpNewMem;
}
/////////////////////////////////////////////////////////////////////////////
//
// Routine Description:
//
// These functions will allocate or reallocate enough local memory to
// store the specified string, and copy that string to the allocated
// memory. The FreeStr function frees memory that was initially
// allocated by AllocStr.
//
// 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 AllocStr (LPTSTR lpStr)
{
LPTSTR lpMem;
if (!lpStr)
return NULL;
if (lpMem = AllocMem (ByteCountOf(lstrlen(lpStr)+1)))
lstrcpy (lpMem, lpStr);
return lpMem;
}
BOOL FreeStr (LPTSTR lpStr)
{
return lpStr ? FreeMem (lpStr, ByteCountOf(lstrlen(lpStr)+1)) : FALSE;
}
BOOL ReallocStr (LPTSTR *plpStr, LPTSTR lpStr)
{
FreeStr (*plpStr);
*plpStr = AllocStr (lpStr);
return TRUE;
}
#ifdef ANSI_FUNCTIONS
/////////////////////////////////////////////////////////////////////////////
//
// Routine Descriptions:
//
// These functions will allocate or reallocate enough local memory to
// store the specified string, and copy that string to the allocated
// memory. The FreeStrA function frees memory that was initially
// allocated by AllocStrA.
//
// THESE ARE ANSI only string functions. UNICODE versions are above.
//
// 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.
//
/////////////////////////////////////////////////////////////////////////////
LPSTR AllocStrA (LPSTR lpStr)
{
LPSTR lpMem;
if (!lpStr)
return NULL;
if (lpMem = AllocMem (strlen(lpStr)+1))
strcpy (lpMem, lpStr);
return lpMem;
}
BOOL FreeStrA (LPSTR lpStr)
{
return lpStr ? FreeMem (lpStr, strlen(lpStr)+1) : FALSE;
}
BOOL ReallocStrA (LPSTR *plpStr, LPSTR lpStr)
{
if (FreeStrA (*plpStr))
{
if (*plpStr = AllocStrA (lpStr))
return TRUE;
}
return FALSE;
}
#endif // ANSI_FUNCTIONS