MEMORY.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:3k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1996 Microsoft Corporation
  3. Module Name:
  4.     Memory.cpp
  5. Abstract:
  6.     This module provides all the memory management functions for all Sample
  7.     provider components
  8. Author:
  9. Environment:
  10.     User mode
  11. Revision History :
  12. --*/
  13. #include "adssmp.h"
  14. #define WORD_ALIGN_DOWN(addr) ((LPBYTE)((DWORD)addr &= ~1))
  15. #define DWORD_ALIGN_UP(size) ((size+3)&~3)
  16. LPVOID
  17. AllocProvMem(
  18.     DWORD cb
  19. )
  20. {
  21.     LPDWORD  pMem;
  22.     DWORD    cbNew ;
  23. #if DBG
  24.     cb = DWORD_ALIGN_UP(cb);
  25.     cbNew = cb + (sizeof(DWORD) + sizeof(LONGLONG));
  26. #else
  27.     cbNew = cb ;
  28. #endif
  29.     pMem=(LPDWORD)LocalAlloc(LPTR, cbNew);
  30. #if DBG
  31.     if (!pMem) {
  32.         SetLastError(ERROR_NOT_ENOUGH_MEMORY);
  33.         return 0;
  34.     }
  35.     *pMem=cb;
  36.     *(LPDWORD)((LPBYTE)pMem+cbNew-sizeof(DWORD))=0xdeadfeed;
  37.     pMem = (LPDWORD) (((LPBYTE)pMem)+sizeof(LONGLONG));
  38. #endif
  39.     return (LPVOID)(pMem);
  40. }
  41. BOOL
  42. FreeProvMem(
  43.    LPVOID pMem
  44. )
  45. {
  46.     LPBYTE   pNewMem;
  47.     pNewMem = (LPBYTE)pMem;
  48. #if DBG
  49.     DWORD    cb;
  50.     DWORD    cbNew = 0;
  51.     pNewMem -= sizeof(LONGLONG) ;
  52.     cb = *((LPDWORD)pNewMem);
  53.     cbNew = cb + sizeof(DWORD) + sizeof(LONGLONG);
  54.     if (*(LPDWORD)(pNewMem + cbNew - sizeof(DWORD)) != 0xdeadbeef) {
  55.         ADsAssert(!"Freeing memory not allocated by AllocProvMem") ;
  56.         return FALSE;
  57.     }
  58.     // fill freed memory with known pattern
  59.     memset(pMem, 0x5C, cb);
  60. #endif
  61.     return(LocalFree((LPVOID)pNewMem) == NULL);
  62. }
  63. LPVOID
  64. ReallocProvMem(
  65.    LPVOID pOldMem,
  66.    DWORD cbOld,
  67.    DWORD cbNew
  68. )
  69. {
  70.     LPVOID pNewMem;
  71.     pNewMem=AllocProvMem(cbNew);
  72.     if (pOldMem && pNewMem) {
  73.         memcpy(pNewMem, pOldMem, min(cbNew, cbOld));
  74.         FreeProvMem(pOldMem);
  75.     }
  76.     return pNewMem;
  77. }
  78. LPWSTR
  79. AllocProvStr(
  80.     LPWSTR pStr
  81. )
  82. {
  83.    LPWSTR pMem;
  84.    if (!pStr)
  85.       return 0;
  86.    if (pMem = (LPWSTR)AllocProvMem( wcslen(pStr)*sizeof(WCHAR) + sizeof(WCHAR) ))
  87.       wcscpy(pMem, pStr);
  88.    return pMem;
  89. }
  90. BOOL
  91. FreeProvStr(
  92.    LPWSTR pStr
  93. )
  94. {
  95.    return pStr ? FreeProvMem(pStr)
  96.                : FALSE;
  97. }
  98. BOOL
  99. ReallocProvStr(
  100.    LPWSTR *ppStr,
  101.    LPWSTR pStr
  102. )
  103. {
  104.    FreeProvStr(*ppStr);
  105.    *ppStr=AllocProvStr(pStr);
  106.    return TRUE;
  107. }
  108. STDAPI
  109. ProvAllocString(const OLECHAR * pch, BSTR * pBSTR)
  110. {
  111.     HRESULT hr = S_OK;
  112.     ADsAssert(pBSTR);
  113.     if (!pch)
  114.     {
  115.         *pBSTR = NULL;
  116.         return S_OK;
  117.     }
  118.     *pBSTR = SysAllocString(pch);
  119.     hr = (*pBSTR) ? S_OK : E_OUTOFMEMORY;
  120.     RRETURN(hr);
  121. }