windows-nt/Source/XPSP1/NT/shell/osshell/control/ups/memutil.c
2020-09-26 16:20:57 +08:00

194 lines
4 KiB
C

/* ---File: memutil.c -----------------------------------------------------
*
* Description:
* Contains Control Panel memory allocation routines.
*
* This document contains confidential/proprietary information.
* Copyright (c) 1990-1992 Microsoft Corporation, All Rights Reserved.
*
* Revision History:
*
* ---------------------------------------------------------------------- */
/* Notes -
Global Functions:
AllocMem () -
AllocStr () -
FreeMem () -
FreeStr () -
ReallocMem () -
ReallocStr () -
Local Functions:
*/
//==========================================================================
// Include files
//==========================================================================
// C Runtime
#include <string.h>
#include <memory.h>
// Application specific
#include "ups.h"
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;
LPVOID pRet = NULL;
cbNew = cb+2*sizeof(DWORD);
if (cbNew & 3)
cbNew += sizeof(DWORD) - (cbNew & 3);
// pMem = (LPDWORD)HeapAlloc (hHeap, 0, cbNew);
pMem = (LPDWORD)LocalAlloc (LMEM_FIXED, cbNew);
if (pMem)
{
memset (pMem, 0, cbNew); // This might go later if done in NT
*pMem = cb;
*(LPDWORD)((LPTSTR)pMem+cbNew-sizeof(DWORD)) = 0xdeadbeef;
pRet = (LPVOID)(pMem+1);
}
return pRet;
}
BOOL FreeMem (LPVOID pMem, DWORD cb)
{
DWORD cbNew;
LPDWORD pNewMem;
if (!pMem)
return TRUE;
pNewMem = pMem;
pNewMem--;
cbNew = cb+2*sizeof(DWORD);
if (cbNew & 3)
cbNew += sizeof(DWORD) - (cbNew & 3);
#ifdef DEBU
if ((*pNewMem != cb) ||
(*(LPDWORD)((LPTSTR)pNewMem + cbNew - sizeof(DWORD)) != 0xdeadbeef))
{
OutputDebugStringA("Corrupt Memory in Control Panel : %0lx\n");
DbgBreakPoint();
}
#endif
return (((HLOCAL) pNewMem == LocalFree ((LPVOID)pNewMem)));
}
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 0;
if (lpMem = AllocMem (strlen (lpStr) + sizeof(TCHAR)))
strcpy (lpMem, lpStr);
return lpMem;
}
BOOL FreeStr (LPTSTR lpStr)
{
return lpStr ? FreeMem (lpStr, strlen (lpStr) + sizeof(TCHAR)) : FALSE;
}
BOOL ReallocStr (LPTSTR *plpStr, LPTSTR lpStr)
{
FreeStr (*plpStr);
*plpStr = AllocStr (lpStr);
return TRUE;
}
int MyMessageBox (HWND hWnd, DWORD wText, DWORD wCaption, DWORD wType, ...)
{
char szText[256+PATHMAX], szCaption[256];
int ival;
va_list parg;
va_start (parg, wType);
if (wText == LSFAIL)
goto NoMem;
if (!LoadString(hModule, wText, szCaption, sizeof (szCaption)))
goto NoMem;
wvsprintf(szText, szCaption, parg);
if (!LoadString(hModule, wCaption, szCaption, sizeof (szCaption)))
goto NoMem;
if ((ival = MessageBox(hWnd, szText, szCaption, wType)) == 0)
goto NoMem;
return(ival);
NoMem:
va_end (parg);
ErrLoadString(hWnd);
return 0;
}
void ErrLoadString (HWND hParent)
{
MessageBox (hParent, szErrLS, szCtlPanel, MB_OK | MB_ICONHAND | MB_SYSTEMMODAL);
}
void ErrMemDlg (HWND hParent)
{
MessageBox (hParent, szErrMem, szCtlPanel, MB_OK | MB_ICONHAND | MB_SYSTEMMODAL);
}