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.
143 lines
1.9 KiB
143 lines
1.9 KiB
/*++
|
|
|
|
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);
|
|
}
|
|
|