/* ---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 #include // 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); }