///////////////////////////////////////////////////////////////////// // // CopyRight ( c ) 1999 Microsoft Corporation // // Module Name: instanceprov.cpp // // Description: // Implementation of CInstanceProv class // // Author: // Henry Wang ( henrywa ) March 8, 2000 // // ////////////////////////////////////////////////////////////////////// #include "DnsWmi.h" long glNumInst = 0; //*************************************************************************** // // CInstanceProv::CInstanceProv // CInstanceProv::~CInstanceProv // //*************************************************************************** CInstanceProv::CInstanceProv( BSTR ObjectPath, BSTR User, BSTR Password, IWbemContext * pCtx) { DBG_FN( "ctor" ) DNS_DEBUG( INSTPROV, ( "%s: count before increment is %d\n" " ObjectPath %S\n" " User %S\n", fn, g_cObj, ObjectPath, User )); InterlockedIncrement(&g_cObj); return; } CInstanceProv::~CInstanceProv(void) { DBG_FN( "dtor" ) DNS_DEBUG( INSTPROV, ( "%s: count before decrement is %d\n", fn, g_cObj )); InterlockedDecrement(&g_cObj); #ifdef _DEBUG _CrtDumpMemoryLeaks(); #endif return; } ///////////////////////////////////////////////////////////////////////////// //++ // // CInstanceProv::DoExecQueryAsync // // Description: // enum instance for a given class // // Arguments: // QueryLanguage [IN] // A valid BSTR containing one of the query languages // supported by Windows Management. This must be WQL. // Query [IN] // A valid BSTR containing the text of the query // lFlags [IN] WMI flag // pCtx* [IN] WMI context // pHandler* [IN] WMI sink pointer // // Return Value: // WBEM_S_NO_ERROR // //-- ///////////////////////////////////////////////////////////////////////////// SCODE CInstanceProv::DoExecQueryAsync( BSTR QueryLanguage, BSTR Query, long lFlags, IWbemContext *pCtx, IWbemObjectSink *pHandler ) { DBG_FN( "CIP::DoExecQueryAsync" ) DNS_DEBUG( INSTPROV, ( "%s: %S flags=%lu %S\n", fn, QueryLanguage, lFlags, Query )); SCODE sc = WBEM_S_NO_ERROR; try { CTextLexSource objQuerySource(Query); SQL1_Parser objParser(&objQuerySource); SQL_LEVEL_1_RPN_EXPRESSION * objQueryExpr = NULL; objParser.Parse( &objQueryExpr ); if ( !objQueryExpr ) { throw( WBEM_E_OUT_OF_MEMORY ); } CDnsBase* pDns = NULL ; sc = CreateClass( objQueryExpr->bsClassName, m_pNamespace, (void**) &pDns); if( FAILED ( sc ) ) { return sc; } auto_ptr pDnsBase(pDns); int nNumTokens = objQueryExpr->nNumTokens; CSqlEval* pEval = CSqlEval::CreateClass( objQueryExpr, &nNumTokens); auto_ptr apEval(pEval); sc = pDnsBase->ExecQuery( &(*apEval), lFlags, pCtx, pHandler); } catch(CDnsProvException e) { CWbemClassObject Status; SCODE sc = SetExtendedStatus(e.what(), Status); if ( SUCCEEDED ( sc ) ) { sc = pHandler->SetStatus(0, WBEM_E_FAILED,NULL,*(&Status)); return sc; } } catch(SCODE exSc) { sc = exSc; } catch(...) { sc = WBEM_E_FAILED; } pHandler->SetStatus(0, sc,NULL,NULL); return sc; }; ///////////////////////////////////////////////////////////////////////////// //++ // // CInstanceProv::DoCreateInstanceEnumAsync // // Description: // enum instance for a given class // // Arguments: // RefStr [IN[ name the class to enumerate // lFlags [IN] WMI flag // pCtx* [IN] WMI context // pHandler* [IN] WMI sink pointer // // Return Value: // WBEM_S_NO_ERROR // //-- ///////////////////////////////////////////////////////////////////////////// SCODE CInstanceProv::DoCreateInstanceEnumAsync( BSTR RefStr, long lFlags, IWbemContext *pCtx, IWbemObjectSink *pHandler ) { DBG_FN( "CIP::DoCreateInstanceEnumAsync" ); DNS_DEBUG( INSTPROV, ( "%s: flags=%lu %S\n", fn, lFlags, RefStr )); SCODE sc; int iCnt; // Do a check of arguments and make sure we have pointer to Namespace if(pHandler == NULL || m_pNamespace == NULL) return WBEM_E_INVALID_PARAMETER; try { CDnsBase* pDns = NULL ; sc = CreateClass(RefStr, m_pNamespace, (void**) &pDns); if( FAILED ( sc ) ) { return sc; } auto_ptr pDnsBase(pDns); sc = pDnsBase->EnumInstance( lFlags, pCtx, pHandler); } catch(CDnsProvException e) { CWbemClassObject Status; SCODE sc = SetExtendedStatus(e.what(), Status); if ( SUCCEEDED ( sc ) ) { sc = pHandler->SetStatus(0, WBEM_E_FAILED,NULL,*(&Status)); return sc; } } catch(SCODE exSc) { sc = exSc; } catch(...) { sc = WBEM_E_FAILED; } pHandler->SetStatus(0, sc,NULL,NULL); return sc; } ///////////////////////////////////////////////////////////////////////////// //++ // // CInstanceProv::GetObject // // Description: // Creates an instance given a particular path value. // // Arguments: // ObjectPath [IN] object path to an object // lFlags [IN] WMI flag // pCtx* [IN] WMI context // pHandler* [IN] WMI sink pointer // // Return Value: // WBEM_S_NO_ERROR // win32 error // //-- ///////////////////////////////////////////////////////////////////////////// SCODE CInstanceProv::DoGetObjectAsync( BSTR ObjectPath, long lFlags, IWbemContext *pCtx, IWbemObjectSink FAR* pHandler ) { DBG_FN( "CIP::DoGetObjectAsync" ); DNS_DEBUG( INSTPROV, ( "%s: flags=%lu %S\n", fn, lFlags, ObjectPath )); SCODE sc; IWbemClassObject FAR* pObj; BOOL bOK = FALSE; // Do a check of arguments and make sure we have pointer to Namespace if( ObjectPath == NULL || pHandler == NULL || m_pNamespace == NULL ) { DNS_DEBUG( INSTPROV, ( "%s: bad parameter - WBEM_E_INVALID_PARAMETER\n", fn )); return WBEM_E_INVALID_PARAMETER; } // do the get, pass the object on to the notify try { CObjPath ObjPath; if(!ObjPath.Init(ObjectPath)) { DNS_DEBUG( INSTPROV, ( "%s: bad object path - WBEM_E_INVALID_PARAMETER\n", fn )); return WBEM_E_INVALID_PARAMETER; } CDnsBase* pDns = NULL; wstring wstrClass = ObjPath.GetClassName(); sc = CreateClass( (WCHAR*)wstrClass.data(), m_pNamespace, (void**) &pDns); if( FAILED(sc) ) { DNS_DEBUG( INSTPROV, ( "%s: CreateClass returned 0x%08X\n", fn, sc )); return sc; } auto_ptr pDnsBase(pDns); sc = pDnsBase->GetObject( ObjPath, lFlags, pCtx, pHandler); } catch( CDnsProvException e ) { DNS_DEBUG( INSTPROV, ( "%s: caught CDnsProvException \"%s\"\n", fn, e.what() )); CWbemClassObject Status; SCODE sc = SetExtendedStatus(e.what(), Status); if ( SUCCEEDED ( sc ) ) { sc = pHandler->SetStatus(0, WBEM_E_FAILED,NULL,*(&Status)); return sc; } } catch(SCODE exSc) { sc = exSc; } catch(...) { sc = WBEM_E_FAILED; } pHandler->SetStatus(0, sc,NULL,NULL); #ifdef _DEBUG // _CrtDumpMemoryLeaks(); #endif return sc; } ///////////////////////////////////////////////////////////////////////////// //++ // // CInstanceProv::DoPutInstanceAsync // // Description: // save this instance // // Arguments: // pInst [IN] WMI object to be saved // lFlags [IN] WMI flag // pCtx* [IN] WMI context // pHandler* [IN] WMI sink pointer // // Return Value: // WBEM_S_NO_ERROR // //-- ///////////////////////////////////////////////////////////////////////////// SCODE CInstanceProv::DoPutInstanceAsync( IWbemClassObject *pInst, long lFlags, IWbemContext *pCtx, IWbemObjectSink *pHandler ) { DBG_FN( "CIP::DoPutInstanceAsync" ) DNS_DEBUG( INSTPROV, ( "%s: flags=%lu pInst=%p\n", fn, lFlags, pInst )); SCODE sc; if(pInst == NULL || pHandler == NULL ) { DNS_DEBUG( INSTPROV, ( "%s: returning WBEM_E_INVALID_PARAMETER\n" )); return WBEM_E_INVALID_PARAMETER; } try { // get class name wstring wstrClass; CWbemClassObject Inst(pInst); Inst.GetProperty( wstrClass, L"__Class"); wstring wstrPath; Inst.GetProperty( wstrPath, L"__RelPath"); CDnsBase* pDns = NULL; sc = CreateClass( wstrClass.data(), m_pNamespace, (void**) &pDns); if( FAILED(sc) ) { return sc; } auto_ptr pDnsBase(pDns); DNS_DEBUG( INSTPROV, ( "%s: doing base PutInstance\n" " class: %S\n" " path: %S\n", fn, wstrClass.c_str(), wstrPath.c_str() )); sc = pDnsBase->PutInstance( pInst, lFlags, pCtx, pHandler); } catch(CDnsProvException e) { DNS_DEBUG( INSTPROV, ( "%s: caught CDnsProvException \"%s\"\n", fn, e.what() )); CWbemClassObject Status; SCODE sc = SetExtendedStatus(e.what(), Status); if (SUCCEEDED ( sc )) { sc = pHandler->SetStatus(0, WBEM_E_FAILED,NULL,*(&Status)); return sc; } } catch(SCODE exSc) { DNS_DEBUG( INSTPROV, ( "%s: cauught SCODE 0x%08X\n", fn, exSc )); sc = exSc; } catch(...) { DNS_DEBUG( INSTPROV, ( "%s: cauught unknown exception returning WBEM_E_FAILED\n", fn )); sc = WBEM_E_FAILED; } pHandler->SetStatus(0, sc,NULL,NULL); #ifdef _DEBUG // _CrtDumpMemoryLeaks(); #endif return sc; } ///////////////////////////////////////////////////////////////////////////// //++ // // CInstanceProv::DoDeleteInstanceAsync // // Description: // delete this instance // // Arguments: // rObjPath [IN] ObjPath for the instance to be deleted // lFlags [IN] WMI flag // pCtx* [IN] WMI context // pHandler* [IN] WMI sink pointer // // Return Value: // WBEM_S_NO_ERROR // //-- ///////////////////////////////////////////////////////////////////////////// SCODE CInstanceProv::DoDeleteInstanceAsync( BSTR ObjectPath, long lFlags, IWbemContext * pCtx, IWbemObjectSink * pHandler ) { DBG_FN( "CIP::DoDeleteInstanceAsync" ); DNS_DEBUG( INSTPROV, ( "%s: flags=%lu %S\n", fn, lFlags, ObjectPath )); SCODE sc; // Do a check of arguments and make sure we have pointer to Namespace if(ObjectPath == NULL || pHandler == NULL ) { return WBEM_E_INVALID_PARAMETER; } // do the get, pass the object on to the notify try { CObjPath ObjPath; if(!ObjPath.Init(ObjectPath)) { return WBEM_E_INVALID_PARAMETER; } CDnsBase* pDns = NULL; wstring wstrClass = ObjPath.GetClassName(); sc = CreateClass( (WCHAR*)wstrClass.data(), m_pNamespace, (void**) &pDns); if( FAILED(sc) ) { return sc; } auto_ptr pDnsBase(pDns); sc = pDnsBase->DeleteInstance( ObjPath, lFlags, pCtx, pHandler); } catch(CDnsProvException e) { CWbemClassObject Status; SCODE sc = SetExtendedStatus(e.what(), Status); if (SUCCEEDED ( sc )) { sc = pHandler->SetStatus(0, WBEM_E_FAILED,NULL,*(&Status)); return sc; } } catch(SCODE exSc) { sc = exSc; } catch(...) { sc = WBEM_E_FAILED; } pHandler->SetStatus(0, sc,NULL,NULL); return sc; } ///////////////////////////////////////////////////////////////////////////// //++ // // CInstanceProv::DoExecMethodAsync // // Description: // execute methods for the given object // // Arguments: // ObjectPath [IN] object path to a given object // pwszMethodName [IN] name of the method to be invoked // lFlags [IN] WMI flag // pInParams* [IN] Input parameters for the method // pHandler* [IN] WMI sink pointer // // Return Value: // WBEM_S_NO_ERROR // //-- ///////////////////////////////////////////////////////////////////////////// SCODE CInstanceProv::DoExecMethodAsync( BSTR strObjectPath, BSTR strMethodName, long lFlags, IWbemContext *pCtx, IWbemClassObject *pInParams, IWbemObjectSink *pHandler ) { DBG_FN( "CIP::DoExecMethodAsync" ); DNS_DEBUG( INSTPROV, ( "%s: flags=%lu method=%S %S\n", fn, lFlags, strMethodName, strObjectPath )); SCODE sc; if(strObjectPath == NULL || pHandler == NULL || m_pNamespace == NULL || strMethodName == NULL ) return WBEM_E_INVALID_PARAMETER; CDnsBase * pDns; try { CObjPath ObjPath; if(!ObjPath.Init(strObjectPath)) { return WBEM_E_INVALID_PARAMETER; } wstring wstrClass = ObjPath.GetClassName(); sc = CreateClass( wstrClass.data(), m_pNamespace, (void**) &pDns); if( FAILED(sc) ) { return sc; } auto_ptr pDnsBase(pDns); sc = pDnsBase->ExecuteMethod( ObjPath, strMethodName, lFlags, pInParams, pHandler); } catch(CDnsProvException e) { DNS_DEBUG( INSTPROV, ( "%s: caught CDnsProvException %s\n", fn, e.what() )); CWbemClassObject Status; SCODE sc = SetExtendedStatus(e.what(), Status); if (SUCCEEDED ( sc )) { sc = pHandler->SetStatus( 0, WBEM_E_FAILED, NULL, *(&Status)); return sc; } } catch(SCODE exSc) { sc = exSc; DNS_DEBUG( INSTPROV, ( "%s: caught SCODE 0x%08X\n", fn, sc )); } catch(...) { sc = WBEM_E_FAILED; DNS_DEBUG( INSTPROV, ( "%s: caught unknown exception returning WBEM_E_FAILED\n", fn )); } pHandler->SetStatus(0, sc,NULL,NULL); #ifdef _DEBUG // _CrtDumpMemoryLeaks(); #endif DNS_DEBUG( INSTPROV, ( "%s: returning 0x%08X\n", fn, sc )); return sc; } ///////////////////////////////////////////////////////////////////////////// //++ // // CInstanceProv::SetExtendedStatus // // Description: // create and set extended error status // // Arguments: // ErrString [IN] Error message string // Inst [IN OUT] reference to WMI instance // // Return Value: // WBEM_S_NO_ERROR // //-- ///////////////////////////////////////////////////////////////////////////// SCODE CInstanceProv::SetExtendedStatus( const char* ErrString, CWbemClassObject& Inst) { DBG_FN( "CIP::SetExtendedStatus" ); DNS_DEBUG( INSTPROV, ( "%s\n", fn )); IWbemClassObject* pStatus; BSTR bstrStatus = SysAllocString(L"__ExtendedStatus"); if( bstrStatus == NULL) { return WBEM_E_OUT_OF_MEMORY; } SCODE sc = m_pNamespace->GetObject( bstrStatus, 0, 0, &pStatus, NULL) ; SysFreeString(bstrStatus); if( SUCCEEDED ( sc ) ) { sc = pStatus->SpawnInstance(0, &Inst); if ( SUCCEEDED ( sc )) { sc = Inst.SetProperty( ErrString, L"Description"); } } return sc; }