Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

477 lines
9.5 KiB

/******************************************************************
pingget.CPP
Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved
Description:
******************************************************************/
#include <stdafx.h>
#include <ntddtcp.h>
#include <ipinfo.h>
#include <tdiinfo.h>
#include <winsock2.h>
#include <provimex.h>
#include <provexpt.h>
#include <provtempl.h>
#include <provmt.h>
#include <typeinfo.h>
#include <provcont.h>
#include <provevt.h>
#include <provthrd.h>
#include <provlog.h>
#include <provval.h>
#include <provtype.h>
#include <provtree.h>
#include <provdnf.h>
#include <winsock.h>
#include "ipexport.h"
#include "icmpapi.h"
#include ".\res_str.h"
#include <Allocator.h>
#include <Thread.h>
#include <HashTable.h>
#include <PingProv.h>
#include <Pingtask.h>
#include <Pingfac.h>
CPingGetAsync::CPingGetAsync (
CPingProvider *a_Provider ,
wchar_t *a_ObjectPath ,
ULONG a_Flag ,
IWbemObjectSink *a_NotificationHandler ,
IWbemContext *a_Ctx
): m_ObjectPath(NULL),
m_ParsedObjectPath (NULL),
CPingTaskObject (a_Provider, a_NotificationHandler, a_Ctx)
{
if (a_ObjectPath != NULL)
{
int t_len = wcslen(a_ObjectPath);
if (t_len > 0)
{
m_ObjectPath = new WCHAR[t_len+1];
m_ObjectPath[t_len] = L'\0';
wcsncpy(m_ObjectPath, a_ObjectPath, t_len);
}
}
}
CPingGetAsync::~CPingGetAsync ()
{
if (m_ObjectPath)
{
delete [] m_ObjectPath ;
}
if (m_ParsedObjectPath)
{
delete m_ParsedObjectPath ;
}
}
BOOL CPingGetAsync::GetObject ()
{
InterlockedIncrement(&m_PingCount);
BOOL t_Status = ! m_ObjectPathParser.Parse ( m_ObjectPath , &m_ParsedObjectPath ) ;
if ( t_Status )
{
BOOL bClass = TRUE;
if ( _wcsicmp ( m_ParsedObjectPath->m_pClass , PROVIDER_NAME_CPINGPROVIDER) == 0 )
{
IWbemClassObject *t_Cls = NULL;
t_Status = GetClassObject ( &t_Cls ) ;
if ( t_Status )
{
t_Status = PerformGet() ;
t_Cls->Release();
}
else
{
t_Status = FALSE ;
SetErrorInfo(IDS_CLASS_DEFN,
WBEM_E_FAILED ) ;
}
}
else
{
t_Status = FALSE ;
SetErrorInfo(IDS_INVALID_CLASS ,
WBEM_E_FAILED ) ;
}
}
else
{
t_Status = FALSE ;
SetErrorInfo(IDS_OBJ_PATH ,
WBEM_E_FAILED ) ;
}
DecrementPingCount();
return t_Status ;
}
BOOL CPingGetAsync::PerformGet ()
{
if (m_ParsedObjectPath->m_dwNumKeys != PING_KEY_PROPERTY_COUNT)
{
SetErrorInfo(IDS_OBJ_PATH_KEYS ,
WBEM_E_FAILED ) ;
return FALSE;
}
BOOL t_Status = TRUE;
UCHAR t_bits[PING_KEY_PROPERTY_COUNT] = {0};
ULONG t_Address = 0 ;
ULONG t_TimeToLive = 0 ;
ULONG t_Timeout = 0 ;
ULONG t_SendSize = 0 ;
BOOL t_NoFragmentation = FALSE ;
ULONG t_TypeofService = 0 ;
ULONG t_RecordRoute = 0 ;
ULONG t_TimestampRoute = 0 ;
ULONG t_SourceRouteType = 0 ;
LPCWSTR t_SourceRoute = NULL ;
BOOL t_ResolveAddress = FALSE;
ULONG t_AddressKey = 0;
ULONG t_ResolveErr = 0;
for (int x = 0; ((x < PING_KEY_PROPERTY_COUNT) && t_Status); x++)
{
if (m_ParsedObjectPath->m_paKeys [ x ])
{
CKeyEntry t_key(m_ParsedObjectPath->m_paKeys [ x ]->m_pName) ;
ULONG t_PropertyIndex = 0xFF; //out of scope
if ( (CPingProvider::s_HashTable->Find(t_key, t_PropertyIndex) == e_StatusCode_Success)
&& (t_PropertyIndex < PING_KEY_PROPERTY_COUNT) )
{
if (t_bits[t_PropertyIndex] == 1)
{
t_Status = FALSE;
SetErrorInfo(IDS_OBJ_PATH_DUP_KEYS ,
WBEM_E_FAILED ) ;
}
else
{
t_bits[t_PropertyIndex] = 1;
switch (t_PropertyIndex)
{
case PING_ADDRESS_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_BSTR )
{
if (FAILED (Icmp_ResolveAddress ( m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.bstrVal , t_Address, &t_ResolveErr ))
&& (t_ResolveErr == 0) )
{
t_ResolveErr = WSAHOST_NOT_FOUND;
}
t_AddressKey = x;
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_ADDR_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
case PING_TIMEOUT_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_I4 )
{
t_Timeout = m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.lVal;
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_TO_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
case PING_TIMETOLIVE_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_I4 )
{
t_TimeToLive = m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.lVal;
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_TTL_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
case PING_BUFFERSIZE_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_I4 )
{
t_SendSize = m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.lVal;
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_BUFF_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
case PING_NOFRAGMENTATION_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_I4 )
{
t_NoFragmentation = (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.lVal != 0);
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_NOFRAG_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
case PING_TYPEOFSERVICE_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_I4 )
{
t_TypeofService = m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.lVal;
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_TOS_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
case PING_RECORDROUTE_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_I4 )
{
t_RecordRoute = m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.lVal;
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_RR_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
case PING_TIMESTAMPROUTE_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_I4 )
{
t_TimestampRoute = m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.lVal;
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_TS_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
case PING_SOURCEROUTETYPE_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_I4 )
{
t_SourceRouteType = m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.lVal;
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_SRT_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
case PING_SOURCEROUTE_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_BSTR )
{
t_SourceRoute = m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.bstrVal;
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_SR_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
case PING_RESOLVEADDRESSNAMES_INDEX:
{
if (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.vt == VT_I4 )
{
t_ResolveAddress = (m_ParsedObjectPath->m_paKeys [ x ]->m_vValue.lVal != 0);
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_RA_TYPE,
WBEM_E_FAILED ) ;
}
}
break;
default :
{
t_Status = FALSE;
SetErrorInfo(IDS_UNK_PROP,
WBEM_E_FAILED ) ;
}
}
}
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_UNK_KEY,
WBEM_E_FAILED ) ;
}
}
else
{
t_Status = FALSE;
SetErrorInfo(IDS_NO_KEYS,
WBEM_E_FAILED ) ;
}
}
if (t_Status)
{
InterlockedIncrement(&m_PingCount);
HRESULT t_Result = Icmp_RequestResponse (
m_ParsedObjectPath->m_paKeys [ t_AddressKey ]->m_vValue.bstrVal ,
t_Address ,
t_TimeToLive ,
t_Timeout ,
t_SendSize ,
t_NoFragmentation ,
t_TypeofService ,
t_RecordRoute ,
t_TimestampRoute ,
t_SourceRouteType ,
t_SourceRoute,
t_ResolveAddress,
t_ResolveErr
) ;
if ( SUCCEEDED ( t_Result ) )
{
SetErrorInfo(0, WBEM_E_NOT_FOUND ) ;
}
else
{
DecrementPingCount();
t_Status = FALSE;
}
}
return t_Status ;
}
HRESULT CPingGetAsync::GetDefaultTTL ( DWORD &a_TimeToLive )
{
HRESULT t_Result = S_OK ;
a_TimeToLive = DEFAULT_TTL ;
HKEY t_Registry ;
ULONG t_Status = RegOpenKeyEx (
HKEY_LOCAL_MACHINE,
L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
0,
KEY_QUERY_VALUE,
&t_Registry
) ;
if ( t_Status == ERROR_SUCCESS )
{
ULONG t_Type = 0 ;
ULONG t_Size = sizeof ( ULONG ) ;
t_Status = RegQueryValueEx (
t_Registry,
L"DefaultTTL",
0,
& t_Type,
( unsigned char * ) & a_TimeToLive ,
& t_Size
);
RegCloseKey ( t_Registry ) ;
}
return t_Result ;
}
void CPingGetAsync::HandleResponse (CPingCallBackObject *a_reply)
{
try
{
if (FAILED(Icmp_DecodeAndIndicate (a_reply)) )
{
SetErrorInfo(IDS_DECODE_GET,
WBEM_E_FAILED, TRUE ) ;
}
else
{
SetErrorInfo(NULL, S_OK, TRUE);
}
}
catch (...)
{
DecrementPingCount();
}
DecrementPingCount();
}
void CPingGetAsync::HandleErrorResponse (DWORD a_ErrMsgID, HRESULT a_HRes)
{
try
{
SetErrorInfo(a_ErrMsgID , a_HRes, TRUE) ;
}
catch (...)
{
DecrementPingCount();
}
DecrementPingCount();
}