/*++ 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 #include #include #include #include #include #include #include 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