Leaked source code of windows server 2003
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.

182 lines
4.0 KiB

  1. /*
  2. * V M E M . C
  3. *
  4. * Virtual Memory Utilities
  5. *
  6. * Copyright 1993-1997 Microsoft Corporation. All Rights Reserved.
  7. */
  8. #pragma warning(disable:4206) /* empty source file */
  9. #if defined(DBG) && defined(_X86_)
  10. #pragma warning(disable:4001) /* single line comments */
  11. #pragma warning(disable:4001) /* single line comments */
  12. #pragma warning(disable:4050) /* different code attributes */
  13. #pragma warning(disable:4100) /* unreferenced formal parameter */
  14. #pragma warning(disable:4115) /* named type definition in parentheses */
  15. #pragma warning(disable:4115) /* named type definition in parentheses */
  16. #pragma warning(disable:4127) /* conditional expression is constant */
  17. #pragma warning(disable:4201) /* nameless struct/union */
  18. #pragma warning(disable:4206) /* translation unit is empty */
  19. #pragma warning(disable:4209) /* benign typedef redefinition */
  20. #pragma warning(disable:4214) /* bit field types other than int */
  21. #pragma warning(disable:4514) /* unreferenced inline function */
  22. #include <windows.h>
  23. #include <caldbg.h>
  24. #define PAGE_SIZE 4096
  25. #define PvToVMBase(pv) ((void *)((ULONG)pv & 0xFFFF0000))
  26. static BOOL VMValidatePvEx(VOID *pv, ULONG cbCluster)
  27. {
  28. VOID * pvBase;
  29. BYTE * pb;
  30. pvBase = PvToVMBase(pv);
  31. pb = (BYTE *)pvBase + sizeof(ULONG);
  32. while (pb < (BYTE *)pv)
  33. {
  34. if (*pb++ != 0xAD)
  35. {
  36. TrapSz("VMValidatePvEx: Block leader overwrite");
  37. return(FALSE);
  38. }
  39. }
  40. if (cbCluster != 1)
  41. {
  42. ULONG cb = *((ULONG *)pvBase);
  43. ULONG cbPad = 0;
  44. if (cb % cbCluster)
  45. cbPad = (cbCluster - (cb % cbCluster));
  46. if (cbPad)
  47. {
  48. BYTE *pbMac;
  49. pb = (BYTE *)pv + cb;
  50. pbMac = pb + cbPad;
  51. while (pb < pbMac)
  52. {
  53. if (*pb++ != 0xBC)
  54. {
  55. TrapSz("VMValidatePvEx: Block trailer overwrite");
  56. return(FALSE);
  57. }
  58. }
  59. }
  60. }
  61. return(TRUE);
  62. }
  63. VOID * EXPORTDBG __cdecl VMAlloc(ULONG cb)
  64. {
  65. return VMAllocEx(cb, 1);
  66. }
  67. VOID * EXPORTDBG __cdecl VMAllocEx(ULONG cb, ULONG cbCluster)
  68. {
  69. ULONG cbAlloc;
  70. VOID * pvR;
  71. VOID * pvC;
  72. ULONG cbPad = 0;
  73. // a cluster size of 0 means don't use the virtual allocator.
  74. AssertSz(cbCluster != 0, "Cluster size is zero.");
  75. if (cb > 0x100000)
  76. return(0);
  77. if (cb % cbCluster) /*lint !e414*/
  78. cbPad = (cbCluster - (cb % cbCluster));
  79. cbAlloc = sizeof(ULONG) + cb + cbPad + PAGE_SIZE - 1;
  80. cbAlloc -= cbAlloc % PAGE_SIZE;
  81. cbAlloc += PAGE_SIZE;
  82. pvR = VirtualAlloc(0, cbAlloc, MEM_RESERVE, PAGE_NOACCESS);
  83. if (pvR == 0)
  84. return(0);
  85. pvC = VirtualAlloc(pvR, cbAlloc - PAGE_SIZE, MEM_COMMIT, PAGE_READWRITE);
  86. if (pvC != pvR)
  87. {
  88. VirtualFree(pvR, 0, MEM_RELEASE); /*lint !e534*/
  89. return(0);
  90. }
  91. *(ULONG *)pvC = cb;
  92. memset((BYTE *)pvC + sizeof(ULONG), 0xAD,
  93. (UINT) cbAlloc - cb - cbPad - sizeof(ULONG) - PAGE_SIZE);
  94. if (cbPad)
  95. memset((BYTE *)pvC + cbAlloc - PAGE_SIZE - cbPad, 0xBC,
  96. (UINT) cbPad);
  97. return((BYTE *)pvC + (cbAlloc - cb - cbPad - PAGE_SIZE));
  98. }
  99. VOID EXPORTDBG __cdecl VMFree(VOID *pv)
  100. {
  101. VMFreeEx(pv, 1);
  102. }
  103. VOID EXPORTDBG __cdecl VMFreeEx(VOID *pv, ULONG cbCluster)
  104. { /*lint -save -e534*/
  105. VMValidatePvEx(pv, cbCluster); /*lint -restore*/
  106. if (!VirtualFree(PvToVMBase(pv), 0, MEM_RELEASE))
  107. {
  108. TrapSz("VMFreeEx: VirtualFree failed");
  109. GetLastError();
  110. }
  111. }
  112. VOID * EXPORTDBG __cdecl VMRealloc(VOID *pv, ULONG cb)
  113. {
  114. return VMReallocEx(pv, cb, 1);
  115. }
  116. VOID * EXPORTDBG __cdecl VMReallocEx(VOID *pv, ULONG cb, ULONG cbCluster)
  117. {
  118. VOID * pvNew = 0;
  119. ULONG cbCopy;
  120. /*lint -save -e534*/
  121. VMValidatePvEx(pv, cbCluster); /*lint -restore*/
  122. cbCopy = *(ULONG *)PvToVMBase(pv);
  123. if (cbCopy > cb)
  124. cbCopy = cb;
  125. pvNew = VMAllocEx(cb, cbCluster);
  126. if (pvNew)
  127. {
  128. memcpy(pvNew, pv, cbCopy);
  129. VMFreeEx(pv, cbCluster);
  130. }
  131. return(pvNew);
  132. }
  133. ULONG EXPORTDBG __cdecl VMGetSize(VOID *pv)
  134. {
  135. return VMGetSizeEx(pv, 1);
  136. }
  137. /*lint -save -e715*/
  138. ULONG EXPORTDBG __cdecl VMGetSizeEx(VOID *pv, ULONG cbCluster)
  139. {
  140. return (*(ULONG *)PvToVMBase(pv));
  141. } /*lint -restore*/
  142. #endif