Windows2000/private/eventlog/server/memory.c
2020-09-30 17:12:32 +02:00

123 lines
2.4 KiB
C

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
MEMORY.C
Abstract:
This file contains the routines that deal with memory management.
Author:
Rajen Shah (rajens) 12-Jul-1991
[Environment:]
User Mode - Win32, except for NTSTATUS returned by some functions.
Revision History:
--*/
// INCLUDES
#include <eventp.h>
// Implement my own tail-checking, since the system code requires a
// debugging build
//#define TAIL_CHECKING
#ifdef TAIL_CHECKING
#define CHECK_HEAP_TAIL_SIZE 16
#define CHECK_HEAP_TAIL_FILL 0xAB
#endif
PVOID ElfpAllocateBuffer(ULONG Size)
/*++
Routine Description:
Allocate a buffer of the given size, and return the pointer in BufPtr.
Return Value:
Pointer to allocated buffer (or NULL).
--*/
{
PVOID BufPtr;
#ifdef TAIL_CHECKING
// Keep the offset of the pattern (so we don't have to have internal
// knowledge about the granularity of the heap block) and copy a
// known pattern after the end of the user's block
BufPtr = (PVOID*)MIDL_user_allocate(Size
+ CHECK_HEAP_TAIL_SIZE + sizeof(DWORD));
*((PDWORD)BufPtr) = Size + sizeof(DWORD);
(PBYTE)BufPtr += sizeof(DWORD);
RtlFillMemory((PBYTE)BufPtr + Size,
CHECK_HEAP_TAIL_SIZE,
CHECK_HEAP_TAIL_FILL);
#else
BufPtr = (PVOID*)MIDL_user_allocate(Size);
#endif
return (BufPtr);
}
VOID ElfpFreeBuffer(PVOID BufPtr)
/*++
Routine Description:
Frees a buffer previously allocated by AllocateBuffer.
Arguments:
Pointer to buffer.
Return Value:
NOTHING
--*/
{
#ifdef TAIL_CHECKING
// Check for NULL when TAIL_CHECKING is enabled since
// it allows us to avoid checking every pointer that
// we want to free vs. NULL when we call ElfpFreeBuffer.
// Note that MIDL_user_free handles NULL.
if (BufPtr != NULL) {
DWORD i;
PBYTE pb;
// Back up to real start of block
(PBYTE)BufPtr -= sizeof(DWORD);
i = *((PDWORD)BufPtr);
pb = (PBYTE)BufPtr + i;
for (i = 0; i < CHECK_HEAP_TAIL_SIZE; i++, pb++) {
if (*pb != CHECK_HEAP_TAIL_FILL) {
ElfDbgPrint(("[ELF] Heap has been corrupted at 0x%x\n",
BufPtr));
// Make it access violate
pb = (PBYTE)0;
*pb = 1;
}
}
}
#endif
MIDL_user_free(BufPtr);
return;
}