home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / netds / adsi / sampprov / memory.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-29  |  2.6 KB  |  171 lines

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