318 lines
6.5 KiB
C
318 lines
6.5 KiB
C
|
/////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CopyRight (c) 1999-2000 Microsoft Corporation
|
||
|
//
|
||
|
// Module Name:
|
||
|
// SafeHandle.h
|
||
|
//
|
||
|
// Description:
|
||
|
// Implementation of safe handle and pointer classes.
|
||
|
//
|
||
|
// Author:
|
||
|
// Henry Wang (HenryWa) 24-AUG-1999
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
// Include Files
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "ObjectPath.h"
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
// Forward Declarations
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CError;
|
||
|
template< class T > class SafePtr;
|
||
|
class CWstrBuf;
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// class CClusterApi
|
||
|
//
|
||
|
// Description:
|
||
|
// Wrap class for cluster Api
|
||
|
//
|
||
|
//--
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
class CError
|
||
|
{
|
||
|
public:
|
||
|
CError( void )
|
||
|
: m_hr( 0 )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
inline CError & operator=( DWORD dw )
|
||
|
{
|
||
|
if ( dw != ERROR_SUCCESS )
|
||
|
{
|
||
|
throw CProvException ( dw );
|
||
|
}
|
||
|
m_hr = HRESULT_FROM_WIN32( dw );
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline CError & operator=( HRESULT hr )
|
||
|
{
|
||
|
if ( FAILED ( hr ) )
|
||
|
{
|
||
|
throw CProvException ( hr );
|
||
|
}
|
||
|
m_hr = hr;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
operator DWORD( void )
|
||
|
{
|
||
|
return HRESULT_CODE( m_hr );
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
HRESULT m_hr;
|
||
|
|
||
|
}; //*** CError
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// template< class T >
|
||
|
// class SafePtr
|
||
|
//
|
||
|
// Description:
|
||
|
// Safe handle/pointer class.
|
||
|
//
|
||
|
// Template Arguments:
|
||
|
// T -- Type of handle or pointer.
|
||
|
//
|
||
|
//--
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
template< class T >
|
||
|
class SafePtr
|
||
|
{
|
||
|
public:
|
||
|
SafePtr( void )
|
||
|
: m_handle( NULL )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
SafePtr( T h )
|
||
|
: m_handle( h )
|
||
|
{
|
||
|
h = NULL;
|
||
|
}
|
||
|
|
||
|
virtual ~SafePtr( void )
|
||
|
{
|
||
|
deleteHandle( m_handle );
|
||
|
}
|
||
|
|
||
|
T operator&( void )
|
||
|
{
|
||
|
return m_handle;
|
||
|
}
|
||
|
|
||
|
BOOL BIsNULL( void )
|
||
|
{
|
||
|
return m_handle == NULL;
|
||
|
}
|
||
|
|
||
|
operator T( void )
|
||
|
{
|
||
|
return m_handle;
|
||
|
}
|
||
|
|
||
|
operator void * ( void )
|
||
|
{
|
||
|
return static_cast< void * >( m_handle );
|
||
|
}
|
||
|
|
||
|
SafePtr< T > & operator=( T tRhs )
|
||
|
{
|
||
|
if ( tRhs == NULL )
|
||
|
{
|
||
|
throw CProvException ( GetLastError() );
|
||
|
}
|
||
|
|
||
|
if ( m_handle != NULL )
|
||
|
{
|
||
|
deleteHandle( m_handle );
|
||
|
}
|
||
|
m_handle = tRhs;
|
||
|
tRhs = NULL;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
|
||
|
T m_handle;
|
||
|
|
||
|
void deleteHandle( HCLUSTER hCluster )
|
||
|
{
|
||
|
if ( hCluster && ( CloseCluster( hCluster ) == FALSE ) )
|
||
|
{
|
||
|
throw CProvException( GetLastError() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deleteHandle( HNODE hNode )
|
||
|
{
|
||
|
if ( hNode && ( CloseClusterNode( hNode ) == FALSE ) )
|
||
|
{
|
||
|
throw CProvException( GetLastError() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deleteHandle( HCLUSENUM hEnum )
|
||
|
{
|
||
|
if ( hEnum && ( ClusterCloseEnum( hEnum ) != ERROR_SUCCESS ) )
|
||
|
{
|
||
|
throw CProvException( GetLastError() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deleteHandle( HRESOURCE hRes )
|
||
|
{
|
||
|
if ( hRes && ( CloseClusterResource( hRes ) == FALSE ))
|
||
|
{
|
||
|
throw CProvException( GetLastError() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deleteHandle( HGROUP hGroup )
|
||
|
{
|
||
|
if ( hGroup && ( CloseClusterGroup( hGroup ) == FALSE ) )
|
||
|
{
|
||
|
throw CProvException( GetLastError() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deleteHandle( HNETWORK hNetwork )
|
||
|
{
|
||
|
if ( hNetwork && ( CloseClusterNetwork( hNetwork ) == FALSE ) )
|
||
|
{
|
||
|
throw CProvException( GetLastError() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deleteHandle( HNETINTERFACE hNetInterface )
|
||
|
{
|
||
|
if ( hNetInterface && ( CloseClusterNetInterface( hNetInterface ) == FALSE ) )
|
||
|
{
|
||
|
throw CProvException( GetLastError() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deleteHandle( HRESENUM hResEnum )
|
||
|
{
|
||
|
DWORD dwReturn;
|
||
|
if ( hResEnum )
|
||
|
{
|
||
|
dwReturn = ClusterResourceCloseEnum( hResEnum ) ;
|
||
|
if ( dwReturn != ERROR_SUCCESS )
|
||
|
{
|
||
|
throw CProvException( dwReturn );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deleteHandle( HGROUPENUM hGroupEnum )
|
||
|
{
|
||
|
DWORD dwReturn;
|
||
|
if ( hGroupEnum )
|
||
|
{
|
||
|
dwReturn = ClusterGroupCloseEnum( hGroupEnum );
|
||
|
if ( dwReturn != ERROR_SUCCESS )
|
||
|
{
|
||
|
throw CProvException( dwReturn );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deleteHandle( HCHANGE hChange )
|
||
|
{
|
||
|
BOOL fReturn;
|
||
|
if ( hChange )
|
||
|
{
|
||
|
fReturn = CloseClusterNotifyPort( hChange );
|
||
|
if ( ! fReturn )
|
||
|
{
|
||
|
throw CProvException( GetLastError() );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
SafePtr( SafePtr< T > & cT )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
}; //*** class SafePtr
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// class CWstrBuf
|
||
|
//
|
||
|
// Description:
|
||
|
// Wrap class for Unicode strings.
|
||
|
//
|
||
|
//--
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
class CWstrBuf
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
CWstrBuf( void )
|
||
|
: m_pwsz( NULL )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
~CWstrBuf( void )
|
||
|
{
|
||
|
delete [] m_pwsz;
|
||
|
};
|
||
|
|
||
|
void SetSize( DWORD dwSize )
|
||
|
{
|
||
|
delete [] m_pwsz;
|
||
|
m_pwsz = new WCHAR[ sizeof( WCHAR ) * dwSize ];
|
||
|
if ( m_pwsz == NULL )
|
||
|
{
|
||
|
throw WBEM_E_OUT_OF_MEMORY;
|
||
|
} else {
|
||
|
m_pwsz[0] = UNICODE_NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
operator WCHAR*( void )
|
||
|
{
|
||
|
return m_pwsz;
|
||
|
}
|
||
|
|
||
|
void Empty( VOID )
|
||
|
{
|
||
|
m_pwsz[0] = UNICODE_NULL;
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
|
||
|
LPWSTR m_pwsz;
|
||
|
|
||
|
}; //*** class CWstrBuf
|
||
|
|
||
|
typedef SafePtr< HRESOURCE > SAFERESOURCE;
|
||
|
typedef SafePtr< HGROUP > SAFEGROUP;
|
||
|
typedef SafePtr< HCLUSENUM > SAFECLUSENUM;
|
||
|
typedef SafePtr< HNODE > SAFENODE;
|
||
|
typedef SafePtr< HCLUSTER > SAFECLUSTER;
|
||
|
typedef SafePtr< HNETWORK > SAFENETWORK;
|
||
|
typedef SafePtr< HNETINTERFACE> SAFENETINTERFACE;
|
||
|
typedef SafePtr< HRESENUM > SAFERESENUM;
|
||
|
typedef SafePtr< HGROUPENUM > SAFEGROUPENUM;
|
||
|
typedef SafePtr< HCHANGE > SAFECHANGE;
|