194 lines
4 KiB
C
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);
|
|
}
|