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.
 
 
 
 
 
 

795 lines
20 KiB

/******************************************************************
CIPPersistedRTble.CPP -- WMI provider class implementation
Generated by Microsoft WMI Code Generation Engine
TO DO: - See individual function headers
- When linking, make sure you link to framedyd.lib &
msvcrtd.lib (debug) or framedyn.lib & msvcrt.lib (retail).
Description:
******************************************************************/
#include "precomp.h"
#include <winsock2.h>
#include <provexpt.h>
#include <provtempl.h>
#include <provmt.h>
#include <typeinfo.h>
#include <provcont.h>
#include <provval.h>
#include <provtype.h>
#include <cregcls.h>
#include "CIPPersistedRTble.h"
extern const WCHAR *RouteDestination ;
extern const WCHAR *RouteInformation ;
extern const WCHAR *RouteMask ;
extern const WCHAR *RouteMetric1 ;
extern const WCHAR *RouteNextHop ;
extern const WCHAR *RouteName ;
extern const WCHAR *RouteCaption ;
extern const WCHAR *RouteDescription ;
#define TCIP_PERSISTENT_REG L"System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\PersistentRoutes"
#define MAX_METRIC1 9999
#define PERSITENT_ROUTE_SEP L','
CIPPersistedRouteTable MyCIPPersistedRouteTableSet (
PROVIDER_NAME_CIPPERSISTEDROUTETABLE ,
L"root\\cimv2"
) ;
/*****************************************************************************
*
* FUNCTION : CIPPersistedRouteTable::CIPPersistedRouteTable
*
* DESCRIPTION : Constructor
*
* INPUTS : none
*
* RETURNS : nothing
*
* COMMENTS : Calls the Provider constructor.
*
*****************************************************************************/
CIPPersistedRouteTable :: CIPPersistedRouteTable (
LPCWSTR lpwszName,
LPCWSTR lpwszNameSpace
) : Provider ( lpwszName , lpwszNameSpace )
{
}
/*****************************************************************************
*
* FUNCTION : CIPPersistedRouteTable::~CIPPersistedRouteTable
*
* DESCRIPTION : Destructor
*
* INPUTS : none
*
* RETURNS : nothing
*
* COMMENTS :
*
*****************************************************************************/
CIPPersistedRouteTable :: ~CIPPersistedRouteTable ()
{
}
/*****************************************************************************
*
* FUNCTION : CIPPersistedRouteTable::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP
* WBEM_FLAG_SHALLOW
* WBEM_FLAG_RETURN_IMMEDIATELY
* WBEM_FLAG_FORWARD_ONLY
* WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : TO DO: All instances on the machine should be returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR. It is not an error to have no instances.
* If you are implementing a 'method only' provider, you
* should remove this method.
*
*****************************************************************************/
HRESULT CIPPersistedRouteTable :: EnumerateInstances (
MethodContext *pMethodContext,
long lFlags
)
{
HRESULT hRes = WBEM_S_NO_ERROR ;
CRegistry t_Reg;
DWORD dwError = ERROR_SUCCESS;
if ( ( dwError = t_Reg.Open( HKEY_LOCAL_MACHINE, TCIP_PERSISTENT_REG, KEY_READ) ) == ERROR_SUCCESS)
{
WCHAR *pValueName = NULL ;
BYTE *pValueData = NULL ;
try
{
for(DWORD i = 0 ; i < t_Reg.GetValueCount() && SUCCEEDED(hRes); i++)
{
DWORD dwRetCode = t_Reg.EnumerateAndGetValues(i, pValueName, pValueData) ;
if(dwRetCode == ERROR_SUCCESS)
{
CHString t_Dest ;
CHString t_Mask ;
CHString t_NextHop ;
long t_Metric ;
if ( Parse ( pValueName , t_Dest , t_Mask , t_NextHop , t_Metric ) )
{
CInstance *pInstance = CreateNewInstance ( pMethodContext ) ;
if (pInstance != NULL )
{
/*
* Initialize the instance
*/
pInstance->SetCHString( RouteDestination, t_Dest ) ;
pInstance->SetCHString( RouteMask, t_Mask ) ;
pInstance->SetCHString( RouteNextHop, t_NextHop ) ;
pInstance->SetDWORD ( RouteMetric1, t_Metric ) ;
//set the inherited properties that are sensible
SetInheritedProperties (
t_Dest ,
t_NextHop ,
t_Mask ,
t_Metric ,
*pInstance
) ;
/*
* Forward the instance onto the core wmi service
*/
hRes = Commit ( pInstance ) ;
}
}
}
if ( pValueName )
{
delete [] pValueName ;
pValueName = NULL ;
}
if ( pValueData )
{
delete [] pValueData ;
pValueData = NULL ;
}
}
t_Reg.Close() ;
}
catch ( ... )
{
if ( pValueName )
{
delete [] pValueName ;
pValueName = NULL ;
}
if ( pValueData )
{
delete [] pValueData ;
pValueData = NULL ;
}
throw ;
}
}
else
{
if ( ERROR_ACCESS_DENIED == dwError )
{
hRes = WBEM_E_ACCESS_DENIED ;
}
else
{
hRes = WBEM_E_FAILED ;
}
}
return hRes ;
}
/*****************************************************************************
*
* FUNCTION : CIPPersistedRouteTable::GetObject
*
* DESCRIPTION : Find a single instance based on the key properties for the
* class.
*
* INPUTS : A pointer to a CInstance object containing the key properties.
* A long that contains the flags described in
* IWbemServices::GetObjectAsync.
*
* RETURNS : WBEM_S_NO_ERROR if the instance can be found
* WBEM_E_NOT_FOUND if the instance described by the key properties
* could not be found
* WBEM_E_FAILED if the instance could be found but another error
* occurred.
*
* COMMENTS : If you are implementing a 'method only' provider, you should
* remove this method.
*
*****************************************************************************/
HRESULT CIPPersistedRouteTable :: GetObject (
CInstance *pInstance,
long lFlags
)
{
HRESULT hr = WBEM_E_NOT_FOUND;
CHString t_Dest ;
CHString t_Mask ;
CHString t_NextHop ;
long t_Metric1 = 1;
pInstance->GetCHString ( RouteDestination , t_Dest ) ;
pInstance->GetCHString ( RouteMask , t_Mask ) ;
pInstance->GetCHString ( RouteNextHop , t_NextHop ) ;
pInstance->GetDWORD ( RouteMetric1 , (DWORD&)t_Metric1 ) ;
CRegistry t_Reg;
DWORD dwError = ERROR_SUCCESS;
if ( ( dwError = t_Reg.Open( HKEY_LOCAL_MACHINE, TCIP_PERSISTENT_REG, KEY_READ) ) == ERROR_SUCCESS)
{
WCHAR buff [ 20 ];
buff [ 0 ] = L'\0' ;
_ultow( t_Metric1, buff , 10 ) ;
CHString t_ValName = t_Dest + PERSITENT_ROUTE_SEP + t_Mask + PERSITENT_ROUTE_SEP + t_NextHop + PERSITENT_ROUTE_SEP + buff ;
if ( RegQueryValueEx ( t_Reg.GethKey(), t_ValName , NULL , NULL , NULL , NULL ) == ERROR_SUCCESS )
{
hr = S_OK ;
/*
* Initialize the instance
*/
//set the inherited properties that are sensible
SetInheritedProperties (
t_Dest ,
t_NextHop ,
t_Mask ,
t_Metric1,
*pInstance
) ;
}
t_Reg.Close();
}
else
{
if ( ERROR_ACCESS_DENIED == dwError )
{
hr = WBEM_E_ACCESS_DENIED ;
}
else
{
hr = WBEM_E_FAILED ;
}
}
return hr ;
}
/*****************************************************************************
*
* FUNCTION : CIPPersistedRouteTable::PutInstance
*
* DESCRIPTION : PutInstance should be used in provider classes that can
* write instance information back to the hardware or
* software. For example: Win32_Environment will allow a
* PutInstance to create or update an environment variable.
* However, a class like MotherboardDevice will not allow
* editing of the number of slots, since it is difficult for
* a provider to affect that number.
*
* INPUTS : A pointer to a CInstance object containing the key properties.
* A long that contains the flags described in
* IWbemServices::PutInstanceAsync.
*
* RETURNS : WBEM_E_PROVIDER_NOT_CAPABLE if PutInstance is not available
* WBEM_E_FAILED if there is an error delivering the instance
* WBEM_E_INVALID_PARAMETER if any of the instance properties
* are incorrect.
* WBEM_S_NO_ERROR if instance is properly delivered
*
* COMMENTS : TO DO: If you don't intend to support writing to your provider,
* or are creating a 'method only' provider, remove this
* method.
*
*****************************************************************************/
HRESULT CIPPersistedRouteTable :: PutInstance (
const CInstance &Instance,
long lFlags
)
{
HRESULT hr = WBEM_E_FAILED ;
switch ( lFlags & (WBEM_FLAG_CREATE_OR_UPDATE | WBEM_FLAG_CREATE_ONLY | WBEM_FLAG_UPDATE_ONLY) )
{
case WBEM_FLAG_CREATE_OR_UPDATE:
case WBEM_FLAG_CREATE_ONLY:
{
CHString t_ValName ;
hr = CheckParameters ( Instance , t_ValName ) ;
if ( SUCCEEDED ( hr ) )
{
CRegistry t_Reg;
DWORD dwError = ERROR_SUCCESS;
if ( ( dwError = t_Reg.Open( HKEY_LOCAL_MACHINE, TCIP_PERSISTENT_REG, KEY_ALL_ACCESS) ) == ERROR_SUCCESS)
{
CHString t_temp;
if ( ERROR_SUCCESS != t_Reg.SetCurrentKeyValue( t_ValName, t_temp ) )
{
hr = S_OK ;
}
t_Reg.Close () ;
}
else
{
if ( ERROR_ACCESS_DENIED == dwError )
{
hr = WBEM_E_ACCESS_DENIED ;
}
else
{
hr = WBEM_E_FAILED ;
}
}
}
else
{
hr = WBEM_E_INVALID_PARAMETER ;
}
}
break ;
default:
{
hr = WBEM_E_PROVIDER_NOT_CAPABLE ;
}
break ;
}
return hr ;
}
HRESULT CIPPersistedRouteTable :: CheckParameters (
const CInstance &a_Instance ,
CHString &a_ValueName
)
{
bool t_Exists ;
VARTYPE t_Type ;
long t_mask = 0 ;
long t_dest = 0 ;
long t_nexthop = 0 ;
CHString t_RouteDestinationString ;
if ( a_Instance.GetStatus ( RouteDestination , t_Exists , t_Type ) )
{
if ( t_Exists && ( t_Type == VT_BSTR ) )
{
if ( a_Instance.GetCHString ( RouteDestination , t_RouteDestinationString ) && ! t_RouteDestinationString.IsEmpty () )
{
ProvIpAddressType t_Address ( t_RouteDestinationString ) ;
if ( t_Address.IsValid () )
{
t_dest = htonl ( t_Address.GetValue () ) ;
if ( t_dest == -1 )
{
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
// Zero Length string
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
return WBEM_E_FAILED ;
}
CHString t_RouteDestinationMaskString ;
if ( a_Instance.GetStatus ( RouteMask , t_Exists , t_Type ) )
{
if ( t_Exists && ( t_Type == VT_BSTR ) )
{
if ( a_Instance.GetCHString ( RouteMask , t_RouteDestinationMaskString ) && ! t_RouteDestinationMaskString.IsEmpty () )
{
ProvIpAddressType t_Address ( t_RouteDestinationMaskString ) ;
if ( t_Address.IsValid () )
{
t_mask = htonl ( t_Address.GetValue () ) ;
if ( ( t_dest & t_mask ) != t_dest )
{
return WBEM_E_INVALID_PARAMETER;
}
}
else
{
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
// Zero Length string
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
return WBEM_E_FAILED ;
}
CHString t_RouteNextHopString ;
if ( a_Instance.GetStatus ( RouteNextHop, t_Exists , t_Type ) )
{
if ( t_Exists && ( t_Type == VT_BSTR ) )
{
if ( a_Instance.GetCHString ( RouteNextHop , t_RouteNextHopString ) && ! t_RouteNextHopString.IsEmpty () )
{
ProvIpAddressType t_Address ( t_RouteNextHopString ) ;
if ( t_Address.IsValid () )
{
t_nexthop = htonl ( t_Address.GetValue () ) ;
if ( t_nexthop == -1 )
{
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
// Zero Length string
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
return WBEM_E_FAILED ;
}
DWORD t_Metric = 0 ;
if ( a_Instance.GetStatus ( RouteMetric1 , t_Exists , t_Type ) )
{
if ( t_Exists && ( t_Type == VT_I4 ) )
{
if ( !a_Instance.GetDWORD ( RouteMetric1 , t_Metric ) || ( t_Metric < 1) || ( t_Metric > MAX_METRIC1) )
{
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
return WBEM_E_INVALID_PARAMETER ;
}
}
else
{
return WBEM_E_FAILED ;
}
WCHAR buff [ 20 ] ;
buff [ 0 ] = L'\0' ;
_ultow ( t_Metric , buff , 10 ) ;
a_ValueName = t_RouteDestinationString + PERSITENT_ROUTE_SEP
+ t_RouteDestinationMaskString + PERSITENT_ROUTE_SEP
+ t_RouteNextHopString + PERSITENT_ROUTE_SEP
+ buff;
return S_OK ;
}
/*****************************************************************************
*
* FUNCTION : CIPPersistedRouteTable::DeleteInstance
*
* DESCRIPTION : DeleteInstance, like PutInstance, actually writes information
* to the software or hardware. For most hardware devices,
* DeleteInstance should not be implemented, but for software
* configuration, DeleteInstance implementation is plausible.
*
* INPUTS : A pointer to a CInstance object containing the key properties.
* A long that contains the flags described in
* IWbemServices::DeleteInstanceAsync.
*
* RETURNS : WBEM_E_PROVIDER_NOT_CAPABLE if DeleteInstance is not available.
* WBEM_E_FAILED if there is an error deleting the instance.
* WBEM_E_INVALID_PARAMETER if any of the instance properties
* are incorrect.
* WBEM_S_NO_ERROR if instance is properly deleted.
*
* COMMENTS : TO DO: If you don't intend to support deleting instances or are
* creating a 'method only' provider, remove this method.
*
*****************************************************************************/
HRESULT CIPPersistedRouteTable :: DeleteInstance (
const CInstance &Instance,
long lFlags
)
{
HRESULT hr = WBEM_E_FAILED ;
CHString t_Dest ;
CHString t_Mask ;
CHString t_NextHop ;
long t_Metric1 = 1;
Instance.GetCHString ( RouteDestination , t_Dest ) ;
Instance.GetCHString ( RouteMask , t_Mask ) ;
Instance.GetCHString ( RouteNextHop , t_NextHop ) ;
Instance.GetDWORD ( RouteMetric1 , (DWORD&)t_Metric1 ) ;
CRegistry t_Reg;
DWORD dwError = ERROR_SUCCESS;
if ( ( dwError = t_Reg.Open( HKEY_LOCAL_MACHINE, TCIP_PERSISTENT_REG, KEY_ALL_ACCESS) ) == ERROR_SUCCESS)
{
WCHAR buff [ 20 ];
buff[0] = L'\0' ;
_ultow( t_Metric1 , buff , 10 ) ;
CHString t_ValName = t_Dest + PERSITENT_ROUTE_SEP + t_Mask + PERSITENT_ROUTE_SEP + t_NextHop + PERSITENT_ROUTE_SEP + buff ;
if ( t_Reg.DeleteCurrentKeyValue(t_ValName) == ERROR_SUCCESS )
{
hr = S_OK ;
}
t_Reg.Close();
}
else
{
if ( ERROR_ACCESS_DENIED == dwError )
{
hr = WBEM_E_ACCESS_DENIED ;
}
}
return hr ;
}
/*****************************************************************************
*
* FUNCTION : CIPPersistedRouteTable::ExecMethod
*
* DESCRIPTION : Override this function to provide support for methods.
* A method is an entry point for the user of your provider
* to request your class perform some function above and
* beyond a change of state. (A change of state should be
* handled by PutInstance() )
*
* INPUTS : A pointer to a CInstance containing the instance the method was executed against.
* A string containing the method name
* A pointer to the CInstance which contains the IN parameters.
* A pointer to the CInstance to contain the OUT parameters.
* A set of specialized method flags
*
* RETURNS : WBEM_E_PROVIDER_NOT_CAPABLE if not implemented for this class
* WBEM_S_NO_ERROR if method executes successfully
* WBEM_E_FAILED if error occurs executing method
*
* COMMENTS : TO DO: If you don't intend to support Methods, remove this method.
*
*****************************************************************************/
HRESULT CIPPersistedRouteTable :: ExecMethod (
const CInstance &Instance,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags
)
{
// For non-static methods, use the CInstance Get functions (for example,
// call GetCHString(L"Name", sTemp)) against Instance to see the key
// values the client requested.
return WBEM_E_PROVIDER_NOT_CAPABLE ;
}
BOOL CIPPersistedRouteTable :: Parse (
LPWSTR a_InStr ,
CHString &a_Dest ,
CHString &a_Mask ,
CHString &a_NextHop ,
long &a_Metric
)
{
BOOL t_RetVal = FALSE ;
if ( a_InStr && ( wcslen ( a_InStr ) > 0 ) )
{
LPWSTR t_Str = a_InStr ;
LPWSTR t_Addr = t_Str ;
a_Metric = 1 ;
DWORD t_count = 0;
while ( *t_Str != L'\0' )
{
if ( *t_Str != PERSITENT_ROUTE_SEP )
{
t_Str++ ;
}
else
{
*t_Str = L'\0';
ProvIpAddressType t_Address ( t_Addr ) ;
if ( t_Address.IsValid () )
{
t_count++ ;
t_RetVal = TRUE ;
switch ( t_count )
{
case 1 :
{
a_Dest = t_Addr ;
}
break ;
case 2 :
{
a_Mask = t_Addr ;
}
break ;
case 3 :
{
a_NextHop = t_Addr ;
}
break ;
default :
{
t_RetVal = FALSE ;
}
}
if ( t_RetVal )
{
*t_Str = PERSITENT_ROUTE_SEP ;
t_Str++ ;
t_Addr = t_Str ;
}
else
{
break ;
}
}
else
{
t_RetVal = FALSE ;
break ;
}
}
}
if ( ( t_count == 3 ) && t_RetVal )
{
//get the metric
if (t_Addr != t_Str)
{
a_Metric = _wtoi ( t_Addr ) ;
if ( a_Metric < 1 )
{
t_RetVal = FALSE ;
}
}
}
else
{
t_RetVal = FALSE ;
}
}
return t_RetVal;
}
void CIPPersistedRouteTable :: SetInheritedProperties (
LPCWSTR a_dest ,
LPCWSTR a_gateway ,
LPCWSTR a_mask ,
long a_metric ,
CInstance &a_Instance
)
{
CHString t_temp( a_dest ) ;
a_Instance.SetCHString ( RouteName, t_temp ) ;
a_Instance.SetCHString ( RouteCaption, t_temp ) ;
WCHAR t_buff [ 20 ] ;
t_buff[0] = L'\0' ;
_ultow( a_metric , t_buff , 10 ) ;
t_temp = t_temp + PERSITENT_ROUTE_SEP + a_mask + PERSITENT_ROUTE_SEP + a_gateway + PERSITENT_ROUTE_SEP + t_buff ;
a_Instance.SetCHString ( RouteDescription, t_temp ) ;
}