Leaked source code of windows server 2003
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

#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