windows-nt/Source/XPSP1/NT/sdktools/efinvram/memory.c
2020-09-26 16:20:57 +08:00

144 lines
1.8 KiB
C

/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
spmemory.c
Abstract:
Memory allocation routines for text setup.
Author:
Ted Miller (tedm) 29-July-1993
Revision History:
--*/
#include "efinvram.h"
PVOID
MemAlloc(
IN SIZE_T Size
)
/*++
Routine Description:
This function is guaranteed to succeed.
Arguments:
Return Value:
--*/
{
PSIZE_T p;
//
// Add space for storing the size of the block.
//
p = RtlAllocateHeap( RtlProcessHeap(), 0, Size + sizeof(SIZE_T) );
if ( p == NULL ) {
FatalError( ERROR_NOT_ENOUGH_MEMORY, L"Insufficient memory\n" );
}
//
// Store the size of the block, and return the address
// of the user portion of the block.
//
*p++ = Size;
return p;
}
PVOID
MemRealloc(
IN PVOID Block,
IN SIZE_T NewSize
)
/*++
Routine Description:
This function is guaranteed to succeed.
Arguments:
Return Value:
--*/
{
PSIZE_T NewBlock;
SIZE_T OldSize;
//
// Get the size of the block being reallocated.
//
OldSize = ((PSIZE_T)Block)[-1];
//
// Allocate a new block of the new size.
//
NewBlock = MemAlloc(NewSize);
ASSERT(NewBlock);
//
// Copy the old block to the new block.
//
if (NewSize < OldSize) {
RtlCopyMemory(NewBlock, Block, NewSize);
} else {
RtlCopyMemory(NewBlock, Block, OldSize);
}
//
// Free the old block.
//
MemFree(Block);
//
// Return the address of the new block.
//
return(NewBlock);
}
VOID
MemFree(
IN PVOID Block
)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
if (Block == NULL)
return;
//
// Free the block at its real address.
//
RtlFreeHeap( RtlProcessHeap(), 0, (PSIZE_T)Block - 1);
}