175 lines
2.6 KiB
C++
175 lines
2.6 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1990-1999 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
newdel.cxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements the C++ new and delete operators for
|
|||
|
the Setup-Loader environment. In other environments, the utilities
|
|||
|
use the standard C++ new and delete.
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
ULIB, User Mode
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#include <pch.cxx>
|
|||
|
|
|||
|
#define _ULIB_MEMBER_
|
|||
|
|
|||
|
#include "ulib.hxx"
|
|||
|
|
|||
|
#ifdef _EFICHECK_
|
|||
|
|
|||
|
extern "C" {
|
|||
|
#include <efi.h>
|
|||
|
#include <efilib.h>
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
extern "C"
|
|||
|
int _cdecl
|
|||
|
_purecall( );
|
|||
|
|
|||
|
int _cdecl
|
|||
|
_purecall( )
|
|||
|
{
|
|||
|
|
|||
|
DebugAbort( "Pure virtual function called.\n" );
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// When the utilities are running the Setup Loader
|
|||
|
// or Autocheck environments, they can't use the C-Run-
|
|||
|
// Time new and delete; instead, these functions are
|
|||
|
// provided.
|
|||
|
//
|
|||
|
PVOID _cdecl
|
|||
|
operator new (
|
|||
|
IN size_t bytes
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine allocates 'bytes' bytes of memory.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
bytes - Supplies the number of bytes requested.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
A pointer to 'bytes' bytes or NULL.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
void * ptr;
|
|||
|
|
|||
|
ptr = AllocatePool(bytes);
|
|||
|
|
|||
|
return ptr;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID _cdecl
|
|||
|
operator delete (
|
|||
|
IN PVOID pointer
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine frees the memory pointed to by 'pointer'.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pointer - Supplies a pointer to the memoery to be freed.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
if (pointer) {
|
|||
|
FreePool(pointer);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
typedef void (*PF)(PVOID);
|
|||
|
typedef void (*PFI)(PVOID, int);
|
|||
|
PVOID
|
|||
|
__vec_new(
|
|||
|
IN OUT PVOID op,
|
|||
|
IN int number,
|
|||
|
IN int size,
|
|||
|
IN PVOID f)
|
|||
|
/*
|
|||
|
allocate a vector of "number" elements of size "size"
|
|||
|
and initialize each by a call of "f"
|
|||
|
*/
|
|||
|
{
|
|||
|
if (op == 0) {
|
|||
|
op = AllocatePool( number * size );
|
|||
|
}
|
|||
|
|
|||
|
if (op && f) {
|
|||
|
register char* p = (char*) op;
|
|||
|
register char* lim = p + number*size;
|
|||
|
register PF fp = PF(f);
|
|||
|
while (p < lim) {
|
|||
|
(*fp) (PVOID(p));
|
|||
|
p += size;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return op;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
__vec_delete(
|
|||
|
PVOID op,
|
|||
|
int n,
|
|||
|
int sz,
|
|||
|
PVOID f,
|
|||
|
int del,
|
|||
|
int x)
|
|||
|
|
|||
|
/*
|
|||
|
destroy a vector of "n" elements of size "sz"
|
|||
|
*/
|
|||
|
{
|
|||
|
// unreferenced parameters
|
|||
|
// I wonder what it does
|
|||
|
(void)(x);
|
|||
|
|
|||
|
if (op) {
|
|||
|
if (f) {
|
|||
|
register char* cp = (char*) op;
|
|||
|
register char* p = cp;
|
|||
|
register PFI fp = PFI(f);
|
|||
|
p += n*sz;
|
|||
|
while (p > cp) {
|
|||
|
p -= sz;
|
|||
|
(*fp)(PVOID(p), 2); // destroy VBC, don't delete
|
|||
|
}
|
|||
|
}
|
|||
|
if (del) {
|
|||
|
FreePool(op);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|