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.
512 lines
8.7 KiB
512 lines
8.7 KiB
#ifndef __ALLOCATOR_CPP
|
|
#define __ALLOCATOR_CPP
|
|
|
|
/*
|
|
* Class:
|
|
*
|
|
* WmiAllocator
|
|
*
|
|
* Description:
|
|
*
|
|
* Provides abstraction above heap allocation functions
|
|
*
|
|
* Version:
|
|
*
|
|
* Initial
|
|
*
|
|
* Last Changed:
|
|
*
|
|
* See Source Depot for change history
|
|
*
|
|
*/
|
|
|
|
#if 0
|
|
|
|
#include <precomp.h>
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
|
|
#include <Allocator.h>
|
|
|
|
#endif
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiAllocator :: WmiAllocator () :
|
|
|
|
m_Heap ( NULL ) ,
|
|
m_Options ( e_DefaultAllocation ) ,
|
|
m_InitialSize ( 0 ) ,
|
|
m_MaximumSize ( 0 ) ,
|
|
m_ReferenceCount ( 0 )
|
|
{
|
|
m_Heap = GetProcessHeap () ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiAllocator :: WmiAllocator (
|
|
|
|
AllocationOptions a_Option ,
|
|
size_t a_InitialSize ,
|
|
size_t a_MaximumSize
|
|
) :
|
|
m_Heap ( NULL ) ,
|
|
m_Options ( a_Option ) ,
|
|
m_InitialSize ( a_InitialSize ) ,
|
|
m_MaximumSize ( a_MaximumSize ) ,
|
|
m_ReferenceCount ( 0 )
|
|
{
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiAllocator :: ~WmiAllocator ()
|
|
{
|
|
UnInitialize () ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
ULONG WmiAllocator :: AddRef ()
|
|
{
|
|
return InterlockedIncrement ( & m_ReferenceCount ) ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
ULONG WmiAllocator :: Release ()
|
|
{
|
|
ULONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ;
|
|
if ( t_ReferenceCount == 0 )
|
|
{
|
|
delete this ;
|
|
}
|
|
|
|
return t_ReferenceCount ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: Win32ToApi ()
|
|
{
|
|
WmiStatusCode t_Status = e_StatusCode_Success ;
|
|
|
|
DWORD t_LastError = GetLastError () ;
|
|
switch ( t_LastError )
|
|
{
|
|
case STATUS_NO_MEMORY:
|
|
{
|
|
t_Status = e_StatusCode_OutOfMemory ;
|
|
}
|
|
break ;
|
|
|
|
default:
|
|
{
|
|
t_Status = e_StatusCode_Unknown ;
|
|
}
|
|
break ;
|
|
}
|
|
|
|
return t_Status ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: Initialize ()
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Heap == NULL )
|
|
{
|
|
m_Heap = HeapCreate (
|
|
|
|
m_Options ,
|
|
m_InitialSize ,
|
|
m_MaximumSize
|
|
) ;
|
|
|
|
if ( m_Heap == NULL )
|
|
{
|
|
t_StatusCode = Win32ToApi () ;
|
|
}
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: UnInitialize ()
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Heap )
|
|
{
|
|
if ( m_Heap != GetProcessHeap () )
|
|
{
|
|
BOOL t_Status = HeapDestroy ( m_Heap ) ;
|
|
if ( t_Status )
|
|
{
|
|
m_Heap = NULL ;
|
|
}
|
|
else
|
|
{
|
|
t_Status = Win32ToApi () ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_StatusCode = e_StatusCode_NotInitialized ;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: New (
|
|
|
|
void **a_Allocation ,
|
|
size_t a_Size
|
|
)
|
|
{
|
|
return New (
|
|
|
|
( AllocationOptions ) ( ( m_Options & ( e_GenerateException | e_NoSerialize ) ) | e_ZeroMemory ) ,
|
|
a_Allocation ,
|
|
a_Size
|
|
) ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: New (
|
|
|
|
AllocationOptions a_Option ,
|
|
void **a_Allocation ,
|
|
size_t a_Size
|
|
)
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Heap )
|
|
{
|
|
*a_Allocation = HeapAlloc (
|
|
|
|
m_Heap ,
|
|
a_Option ,
|
|
a_Size
|
|
) ;
|
|
|
|
if ( ! *a_Allocation )
|
|
{
|
|
t_StatusCode = Win32ToApi () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_StatusCode = e_StatusCode_NotInitialized ;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: ReAlloc (
|
|
|
|
void *a_Allocation ,
|
|
void **a_ReAllocation ,
|
|
size_t a_Size
|
|
)
|
|
{
|
|
return ReAlloc (
|
|
|
|
( AllocationOptions ) ( ( m_Options & ( e_GenerateException | e_NoSerialize ) ) ) ,
|
|
a_Allocation ,
|
|
a_ReAllocation ,
|
|
a_Size
|
|
) ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: ReAlloc (
|
|
|
|
AllocationOptions a_Option ,
|
|
void *a_Allocation ,
|
|
void **a_ReAllocation ,
|
|
size_t a_Size
|
|
)
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Heap )
|
|
{
|
|
*a_ReAllocation = HeapReAlloc (
|
|
|
|
m_Heap ,
|
|
a_Option ,
|
|
a_Allocation ,
|
|
a_Size
|
|
) ;
|
|
|
|
if ( ! *a_ReAllocation )
|
|
{
|
|
t_StatusCode = Win32ToApi () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_StatusCode = e_StatusCode_NotInitialized ;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: Delete (
|
|
|
|
void *a_Allocation
|
|
)
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Heap )
|
|
{
|
|
BOOL t_Status = HeapFree (
|
|
|
|
m_Heap ,
|
|
0 ,
|
|
a_Allocation
|
|
) ;
|
|
|
|
if ( ! t_Status )
|
|
{
|
|
t_StatusCode = Win32ToApi () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_StatusCode = e_StatusCode_NotInitialized ;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: Size (
|
|
|
|
void *a_Allocation ,
|
|
size_t &a_Size
|
|
)
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Heap )
|
|
{
|
|
a_Size = HeapSize (
|
|
|
|
m_Heap ,
|
|
m_Options & e_NoSerialize ,
|
|
a_Allocation
|
|
) ;
|
|
|
|
if ( a_Size == -1 )
|
|
{
|
|
t_StatusCode = Win32ToApi () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_StatusCode = e_StatusCode_AlreadyInitialized ;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: Compact (
|
|
|
|
size_t &a_LargestFreeBlock
|
|
)
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Heap )
|
|
{
|
|
a_LargestFreeBlock = HeapCompact (
|
|
|
|
m_Heap ,
|
|
m_Options & e_NoSerialize
|
|
) ;
|
|
|
|
if ( a_LargestFreeBlock == 0 && GetLastError () != 0 )
|
|
{
|
|
t_StatusCode = Win32ToApi () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_StatusCode = e_StatusCode_AlreadyInitialized ;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode WmiAllocator :: Validate ( LPCVOID a_Location )
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
BOOL t_Status = HeapValidate (
|
|
|
|
m_Heap,
|
|
m_Options & e_NoSerialize ,
|
|
a_Location
|
|
) ;
|
|
|
|
if ( ! t_Status )
|
|
{
|
|
t_StatusCode = e_StatusCode_InvalidHeap ;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
#endif __ALLOCATOR_CPP
|