344 lines
7.9 KiB
C++
344 lines
7.9 KiB
C++
/*++
|
|
|
|
Copyright (c) 1998-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
utils.h
|
|
|
|
Abstract:
|
|
|
|
General purpose utilities
|
|
|
|
Author:
|
|
|
|
???
|
|
|
|
Revision History:
|
|
|
|
Mohit Srivastava 18-Dec-00
|
|
|
|
--*/
|
|
|
|
#ifndef _utils_h_
|
|
#define _utils_h_
|
|
|
|
|
|
#define MAX_BUF_SIZE 1024
|
|
#define MAX_KEY_NAME_SIZE 32
|
|
#define MAX_KEY_TYPE_SIZE 32
|
|
|
|
#include "WbemServices.h"
|
|
#include "schema.h"
|
|
#include <wbemprov.h>
|
|
#include <windows.h>
|
|
#include <comutil.h>
|
|
#include <genlex.h>
|
|
#include <opathlex.h>
|
|
#include <objpath.h>
|
|
#include <dbgutil.h>
|
|
#include <atlbase.h>
|
|
|
|
class CUtils
|
|
{
|
|
public:
|
|
//
|
|
// Wrappers for commonly used WMI operations
|
|
//
|
|
static HRESULT CreateEmptyMethodInstance(
|
|
CWbemServices* i_pNamespace,
|
|
IWbemContext* i_pCtx,
|
|
LPCWSTR i_wszClassName,
|
|
LPCWSTR i_wszMethodName,
|
|
IWbemClassObject** o_ppMethodInstance);
|
|
|
|
static HRESULT GetQualifiers(
|
|
IWbemClassObject* i_pClass,
|
|
LPCWSTR* i_awszQualNames,
|
|
VARIANT* io_aQualValues,
|
|
ULONG i_NrQuals);
|
|
|
|
static HRESULT GetPropertyQualifiers(
|
|
IWbemClassObject* i_pClass,
|
|
LPCWSTR i_wszPropName,
|
|
DWORD* io_pdwQuals);
|
|
|
|
static HRESULT SetQualifiers(
|
|
IWbemClassObject* i_pClass,
|
|
LPCWSTR* i_awszQualNames,
|
|
VARIANT* i_avtQualValues,
|
|
ULONG i_iNrQuals,
|
|
ULONG i_iFlags);
|
|
|
|
static HRESULT SetMethodQualifiers(
|
|
IWbemClassObject* i_pClass,
|
|
LPCWSTR i_wszMethName,
|
|
LPCWSTR* i_awszQualNames,
|
|
VARIANT* i_avtQualValues,
|
|
ULONG i_iNrQuals);
|
|
|
|
static HRESULT SetPropertyQualifiers(
|
|
IWbemClassObject* i_pClass,
|
|
LPCWSTR i_wszPropName,
|
|
LPCWSTR* i_awszQualNames,
|
|
VARIANT* i_avtQualValues,
|
|
ULONG i_iNrQuals);
|
|
|
|
static HRESULT CreateEmptyInstance(
|
|
LPWSTR i_wszClass,
|
|
CWbemServices* i_pNamespace,
|
|
IWbemClassObject** o_ppInstance);
|
|
|
|
//
|
|
// Retrieval from schema
|
|
//
|
|
static bool GetClass(
|
|
LPCWSTR i_wszClassName,
|
|
WMI_CLASS** o_ppClass);
|
|
|
|
static bool GetAssociation(
|
|
LPCWSTR i_wszAssocName,
|
|
WMI_ASSOCIATION** o_ppAssoc);
|
|
|
|
static bool GetMethod(
|
|
LPCWSTR i_wszMethod,
|
|
WMI_METHOD** i_apMethodList,
|
|
WMI_METHOD** o_ppMethod);
|
|
|
|
//
|
|
// Data conversion/comparison
|
|
//
|
|
static bool CompareKeyType(
|
|
LPCWSTR i_wszKeyFromMb,
|
|
METABASE_KEYTYPE* i_pktKeyCompare);
|
|
|
|
static bool CompareMultiSz(
|
|
WCHAR* i_msz1,
|
|
WCHAR* i_msz2);
|
|
|
|
static HRESULT CreateByteArrayFromSafeArray(
|
|
_variant_t& i_vt,
|
|
LPBYTE* o_paBytes,
|
|
DWORD* io_pdw);
|
|
|
|
static HRESULT LoadSafeArrayFromByteArray(
|
|
LPBYTE i_aBytes,
|
|
DWORD i_iBytes,
|
|
_variant_t& io_vt);
|
|
|
|
static bool CompareByteArray(
|
|
LPBYTE i_aBytes1,
|
|
ULONG i_iBytes1,
|
|
LPBYTE i_aBytes2,
|
|
ULONG i_iBytes2
|
|
);
|
|
|
|
static BSTR ExtractBstrFromVt(
|
|
const VARIANT* i_pvt,
|
|
LPCWSTR i_wszVtName=NULL);
|
|
|
|
static LONG ExtractLongFromVt(
|
|
const VARIANT* i_pvt,
|
|
LPCWSTR i_wszVtName=NULL);
|
|
|
|
//
|
|
// Other
|
|
//
|
|
static KeyRef* GetKey(
|
|
ParsedObjectPath* i_pParsedObjectPath,
|
|
WCHAR* i_wsz);
|
|
|
|
static void GetMetabasePath(
|
|
IWbemClassObject* i_pObj,
|
|
ParsedObjectPath* i_pParsedObjectPath,
|
|
WMI_CLASS* i_pClass,
|
|
_bstr_t& io_bstrPath);
|
|
|
|
static HRESULT GetParentMetabasePath(
|
|
LPCWSTR i_wszChildPath,
|
|
LPWSTR io_wszParentPath);
|
|
|
|
static HRESULT ConstructObjectPath(
|
|
LPCWSTR i_wszMbPath,
|
|
const WMI_CLASS* i_pClass,
|
|
BSTR* o_pbstrPath);
|
|
|
|
static void FileTimeToWchar(
|
|
FILETIME* i_pFileTime,
|
|
LPWSTR io_wszDateTime);
|
|
|
|
//
|
|
// For exception handling and/or errors
|
|
//
|
|
static HRESULT ParserErrToHR(DWORD i_dwErr)
|
|
{
|
|
switch(i_dwErr)
|
|
{
|
|
case CObjectPathParser::NoError:
|
|
break;
|
|
case CObjectPathParser::OutOfMemory:
|
|
return WBEM_E_OUT_OF_MEMORY;
|
|
default:
|
|
return WBEM_E_INVALID_OBJECT;
|
|
}
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
|
|
static void HRToText(
|
|
HRESULT i_hr,
|
|
BSTR* o_pbstrText);
|
|
|
|
static void MessageCodeToText(
|
|
DWORD i_dwMC,
|
|
va_list* i_pArgs,
|
|
BSTR* o_pbstrText);
|
|
|
|
static void Throw_Exception(HRESULT, METABASE_PROPERTY*);
|
|
};
|
|
|
|
|
|
|
|
class CIIsProvException
|
|
{
|
|
public:
|
|
CIIsProvException() :
|
|
m_hr(0),
|
|
m_bErrorSet(false)
|
|
{
|
|
}
|
|
|
|
~CIIsProvException()
|
|
{
|
|
}
|
|
|
|
void SetHR(HRESULT i_hr, LPCWSTR i_wszParams=NULL)
|
|
/*++
|
|
|
|
Synopsis:
|
|
|
|
Arguments: [i_hr] - The HR
|
|
[i_wszParams=NULL] - The param field of __ExtendedStatus
|
|
|
|
--*/
|
|
{
|
|
DBG_ASSERT(m_bErrorSet == false);
|
|
m_hr = i_hr;
|
|
m_sbstrParams = i_wszParams;
|
|
|
|
m_bErrorSet = true;
|
|
|
|
ConstructStringFromHR(i_hr);
|
|
}
|
|
|
|
void SetMC(HRESULT i_hr, DWORD i_dwMC, LPCWSTR i_wszParams, ...)
|
|
/*++
|
|
|
|
Synopsis:
|
|
|
|
Arguments: [i_hr] - The HR
|
|
[i_dwMC] - The MC code
|
|
[i_wszParams] - The param field of __ExtendedStatus
|
|
[...] - The args for the MC error string
|
|
|
|
--*/
|
|
{
|
|
DBG_ASSERT(m_bErrorSet == false);
|
|
m_hr = i_hr;
|
|
m_sbstrParams = i_wszParams;
|
|
|
|
va_list (marker);
|
|
va_start(marker, i_wszParams);
|
|
|
|
m_bErrorSet = true;
|
|
|
|
ConstructStringFromMC(i_dwMC, &marker);
|
|
}
|
|
|
|
//
|
|
// For getting errors (Get text representation, hr, and culprit param)
|
|
// These are fields of __Extended Status
|
|
//
|
|
|
|
HRESULT GetHR() const
|
|
{
|
|
DBG_ASSERT(m_bErrorSet == true);
|
|
return m_hr;
|
|
}
|
|
|
|
BSTR GetParams() const
|
|
{
|
|
DBG_ASSERT(m_bErrorSet == true);
|
|
return m_sbstrParams;
|
|
}
|
|
|
|
BSTR GetErrorText() const
|
|
{
|
|
DBG_ASSERT(m_bErrorSet == true);
|
|
return m_sbstrError;
|
|
}
|
|
|
|
private:
|
|
void ConstructStringFromHR(
|
|
HRESULT i_hr)
|
|
{
|
|
DBG_ASSERT(m_bErrorSet == true);
|
|
|
|
//
|
|
// If this fails, m_sbstrError will be NULL. This is okay.
|
|
//
|
|
CUtils::HRToText(i_hr, &m_sbstrError);
|
|
}
|
|
|
|
void ConstructStringFromMC(
|
|
DWORD i_dwMC,
|
|
va_list* i_pArgs)
|
|
{
|
|
DBG_ASSERT(m_bErrorSet == true);
|
|
|
|
//
|
|
// If this fails, m_sbstrError will be NULL. This is okay.
|
|
//
|
|
CUtils::MessageCodeToText(i_dwMC, i_pArgs, &m_sbstrError);
|
|
}
|
|
|
|
//
|
|
// These are fields of __ExtendedStatus
|
|
//
|
|
HRESULT m_hr;
|
|
CComBSTR m_sbstrParams;
|
|
CComBSTR m_sbstrError;
|
|
|
|
//
|
|
// Used just for assert
|
|
//
|
|
bool m_bErrorSet;
|
|
};
|
|
|
|
|
|
#define THROW_ON_FALSE(b) \
|
|
if (!b) \
|
|
throw((HRESULT)WBEM_E_FAILED);
|
|
|
|
// if client cancelled, stop and return successfully
|
|
#define THROW_ON_ERROR(hr) \
|
|
if (FAILED(hr)) \
|
|
{ \
|
|
DBGPRINTF((DBG_CONTEXT, "FAILED: hr = %x\n", hr)); \
|
|
throw(hr == WBEM_E_CALL_CANCELLED ? WBEM_NO_ERROR : (HRESULT)hr); \
|
|
} \
|
|
|
|
#define THROW_E_ON_ERROR(hr, pmbp) \
|
|
if (FAILED(hr)) \
|
|
{ \
|
|
CUtils::Throw_Exception(hr, pmbp); \
|
|
}
|
|
|
|
#define EXIT_ON_ERROR(hr) \
|
|
if(FAILED(hr)) \
|
|
{ \
|
|
goto exit; \
|
|
}
|
|
|
|
|
|
#endif |