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
10 KiB
477 lines
10 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();
|
|
}
|