144 lines
1.8 KiB
C
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);
|
||
|
}
|
||
|
|