Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
2.1 KiB

4 years ago
  1. /*++
  2. Copyright (c) 1994 Microsoft Corporation
  3. All rights reserved.
  4. Module Name:
  5. Mem.cxx
  6. Abstract:
  7. Memory manipulations
  8. Author:
  9. Albert Ting (AlbertT) 20-May-1994
  10. Revision History:
  11. --*/
  12. #include "spllibp.hxx"
  13. #pragma hdrstop
  14. HANDLE ghMemHeap;
  15. #if DBG
  16. HANDLE ghDbgMemHeap;
  17. VBackTrace* gpbtAlloc;
  18. VBackTrace* gpbtFree;
  19. PVOID
  20. DbgAllocMem(
  21. UINT cbSize
  22. )
  23. {
  24. return HeapAlloc( ghDbgMemHeap, 0, cbSize );
  25. }
  26. VOID
  27. DbgFreeMem(
  28. PVOID pMem
  29. )
  30. {
  31. if( pMem ){
  32. HeapFree( ghDbgMemHeap, 0, pMem );
  33. }
  34. }
  35. #endif
  36. PVOID
  37. AllocMem(
  38. UINT cbSize
  39. )
  40. /*++
  41. Routine Description:
  42. Allocates memory. If CHECKMEM is defined, adds tail guard.
  43. Arguments:
  44. Return Value:
  45. --*/
  46. {
  47. #if defined( CHECKMEM ) || DBG
  48. PDWORD pMem;
  49. UINT cbNew;
  50. SPLASSERT( cbSize < 0x1000000 );
  51. cbNew = DWordAlign(cbSize+3*sizeof(DWORD));
  52. pMem = (PDWORD)HeapAlloc( ghMemHeap, 0, cbNew );
  53. if (!pMem) {
  54. DBGMSG( DBG_WARN,
  55. ( "AllocMem failed: size %x, %d\n",
  56. cbSize, ::GetLastError( )));
  57. return NULL;
  58. }
  59. FillMemory(pMem, cbNew, 0x83);
  60. pMem[0] = cbSize;
  61. #if DBG
  62. pMem[1] = gpbtAlloc ?
  63. (DWORD)gpbtAlloc->pvCapture( (DWORD)&pMem[2], cbSize ) :
  64. 0;
  65. #endif
  66. *(PDWORD)((PBYTE)pMem + cbNew - sizeof(DWORD)) = 0xdeadbeef;
  67. return (PVOID)(pMem+2);
  68. #else
  69. return (PVOID)HeapAlloc( ghMemHeap, 0, cbSize );
  70. #endif
  71. }
  72. VOID
  73. FreeMem(
  74. PVOID pMem
  75. )
  76. {
  77. if( !pMem ){
  78. return;
  79. }
  80. #if defined( CHECKMEM ) || DBG
  81. DWORD cbSize;
  82. PDWORD pNewMem;
  83. pNewMem = (PDWORD)pMem;
  84. pNewMem -= 2;
  85. cbSize = *pNewMem;
  86. if (*(PDWORD)((PBYTE)pMem + DWordAlign(cbSize)) != 0xdeadbeef) {
  87. DBGMSG( DBG_ERROR,
  88. ( "Corrupt Memory: %x size = 0x%x\n",
  89. pMem,
  90. cbSize ));
  91. } else {
  92. FillMemory(pNewMem, cbSize, 0x65);
  93. HeapFree( ghMemHeap, 0, (PVOID)pNewMem );
  94. #if DBG
  95. if( gpbtFree ){
  96. gpbtFree->pvCapture( (DWORD)pMem, cbSize );
  97. }
  98. #endif
  99. }
  100. #else
  101. HeapFree( ghMemHeap, 0, (PVOID)pMem );
  102. #endif
  103. }