Leaked source code of windows server 2003
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.

2092 lines
48 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ObjectPath.cpp
  7. //
  8. // Description:
  9. // Implementation of class CObjpath, CProvException, CProvExceptionHr,
  10. // and CProvExceptionWin32.
  11. //
  12. // Author:
  13. // Henry Wang (HenryWa) 24-AUG-1999
  14. // MSP Prabu (mprabu) 06-Jan-2001
  15. //
  16. //////////////////////////////////////////////////////////////////////////////
  17. #include "Pch.h"
  18. #include "ObjectPath.h"
  19. //****************************************************************************
  20. //
  21. // CObjPath
  22. //
  23. //****************************************************************************
  24. //////////////////////////////////////////////////////////////////////////////
  25. //++
  26. //
  27. // CObjPath::CObjPath( void )
  28. //
  29. // Description:
  30. // Constructor.
  31. //
  32. // Arguments:
  33. // None.
  34. //
  35. // Return Values:
  36. // None.
  37. //
  38. //--
  39. //////////////////////////////////////////////////////////////////////////////
  40. CObjPath::CObjPath( void )
  41. : m_parsedObj( NULL )
  42. {
  43. } //*** CObjPath::CObjPath()
  44. //////////////////////////////////////////////////////////////////////////////
  45. //++
  46. //
  47. // CObjPath::~CObjPath( void )
  48. //
  49. // Description:
  50. // Destructor.
  51. //
  52. // Arguments:
  53. // None.
  54. //
  55. // Return Values:
  56. // None.
  57. //
  58. //--
  59. //////////////////////////////////////////////////////////////////////////////
  60. CObjPath::~CObjPath( void )
  61. {
  62. CObjectPathParser objParser( e_ParserAcceptRelativeNamespace );
  63. objParser.Free( m_parsedObj );
  64. } //*** CObjPath::~CObjPath()
  65. //////////////////////////////////////////////////////////////////////////////
  66. //++
  67. //
  68. // _bstr_t
  69. // CObjPath::GetStringValueForProperty(
  70. // LPCWSTR pwszIn
  71. // )
  72. //
  73. // Description:
  74. // Retrieve the string value for the given property.
  75. //
  76. // Arguments:
  77. // pwszIn -- Name of the property
  78. //
  79. // Return Values:
  80. // The property's value.
  81. //
  82. //--
  83. //////////////////////////////////////////////////////////////////////////////
  84. _bstr_t
  85. CObjPath::GetStringValueForProperty(
  86. LPCWSTR pwszIn
  87. )
  88. {
  89. int idx;
  90. KeyRef * pKey;
  91. _ASSERTE(pwszIn != NULL);
  92. for( idx = 0 ; idx < m_parsedObj->m_dwNumKeys ; idx++ )
  93. {
  94. pKey = m_parsedObj->m_paKeys[ idx ];
  95. if( _wcsicmp( pKey->m_pName, pwszIn ) == 0 )
  96. {
  97. if( pKey->m_vValue.vt == VT_BSTR )
  98. {
  99. return pKey->m_vValue.bstrVal;
  100. }
  101. }
  102. }
  103. return L"";
  104. } //*** CObjPath::GetStringValueForProperty()
  105. //////////////////////////////////////////////////////////////////////////////
  106. //++
  107. //
  108. // long
  109. // CObjPath::GetLongValueForProperty(
  110. // LPCWSTR pwszIn
  111. // )
  112. //
  113. // Description:
  114. // Retrieve the long value for the given property.
  115. //
  116. // Arguments:
  117. // pwszIn -- Name of the property
  118. //
  119. // Return Values:
  120. // The property's value.
  121. //
  122. //--
  123. //////////////////////////////////////////////////////////////////////////////
  124. long
  125. CObjPath::GetLongValueForProperty(
  126. LPCWSTR pwszIn
  127. )
  128. {
  129. int idx;
  130. KeyRef * pKey;
  131. _ASSERTE(pwszIn != NULL);
  132. for( idx = 0 ; idx < m_parsedObj->m_dwNumKeys ; idx++ )
  133. {
  134. pKey = m_parsedObj->m_paKeys[ idx ];
  135. if( _wcsicmp( pKey->m_pName, pwszIn ) == 0 )
  136. {
  137. if( pKey->m_vValue.vt == VT_I4 )
  138. {
  139. return pKey->m_vValue.lVal;
  140. }
  141. }
  142. }
  143. return 0;
  144. } //*** CObjPath::GetLongValueForProperty()
  145. //////////////////////////////////////////////////////////////////////////////
  146. //++
  147. //
  148. // LONGLONG
  149. // CObjPath::GetI64ValueForProperty(
  150. // LPCWSTR pwszIn
  151. // )
  152. //
  153. // Description:
  154. // Retrieve the I64 value for the given property.
  155. // I64 properties are handled as strings in WMI.
  156. //
  157. // Arguments:
  158. // pwszIn -- Name of the property
  159. //
  160. // Return Values:
  161. // The property's value.
  162. //
  163. //--
  164. //////////////////////////////////////////////////////////////////////////////
  165. LONGLONG
  166. CObjPath::GetI64ValueForProperty(
  167. LPCWSTR pwszIn
  168. )
  169. {
  170. int idx;
  171. KeyRef * pKey;
  172. LONGLONG llRetVal = 0;
  173. WCHAR wszTemp[g_cchMAX_I64DEC_STRING] = L"";
  174. _ASSERTE(pwszIn != NULL);
  175. for( idx = 0 ; idx < m_parsedObj->m_dwNumKeys ; idx++ )
  176. {
  177. pKey = m_parsedObj->m_paKeys[ idx ];
  178. if( _wcsicmp( pKey->m_pName, pwszIn ) == 0 )
  179. {
  180. if( pKey->m_vValue.vt == VT_BSTR )
  181. {
  182. llRetVal = _wtoi64((WCHAR *) pKey->m_vValue.bstrVal);
  183. _i64tow( llRetVal, wszTemp, 10 );
  184. if ( _wcsicmp( wszTemp, (WCHAR *) pKey->m_vValue.bstrVal ) )
  185. {
  186. CProvException e( E_INVALIDARG );
  187. throw e;
  188. }
  189. return llRetVal;
  190. }
  191. }
  192. }
  193. return llRetVal;
  194. } //*** CObjPath::GetI64ValueForProperty()
  195. //////////////////////////////////////////////////////////////////////////////
  196. //++
  197. //
  198. // _bstr_t
  199. // CObjPath::GetClassName( void )
  200. //
  201. // Description:
  202. // Get the class name.
  203. //
  204. // Arguments:
  205. // None.
  206. //
  207. // Return Values:
  208. // Class name string.
  209. //
  210. //--
  211. //////////////////////////////////////////////////////////////////////////////
  212. _bstr_t
  213. CObjPath::GetClassName( void )
  214. {
  215. return m_parsedObj->m_pClass;
  216. } //*** CObjPath::GetClassName()
  217. //////////////////////////////////////////////////////////////////////////////
  218. //++
  219. //
  220. // BOOL
  221. // CObjPath::Init(
  222. // LPCWSTR pwszPathIn
  223. // )
  224. //
  225. // Description:
  226. // Initialize the object.
  227. //
  228. // Arguments:
  229. // pwszPathIn -- Object path string
  230. //
  231. // Return Values:
  232. // TRUE
  233. // FALSE
  234. //
  235. //--
  236. //////////////////////////////////////////////////////////////////////////////
  237. BOOL
  238. CObjPath::Init(
  239. LPCWSTR pwszPathIn
  240. )
  241. {
  242. if ( pwszPathIn == NULL )
  243. {
  244. return FALSE;
  245. }
  246. else
  247. {
  248. CObjectPathParser objParser( e_ParserAcceptRelativeNamespace );
  249. objParser.Parse(
  250. const_cast< WCHAR * >( pwszPathIn ),
  251. &m_parsedObj
  252. );
  253. }
  254. if ( m_parsedObj == NULL )
  255. {
  256. return FALSE;
  257. } // if:
  258. return TRUE;
  259. } //*** CObjPath::Init()
  260. //////////////////////////////////////////////////////////////////////////////
  261. //++
  262. //
  263. // BOOL
  264. // CObjPath::SetClass(
  265. // LPCWSTR pwszValueIn
  266. // )
  267. //
  268. // Description:
  269. // Set the name of the class for the object path.
  270. //
  271. // Arguments:
  272. // pwszValueIn -- Class name string.
  273. //
  274. // Return Values:
  275. // TRUE
  276. // FALSE
  277. //
  278. //--
  279. //////////////////////////////////////////////////////////////////////////////
  280. BOOL
  281. CObjPath::SetClass(
  282. LPCWSTR pwszValueIn
  283. )
  284. {
  285. _ASSERTE(pwszValueIn != NULL);
  286. return m_parsedObj->SetClassName( pwszValueIn );
  287. } //*** CObjPath::SetClass()
  288. //////////////////////////////////////////////////////////////////////////////
  289. //++
  290. //
  291. // BOOL
  292. // CObjPath::AddProperty(
  293. // IN LPCWSTR pwszNameIn,
  294. // IN LPCWSTR pwszValueIn
  295. // )
  296. //
  297. // Description:
  298. // Add property to object path.
  299. //
  300. // Arguments:
  301. // pwszNameIn -- Name of the property.
  302. // pwszValueIn -- Value of the property in WCHAR* format.
  303. //
  304. // Return Values:
  305. // TRUE
  306. // FALSE
  307. //
  308. //--
  309. //////////////////////////////////////////////////////////////////////////////
  310. BOOL
  311. CObjPath::AddProperty(
  312. IN LPCWSTR pwszNameIn,
  313. IN LPCWSTR pwszValueIn
  314. )
  315. {
  316. VARIANT v;
  317. BOOL bRt = FALSE;
  318. _ASSERTE(pwszNameIn != NULL);
  319. _ASSERTE(pwszValueIn != NULL);
  320. VariantInit( & v );
  321. v.vt = VT_BSTR;
  322. v.bstrVal = _bstr_t( pwszValueIn ).copy( );
  323. bRt = m_parsedObj->AddKeyRef(
  324. pwszNameIn,
  325. & v
  326. );
  327. VariantClear( & v );
  328. return bRt;
  329. } //*** CObjPath::AddProperty()
  330. //////////////////////////////////////////////////////////////////////////////
  331. //++
  332. //
  333. // _bstr_t
  334. // CObjPath::GetObjectPathString( void )
  335. //
  336. // Description:
  337. // Retrieve object path string.
  338. //
  339. // Arguments:
  340. // None.
  341. //
  342. // Return Values:
  343. // Object path string in _bstr_t.
  344. //
  345. //--
  346. //////////////////////////////////////////////////////////////////////////////
  347. _bstr_t
  348. CObjPath::GetObjectPathString( void )
  349. {
  350. LPWSTR pwszPath = NULL;
  351. _bstr_t bstrResult;
  352. try
  353. {
  354. CObjectPathParser::Unparse( m_parsedObj, & pwszPath );
  355. bstrResult = pwszPath;
  356. }
  357. catch( ... ) //catch _com_error
  358. {
  359. if ( pwszPath )
  360. {
  361. delete [] pwszPath;
  362. }
  363. throw;
  364. }
  365. if ( pwszPath )
  366. {
  367. delete [] pwszPath;
  368. }
  369. return bstrResult;
  370. } //*** CObjPath::GetObjectPathString()
  371. //////////////////////////////////////////////////////////////////////////////
  372. //++
  373. //
  374. // BOOL
  375. // CObjPath::AddProperty(
  376. // LPCWSTR pwszNameIn,
  377. // VARIANT * pvValueIn
  378. // )
  379. //
  380. // Description:
  381. // Add a property to this instance.
  382. //
  383. // Arguments:
  384. // pwszNameIn -- Name of the property.
  385. // pvValueIn -- Value of the property in VARIANT format
  386. //
  387. // Return Values:
  388. // TRUE
  389. // FALSE
  390. //
  391. //--
  392. //////////////////////////////////////////////////////////////////////////////
  393. BOOL
  394. CObjPath::AddProperty(
  395. LPCWSTR pwszNameIn,
  396. VARIANT * pvValueIn
  397. )
  398. {
  399. _ASSERTE(pwszNameIn != NULL);
  400. _ASSERTE(pvValueIn != NULL);
  401. return m_parsedObj->AddKeyRef( pwszNameIn, pvValueIn );
  402. } //*** CObjPath::AddProperty
  403. //****************************************************************************
  404. //
  405. // CProvException
  406. //
  407. //****************************************************************************
  408. //////////////////////////////////////////////////////////////////////////////
  409. //++
  410. //
  411. // LPCWSTR
  412. // CProvException::PwszErrorMessage( void ) const
  413. //
  414. // Description:
  415. // retrieve Error message
  416. //
  417. // Arguments:
  418. // None.
  419. //
  420. // Return Values:
  421. // Null-terminated Unicode error message from the exception.
  422. //
  423. //--
  424. //////////////////////////////////////////////////////////////////////////////
  425. LPCWSTR
  426. CProvException::PwszErrorMessage( void ) const
  427. {
  428. if ( m_bstrError.length( ) == 0 )
  429. {
  430. LPWSTR pError = NULL;
  431. DWORD rt = FormatMessage(
  432. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  433. NULL,
  434. HRESULT_CODE( m_hr ),
  435. MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
  436. (LPWSTR) &pError,
  437. 0,
  438. NULL
  439. );
  440. m_bstrError = pError;
  441. LocalFree( pError );
  442. } // if: string is empty
  443. return m_bstrError;
  444. } //*** CProvException::PwszErrorMessage()
  445. //****************************************************************************
  446. //
  447. // CWbemClassObject
  448. //
  449. //****************************************************************************
  450. //////////////////////////////////////////////////////////////////////////////
  451. //++
  452. //
  453. // CWbemClassObject::CWbemClassObject( void )
  454. //
  455. // Description:
  456. // Constructor.
  457. //
  458. // Arguments:
  459. // None.
  460. //
  461. // Return Values:
  462. // None.
  463. //
  464. //--
  465. //////////////////////////////////////////////////////////////////////////////
  466. CWbemClassObject::CWbemClassObject( void )
  467. : m_pClassObject( NULL )
  468. {
  469. VariantInit( &m_v );
  470. } //*** CWbemClassObject::CWbemClassObject()
  471. //////////////////////////////////////////////////////////////////////////////
  472. //++
  473. //
  474. // CWbemClassObject::CWbemClassObject(
  475. // IWbemClassObject * pInstIn
  476. // )
  477. //
  478. // Description:
  479. // Constructor.
  480. //
  481. // Arguments:
  482. // pInstIn -- WMI class object interface.
  483. //
  484. // Return Values:
  485. // None.
  486. //
  487. //--
  488. //////////////////////////////////////////////////////////////////////////////
  489. CWbemClassObject::CWbemClassObject(
  490. IWbemClassObject * pInstIn
  491. )
  492. : m_pClassObject( NULL )
  493. {
  494. m_pClassObject = pInstIn;
  495. if ( m_pClassObject )
  496. {
  497. m_pClassObject->AddRef();
  498. }
  499. VariantInit( &m_v );
  500. } //*** CWbemClassObject::CWbemClassObject( pInstIn )
  501. //////////////////////////////////////////////////////////////////////////////
  502. //++
  503. //
  504. // CWbemClassObject::~CWbemClassObject( void )
  505. //
  506. // Description:
  507. // Destructor.
  508. //
  509. // Arguments:
  510. // None.
  511. //
  512. // Return Values:
  513. // None.
  514. //
  515. //--
  516. //////////////////////////////////////////////////////////////////////////////
  517. CWbemClassObject::~CWbemClassObject( void )
  518. {
  519. if ( m_pClassObject )
  520. {
  521. m_pClassObject->Release();
  522. }
  523. VariantClear( &m_v );
  524. } //*** CWbemClassObject::~CWbemClassObject()
  525. //////////////////////////////////////////////////////////////////////////////
  526. //++
  527. //
  528. // HRESULT
  529. // CWbemClassObject::SetProperty(
  530. // DWORD dwValueIn,
  531. // LPCWSTR pwszPropNameIn
  532. // )
  533. //
  534. // Description:
  535. // Set dword value of a property.
  536. //
  537. // Arguments:
  538. // dwValueIn -- Property dword value
  539. // pwszPropNameIn -- Property Name
  540. //
  541. // Return Values:
  542. // WBEM_S_NO_ERROR
  543. //
  544. //--
  545. //////////////////////////////////////////////////////////////////////////////
  546. HRESULT
  547. CWbemClassObject::SetProperty(
  548. DWORD dwValueIn,
  549. LPCWSTR pwszPropNameIn
  550. )
  551. {
  552. HRESULT sc;
  553. _ASSERTE(pwszPropNameIn != NULL);
  554. VariantClear( &m_v );
  555. m_v.vt = VT_I4;
  556. m_v.lVal = dwValueIn;
  557. sc = m_pClassObject->Put(
  558. _bstr_t( pwszPropNameIn ),
  559. 0,
  560. &m_v,
  561. 0
  562. );
  563. if ( FAILED( sc ) )
  564. {
  565. throw CProvException( sc );
  566. }
  567. return sc;
  568. } //*** CWbemClassObject::SetProperty( dwValueIn )
  569. //////////////////////////////////////////////////////////////////////////////
  570. //++
  571. //
  572. // HRESULT
  573. // CWbemClassObject::SetProperty(
  574. // double dblValueIn,
  575. // LPCWSTR pwszPropNameIn
  576. // )
  577. //
  578. // Description:
  579. // Set dword value of a property.
  580. //
  581. // Arguments:
  582. // dblValueIn -- Property double value
  583. // pwszPropNameIn -- Property Name
  584. //
  585. // Return Values:
  586. // WBEM_S_NO_ERROR
  587. //
  588. //--
  589. //////////////////////////////////////////////////////////////////////////////
  590. HRESULT
  591. CWbemClassObject::SetPropertyR64(
  592. double dblValueIn,
  593. LPCWSTR pwszPropNameIn
  594. )
  595. {
  596. HRESULT sc;
  597. _ASSERTE(pwszPropNameIn != NULL);
  598. VariantClear( &m_v );
  599. m_v.vt = VT_R8;
  600. m_v.dblVal = dblValueIn;
  601. sc = m_pClassObject->Put(
  602. _bstr_t( pwszPropNameIn ),
  603. 0,
  604. &m_v,
  605. 0
  606. );
  607. if ( FAILED( sc ) )
  608. {
  609. throw CProvException( sc );
  610. }
  611. return sc;
  612. } //*** CWbemClassObject::SetPropertyR64( dblValueIn )
  613. //////////////////////////////////////////////////////////////////////////////
  614. //++
  615. //
  616. // HRESULT
  617. // CWbemClassObject::SetPropertyI64(
  618. // LONGLONG llValueIn,
  619. // LPCWSTR pwszPropNameIn
  620. // )
  621. //
  622. // Description:
  623. // Set LONGLONG value of a property.
  624. //
  625. // Arguments:
  626. // llValueIn -- Property LONGLONG value
  627. // pwszPropNameIn -- Property Name
  628. //
  629. // Return Values:
  630. // WBEM_S_NO_ERROR
  631. //
  632. //--
  633. //////////////////////////////////////////////////////////////////////////////
  634. HRESULT
  635. CWbemClassObject::SetPropertyI64(
  636. ULONGLONG ullValueIn,
  637. LPCWSTR pwszPropNameIn
  638. )
  639. {
  640. // Integers in 64-bit format must be encoded as strings
  641. // because Automation does not support a 64-bit integral type
  642. HRESULT sc;
  643. WCHAR wszTemp[g_cchMAX_I64DEC_STRING] = L"";
  644. _ASSERTE(pwszPropNameIn != NULL);
  645. VariantClear( &m_v );
  646. m_v.vt = VT_BSTR;
  647. _ui64tow( ullValueIn, wszTemp, 10 );
  648. m_v.bstrVal = _bstr_t( wszTemp ).copy();
  649. sc = m_pClassObject->Put(
  650. _bstr_t( pwszPropNameIn ),
  651. 0,
  652. &m_v,
  653. 0
  654. );
  655. if ( FAILED( sc ) )
  656. {
  657. throw CProvException( sc );
  658. }
  659. return sc;
  660. } //*** CWbemClassObject::SetPropertyI64( llValueIn )
  661. //////////////////////////////////////////////////////////////////////////////
  662. //++
  663. //
  664. // HRESULT
  665. // CWbemClassObject::SetPropertyI64(
  666. // LONGLONG llValueIn,
  667. // LPCWSTR pwszPropNameIn
  668. // )
  669. //
  670. // Description:
  671. // Set LONGLONG value of a property.
  672. //
  673. // Arguments:
  674. // llValueIn -- Property LONGLONG value
  675. // pwszPropNameIn -- Property Name
  676. //
  677. // Return Values:
  678. // WBEM_S_NO_ERROR
  679. //
  680. //--
  681. //////////////////////////////////////////////////////////////////////////////
  682. HRESULT
  683. CWbemClassObject::SetPropertyI64(
  684. LONGLONG llValueIn,
  685. LPCWSTR pwszPropNameIn
  686. )
  687. {
  688. // Integers in 64-bit format must be encoded as strings
  689. // because Automation does not support a 64-bit integral type
  690. HRESULT sc;
  691. WCHAR wszTemp[g_cchMAX_I64DEC_STRING] = L"";
  692. _ASSERTE(pwszPropNameIn != NULL);
  693. VariantClear( &m_v );
  694. m_v.vt = VT_BSTR;
  695. _i64tow( llValueIn, wszTemp, 10 );
  696. m_v.bstrVal = _bstr_t( wszTemp ).copy();
  697. sc = m_pClassObject->Put(
  698. _bstr_t( pwszPropNameIn ),
  699. 0,
  700. &m_v,
  701. 0
  702. );
  703. if ( FAILED( sc ) )
  704. {
  705. throw CProvException( sc );
  706. }
  707. return sc;
  708. } //*** CWbemClassObject::SetPropertyI64( llValueIn )
  709. //////////////////////////////////////////////////////////////////////////////
  710. //++
  711. //
  712. // HRESULT
  713. // CWbemClassObject::SetProperty(
  714. // LPCWSTR pwszValueIn,
  715. // LPCWSTR pwszPropNameIn
  716. // )
  717. //
  718. // Description:
  719. // Set wstring value of a property.
  720. //
  721. // Arguments:
  722. // pwszValueIn -- Property string value.
  723. // pwszPropNameIn -- Property Name.
  724. //
  725. // Return Values:
  726. // WBEM_S_NO_ERROR
  727. //
  728. //--
  729. //////////////////////////////////////////////////////////////////////////////
  730. HRESULT
  731. CWbemClassObject::SetProperty(
  732. LPCWSTR pwszValueIn,
  733. LPCWSTR pwszPropNameIn
  734. )
  735. {
  736. HRESULT sc;
  737. _ASSERTE(pwszPropNameIn != NULL);
  738. if ( pwszValueIn == NULL )
  739. {
  740. return WBEM_S_NO_ERROR;
  741. }
  742. VariantClear( &m_v );
  743. m_v.vt = VT_BSTR;
  744. m_v.bstrVal = _bstr_t( pwszValueIn ).copy();
  745. sc = m_pClassObject->Put(
  746. _bstr_t( pwszPropNameIn ),
  747. 0,
  748. &m_v,
  749. 0
  750. );
  751. VariantClear( &m_v );
  752. if( FAILED( sc ) )
  753. {
  754. throw CProvException( sc );
  755. }
  756. return sc;
  757. } //*** CWbemClassObject::SetProperty( pwszValueIn )
  758. //////////////////////////////////////////////////////////////////////////////
  759. //++
  760. //
  761. // HRESULT
  762. // CWbemClassObject::SetProperty(
  763. // DWORD dwSizeIn,
  764. // PBYTE pByteIn,
  765. // LPCWSTR pwszPropNameIn
  766. // )
  767. //
  768. // Description:
  769. // Set binary value of a property.
  770. //
  771. // Arguments:
  772. // dwSizeIn -- Size of block pointed by pByteIn.
  773. // pByteIn -- Pointer to byte.
  774. // pwszPropNameIn -- Property Name.
  775. //
  776. // Return Values:
  777. // WBEM_S_NO_ERROR
  778. //
  779. //--
  780. //////////////////////////////////////////////////////////////////////////////
  781. HRESULT
  782. CWbemClassObject::SetProperty(
  783. DWORD dwSizeIn,
  784. PBYTE pByteIn,
  785. LPCWSTR pwszPropNameIn
  786. )
  787. {
  788. HRESULT sc = WBEM_S_NO_ERROR;
  789. SAFEARRAY * psa;
  790. SAFEARRAYBOUND rgsabound[ 1 ];
  791. LONG idx;
  792. LONG ix;
  793. _ASSERTE(pwszPropNameIn != NULL);
  794. rgsabound[ 0 ].lLbound = 0;
  795. rgsabound[ 0 ].cElements = dwSizeIn;
  796. if( pByteIn == NULL )
  797. {
  798. return sc;
  799. }
  800. VariantClear( &m_v );
  801. psa = SafeArrayCreate( VT_UI1, 1, rgsabound );
  802. if(psa == NULL)
  803. {
  804. throw WBEM_E_OUT_OF_MEMORY;
  805. }
  806. for( idx = 0 ; idx < dwSizeIn ; idx++ )
  807. {
  808. ix = idx;
  809. sc = SafeArrayPutElement(
  810. psa,
  811. &ix,
  812. static_cast< void * >( pByteIn+idx )
  813. );
  814. if ( sc != S_OK )
  815. {
  816. throw CProvException( sc );
  817. }
  818. }
  819. m_v.vt = ( VT_ARRAY | VT_UI1 );
  820. //
  821. // no need to clear psa, managed by destructor
  822. //
  823. m_v.parray = psa;
  824. sc = m_pClassObject->Put(
  825. _bstr_t( pwszPropNameIn ),
  826. 0,
  827. &m_v,
  828. 0
  829. );
  830. if ( sc != S_OK )
  831. {
  832. throw CProvException( sc );
  833. }
  834. return sc;
  835. } //*** CWbemClassObject::SetProperty( pByteIn )
  836. //////////////////////////////////////////////////////////////////////////////
  837. //++
  838. //
  839. // HRESULT
  840. // CWbemClassObject::SetProperty(
  841. // DWORD dwSizeIn,
  842. // BSTR * pbstrIn,
  843. // LPCWSTR pwszPropNameIn
  844. // )
  845. //
  846. // Description:
  847. // Set wstring array value of a property.
  848. //
  849. // Arguments:
  850. // dwSizeIn -- Size of block pointed by pByteIn.
  851. // pbstrIn -- Pointer to BSTR array.
  852. // pwszPropNameIn -- Property Name.
  853. //
  854. // Return Values:
  855. // WBEM_S_NO_ERROR
  856. //
  857. //--
  858. //////////////////////////////////////////////////////////////////////////////
  859. HRESULT
  860. CWbemClassObject::SetProperty(
  861. DWORD dwSizeIn,
  862. BSTR * pbstrIn,
  863. LPCWSTR pwszPropNameIn
  864. )
  865. {
  866. HRESULT sc = WBEM_S_NO_ERROR;
  867. SAFEARRAY * psa;
  868. SAFEARRAYBOUND rgsabound[ 1 ];
  869. LONG idx;
  870. LONG ix;
  871. _ASSERTE(pwszPropNameIn != NULL);
  872. rgsabound[0].lLbound = 0;
  873. rgsabound[0].cElements = dwSizeIn;
  874. if ( pbstrIn == NULL )
  875. {
  876. return sc;
  877. }
  878. VariantClear( &m_v );
  879. psa = SafeArrayCreate( VT_BSTR, 1, rgsabound );
  880. if ( psa == NULL )
  881. {
  882. throw WBEM_E_OUT_OF_MEMORY;
  883. }
  884. for( idx = 0 ; idx < dwSizeIn ; idx++)
  885. {
  886. ix = idx;
  887. sc = SafeArrayPutElement(
  888. psa,
  889. &ix,
  890. pbstrIn[ idx ]
  891. );
  892. if ( sc != S_OK)
  893. {
  894. throw CProvException( sc );
  895. }
  896. }
  897. m_v.vt = (VT_ARRAY | VT_BSTR );
  898. //
  899. // no need to clear psa, managed by destructor
  900. //
  901. m_v.parray = psa;
  902. sc = m_pClassObject->Put(
  903. _bstr_t( pwszPropNameIn ),
  904. 0,
  905. &m_v,
  906. 0
  907. );
  908. if ( sc != S_OK)
  909. {
  910. throw CProvException( sc );
  911. }
  912. return sc;
  913. } //*** CWbemClassObject::SetProperty( pbstrIn )
  914. //////////////////////////////////////////////////////////////////////////////
  915. //++
  916. //
  917. // HRESULT
  918. // CWbemClassObject::SetProperty(
  919. //
  920. // Description:
  921. // Set MultiSz value of a property.
  922. //
  923. // Arguments:
  924. // dwSizeIn -- Size of block pointed by pwszMultiSzIn.
  925. // pwszMultiSzIn -- Pointer to MultiSz.
  926. // pwszPropNameIn -- Property Name.
  927. //
  928. // Return Values:
  929. // WBEM_S_NO_ERROR
  930. //
  931. //--
  932. //////////////////////////////////////////////////////////////////////////////
  933. HRESULT
  934. CWbemClassObject::SetProperty(
  935. DWORD dwSizeIn,
  936. LPCWSTR pwszMultiSzIn,
  937. LPCWSTR pwszPropNameIn
  938. )
  939. {
  940. HRESULT sc = WBEM_S_NO_ERROR;
  941. SAFEARRAY * psa;
  942. SAFEARRAYBOUND rgsabound[ 1 ];
  943. LPCWSTR pwsz = NULL;
  944. LONG idx;
  945. LONG ix;
  946. _ASSERTE(pwszPropNameIn != NULL);
  947. if( pwszMultiSzIn == NULL )
  948. {
  949. return sc;
  950. }
  951. VariantClear( &m_v );
  952. //
  953. // find out the number of string
  954. //
  955. DWORD cMultiSz = 1;
  956. for ( pwsz = pwszMultiSzIn; *pwsz || *pwsz ++ ; pwsz ++ )
  957. {
  958. if ( ! ( *pwsz ) )
  959. {
  960. cMultiSz ++ ;
  961. }
  962. }
  963. rgsabound[ 0 ].lLbound = 0;
  964. rgsabound[ 0 ].cElements = cMultiSz;
  965. psa = SafeArrayCreate( VT_BSTR, 1, rgsabound);
  966. if ( psa == NULL )
  967. {
  968. throw WBEM_E_OUT_OF_MEMORY;
  969. }
  970. pwsz = pwszMultiSzIn;
  971. for( idx = 0 ; idx < cMultiSz ; idx++ )
  972. {
  973. ix = idx;
  974. sc = SafeArrayPutElement(
  975. psa,
  976. &ix,
  977. (BSTR) _bstr_t( pwsz )
  978. );
  979. if ( sc != S_OK )
  980. {
  981. throw CProvException( sc );
  982. }
  983. pwsz = wcschr( pwsz, L'\0' );
  984. pwsz ++;
  985. }
  986. m_v.vt = (VT_ARRAY | VT_BSTR );
  987. //
  988. // no need to clear psa, managed by destructor
  989. //
  990. m_v.parray = psa;
  991. sc = m_pClassObject->Put(
  992. _bstr_t( pwszPropNameIn ),
  993. 0,
  994. &m_v,
  995. 0
  996. );
  997. if ( sc != S_OK )
  998. {
  999. throw CProvException( sc );
  1000. }
  1001. return sc;
  1002. } //*** CWbemClassObject::SetProperty( pwszMultiSzIn )
  1003. //////////////////////////////////////////////////////////////////////////////
  1004. //++
  1005. //
  1006. // HRESULT
  1007. // CWbemClassObject::SetProperty(
  1008. // LPCSTR pszValueIn,
  1009. // LPCWSTR pwszPropNameIn
  1010. // )
  1011. //
  1012. // Description:
  1013. // Set ansi string value of a property.
  1014. //
  1015. // Arguments:
  1016. // pszValueIn -- Property string value.
  1017. // pwszPropNameIn -- Property Name.
  1018. //
  1019. // Return Values:
  1020. // WBEM_S_NO_ERROR
  1021. //
  1022. //--
  1023. //////////////////////////////////////////////////////////////////////////////
  1024. HRESULT
  1025. CWbemClassObject::SetProperty(
  1026. LPCSTR pszValueIn,
  1027. LPCWSTR pwszPropNameIn
  1028. )
  1029. {
  1030. _ASSERTE(pwszPropNameIn != NULL);
  1031. if ( pszValueIn == NULL )
  1032. {
  1033. return S_OK;
  1034. }
  1035. return SetProperty(
  1036. static_cast< WCHAR * >( _bstr_t( pszValueIn ) ),
  1037. pwszPropNameIn
  1038. );
  1039. } //*** CWbemClassObject::SetProperty( pszValueIn )
  1040. //////////////////////////////////////////////////////////////////////////////
  1041. //++
  1042. //
  1043. // HRESULT
  1044. // CWbemClassObject::SetProperty(
  1045. // IWbemClassObject * pWbemClassObject,
  1046. // LPCWSTR pwszPropNameIn
  1047. // )
  1048. //
  1049. // Description:
  1050. // Set wbem class object of a property.
  1051. //
  1052. // Arguments:
  1053. // pWbemClassObject -- Property wbem class object
  1054. // pwszPropNameIn -- Property Name.
  1055. //
  1056. // Return Values:
  1057. // WBEM_S_NO_ERROR
  1058. //
  1059. //--
  1060. //////////////////////////////////////////////////////////////////////////////
  1061. HRESULT
  1062. CWbemClassObject::SetProperty(
  1063. IWbemClassObject * pWbemClassObjectIn,
  1064. LPCWSTR pwszPropNameIn
  1065. )
  1066. {
  1067. HRESULT sc = S_OK;
  1068. _ASSERTE(pwszPropNameIn != NULL);
  1069. if ( pWbemClassObjectIn == NULL )
  1070. {
  1071. return sc;
  1072. }
  1073. VariantClear( & m_v );
  1074. m_v.vt = VT_UNKNOWN ;
  1075. m_v.punkVal = pWbemClassObjectIn;
  1076. pWbemClassObjectIn->AddRef();
  1077. sc = m_pClassObject->Put(
  1078. _bstr_t( pwszPropNameIn ),
  1079. 0,
  1080. &m_v,
  1081. 0
  1082. );
  1083. VariantClear( &m_v );
  1084. if( FAILED( sc ) )
  1085. {
  1086. throw CProvException( sc );
  1087. }
  1088. return sc;
  1089. } //*** CWbemClassObject::SetProperty( pszValueIn )
  1090. //////////////////////////////////////////////////////////////////////////////
  1091. //++
  1092. //
  1093. // HRESULT
  1094. // CWbemClassObject::SpawnInstance(
  1095. // LONG lFlagIn,
  1096. // IWbemClassObject ** ppNewOut
  1097. // )
  1098. //
  1099. // Description:
  1100. // Spawn a instance of IWbemClassObject.
  1101. //
  1102. // Arguments:
  1103. // lFlagIn -- WMI flag, reserved, must be 0.
  1104. // ppNewOut -- Created new instance.
  1105. //
  1106. // Return Values:
  1107. // WBEM_S_NO_ERROR
  1108. //
  1109. //--
  1110. //////////////////////////////////////////////////////////////////////////////
  1111. HRESULT
  1112. CWbemClassObject::SpawnInstance(
  1113. LONG lFlagIn,
  1114. IWbemClassObject ** ppNewOut
  1115. )
  1116. {
  1117. _ASSERTE(ppNewOut != NULL);
  1118. return m_pClassObject->SpawnInstance( lFlagIn, ppNewOut );
  1119. } //*** CWbemClassObject::SpawnInstance()
  1120. //////////////////////////////////////////////////////////////////////////////
  1121. //++
  1122. //
  1123. // HRESULT
  1124. // CWbemClassObject::SpawnDerivedClass(
  1125. // LONG lFlagIn,
  1126. // IWbemClassObject ** ppNewOut
  1127. // )
  1128. //
  1129. // Description:
  1130. // Spawn a derived class.
  1131. //
  1132. // Arguments:
  1133. // lFlagIn -- WMI flag, reserved, must be 0.
  1134. // ppNewOut -- Created new instance.
  1135. //
  1136. // Return Values:
  1137. // WBEM_S_NO_ERROR
  1138. //
  1139. //--
  1140. //////////////////////////////////////////////////////////////////////////////
  1141. HRESULT
  1142. CWbemClassObject::SpawnDerivedClass(
  1143. LONG lFlagIn,
  1144. IWbemClassObject ** ppNewOut
  1145. )
  1146. {
  1147. _ASSERTE(ppNewOut != NULL);
  1148. return m_pClassObject->SpawnDerivedClass( lFlagIn, ppNewOut );
  1149. } //*** CWbemClassObject::SpawnInstance()
  1150. //////////////////////////////////////////////////////////////////////////////
  1151. //++
  1152. //
  1153. // HRESULT
  1154. // CWbemClassObject::GetMethod(
  1155. // BSTR bstrMethodNameIn,
  1156. // LONG lFlagIn,
  1157. // IWbemClassObject ** ppINOut,
  1158. // IWbemClassObject ** ppOUTOut
  1159. // )
  1160. //
  1161. // Description:
  1162. // Retrieve the method for an WMI object.
  1163. //
  1164. // Arguments:
  1165. // bstrMethodNameIn
  1166. // Method Name.
  1167. //
  1168. // lFlagIn
  1169. // WMI flag, Reserved. It must be zero.
  1170. //
  1171. // ppINOut
  1172. // IWbemClassObject pointer which describes the in-parameters
  1173. // to the method.
  1174. //
  1175. // ppOUTOut
  1176. // an IWbemClassObject pointer which describes the
  1177. // out-parameters to the method
  1178. //
  1179. // Return Values:
  1180. // WBEM stand error
  1181. //
  1182. //--
  1183. //////////////////////////////////////////////////////////////////////////////
  1184. HRESULT
  1185. CWbemClassObject::GetMethod(
  1186. BSTR bstrMethodNameIn,
  1187. LONG lFlagIn,
  1188. IWbemClassObject ** ppINOut,
  1189. IWbemClassObject ** ppOUTOut
  1190. )
  1191. {
  1192. _ASSERTE(bstrMethodNameIn != NULL);
  1193. _ASSERTE(ppINOut != NULL);
  1194. _ASSERTE(ppOUTOut != NULL);
  1195. return m_pClassObject->GetMethod(
  1196. bstrMethodNameIn,
  1197. lFlagIn,
  1198. ppINOut,
  1199. ppOUTOut
  1200. );
  1201. } //*** CWbemClassObject::GetMethod()
  1202. //////////////////////////////////////////////////////////////////////////////
  1203. //++
  1204. //
  1205. // HRESULT
  1206. // CWbemClassObject::GetProperty(
  1207. // DWORD * pdwValueOut,
  1208. // LPCWSTR pwszPropNameIn
  1209. // )
  1210. //
  1211. // Description:
  1212. // Retrieve the DWORD property for this WMI object.
  1213. //
  1214. // Arguments:
  1215. // pdwValueOut -- DWORD variable to receive property value.
  1216. // pwszPropNameIn -- Property Name.
  1217. //
  1218. // Return Values:
  1219. // WBEM_S_NO_ERROR
  1220. // WBEM_E_FAILED
  1221. //
  1222. //--
  1223. //////////////////////////////////////////////////////////////////////////////
  1224. HRESULT
  1225. CWbemClassObject::GetProperty(
  1226. DWORD * pdwValueOut,
  1227. LPCWSTR pwszPropNameIn
  1228. )
  1229. {
  1230. HRESULT sc;
  1231. _ASSERTE(pwszPropNameIn != NULL);
  1232. _ASSERTE(pdwValueOut != NULL);
  1233. VariantClear( &m_v );
  1234. sc = m_pClassObject->Get(
  1235. _bstr_t( pwszPropNameIn ),
  1236. 0,
  1237. &m_v,
  1238. NULL,
  1239. NULL
  1240. );
  1241. if ( SUCCEEDED( sc ) )
  1242. {
  1243. if( m_v.vt == VT_I4 )
  1244. {
  1245. *pdwValueOut = m_v.lVal;
  1246. return sc;
  1247. }
  1248. else if ( m_v.vt == VT_BOOL)
  1249. {
  1250. if ( m_v.boolVal == VARIANT_TRUE )
  1251. {
  1252. *pdwValueOut = 1;
  1253. }
  1254. else
  1255. {
  1256. *pdwValueOut = 0;
  1257. }
  1258. return sc;
  1259. }
  1260. else if ( m_v.vt == VT_UI1 )
  1261. {
  1262. *pdwValueOut = ( DWORD ) m_v.bVal;
  1263. return sc;
  1264. }
  1265. else if ( m_v.vt == VT_NULL )
  1266. {
  1267. return WBEM_E_FAILED;
  1268. }
  1269. }
  1270. // raise exception if sc is not S_OK or vt is not expected
  1271. CProvException e( sc );
  1272. throw e;
  1273. return WBEM_E_FAILED;
  1274. } //*** CWbemClassObject::GetProperty( pdwValueOut )
  1275. //////////////////////////////////////////////////////////////////////////////
  1276. //++
  1277. //
  1278. // HRESULT
  1279. // CWbemClassObject::GetProperty(
  1280. // DWORD * pdwValueOut,
  1281. // LPCWSTR pwszPropNameIn
  1282. // )
  1283. //
  1284. // Description:
  1285. // Retrieve the DWORD property for this WMI object.
  1286. //
  1287. // Arguments:
  1288. // pdwValueOut -- DWORD variable to receive property value.
  1289. // pwszPropNameIn -- Property Name.
  1290. //
  1291. // Return Values:
  1292. // WBEM_S_NO_ERROR
  1293. // WBEM_E_FAILED
  1294. //
  1295. //--
  1296. //////////////////////////////////////////////////////////////////////////////
  1297. HRESULT
  1298. CWbemClassObject::GetPropertyR64(
  1299. double * pdblValueOut,
  1300. LPCWSTR pwszPropNameIn
  1301. )
  1302. {
  1303. HRESULT sc;
  1304. _ASSERTE(pwszPropNameIn != NULL);
  1305. _ASSERTE(pdblValueOut != NULL);
  1306. VariantClear( &m_v );
  1307. sc = m_pClassObject->Get(
  1308. _bstr_t( pwszPropNameIn ),
  1309. 0,
  1310. &m_v,
  1311. NULL,
  1312. NULL
  1313. );
  1314. if ( SUCCEEDED( sc ) )
  1315. {
  1316. if( m_v.vt == VT_R8 )
  1317. {
  1318. *pdblValueOut = m_v.dblVal;
  1319. return sc;
  1320. }
  1321. else if ( m_v.vt == VT_NULL )
  1322. {
  1323. return WBEM_E_FAILED;
  1324. }
  1325. }
  1326. // raise exception if sc is not S_OK or vt is not expected
  1327. CProvException e( sc );
  1328. throw e;
  1329. return WBEM_E_FAILED;
  1330. } //*** CWbemClassObject::GetPropertyR64( pdblValueOut )
  1331. //////////////////////////////////////////////////////////////////////////////
  1332. //++
  1333. //
  1334. // HRESULT
  1335. // CWbemClassObject::GetPropertyI64(
  1336. // LONGLONG * pllValueOut,
  1337. // LPCWSTR pwszPropNameIn
  1338. // )
  1339. //
  1340. // Description:
  1341. // Retrieve the LONGLONG property for this WMI object.
  1342. //
  1343. // Arguments:
  1344. // pllValueOut -- LONGLONG variable to receive property value.
  1345. // pwszPropNameIn -- Property Name.
  1346. //
  1347. // Return Values:
  1348. // WBEM_S_NO_ERROR
  1349. // WBEM_E_FAILED
  1350. //
  1351. //--
  1352. //////////////////////////////////////////////////////////////////////////////
  1353. HRESULT
  1354. CWbemClassObject::GetPropertyI64(
  1355. LONGLONG * pllValueOut,
  1356. LPCWSTR pwszPropNameIn
  1357. )
  1358. {
  1359. HRESULT sc;
  1360. _ASSERTE(pwszPropNameIn != NULL);
  1361. _ASSERTE(pllValueOut != NULL);
  1362. VariantClear( &m_v );
  1363. sc = m_pClassObject->Get(
  1364. _bstr_t( pwszPropNameIn ),
  1365. 0,
  1366. &m_v,
  1367. NULL,
  1368. NULL
  1369. );
  1370. if ( SUCCEEDED( sc ) )
  1371. {
  1372. if( m_v.vt == VT_BSTR )
  1373. {
  1374. // convert from uint64 (VT_BSTR) to LONGLONG
  1375. *pllValueOut = _wtoi64( (WCHAR *) m_v.bstrVal );
  1376. return sc;
  1377. }
  1378. else if ( m_v.vt == VT_NULL )
  1379. {
  1380. return WBEM_E_FAILED;
  1381. }
  1382. }
  1383. // raise exception if sc is not S_OK or vt is not expected
  1384. CProvException e( sc );
  1385. throw e;
  1386. return WBEM_E_FAILED;
  1387. } //*** CWbemClassObject::GetPropertyI64( pllValueOut )
  1388. //////////////////////////////////////////////////////////////////////////////
  1389. //++
  1390. //
  1391. // HRESULT
  1392. // CWbemClassObject::GetProperty(
  1393. // _bstr_t & rBstrOut,
  1394. // LPCWSTR pwszPropNameIn
  1395. // )
  1396. //
  1397. // Description:
  1398. // Retrieve the BSTR property for this WMI object.
  1399. //
  1400. // Arguments:
  1401. // rBstrOut -- bstr_t variable to receive property value.
  1402. // pwszPropNameIn -- Property Name.
  1403. //
  1404. // Return Values:
  1405. // WBEM_S_NO_ERROR
  1406. // WBEM_E_FAILED
  1407. //
  1408. //--
  1409. //////////////////////////////////////////////////////////////////////////////
  1410. HRESULT
  1411. CWbemClassObject::GetProperty(
  1412. _bstr_t & rBstrOut,
  1413. LPCWSTR pwszPropNameIn
  1414. )
  1415. {
  1416. HRESULT sc;
  1417. _ASSERTE(pwszPropNameIn != NULL);
  1418. VariantClear( &m_v );
  1419. sc = m_pClassObject->Get(
  1420. _bstr_t( pwszPropNameIn ),
  1421. 0,
  1422. &m_v,
  1423. NULL,
  1424. NULL
  1425. );
  1426. if ( SUCCEEDED( sc ) )
  1427. {
  1428. if( m_v.vt == VT_BSTR )
  1429. {
  1430. rBstrOut = m_v.bstrVal;
  1431. return sc;
  1432. }
  1433. else if( m_v.vt == VT_NULL )
  1434. {
  1435. return WBEM_E_FAILED;
  1436. }
  1437. }
  1438. CProvException e( sc );
  1439. throw e;
  1440. return WBEM_E_FAILED;
  1441. } //*** CWbemClassObject::GetProperty( rBstrOut )
  1442. //////////////////////////////////////////////////////////////////////////////
  1443. //++
  1444. //
  1445. // HRESULT
  1446. // CWbemClassObject::GetProperty(
  1447. // BOOL * pfValueOut,
  1448. // LPCWSTR pwszPropNameIn
  1449. // )
  1450. //
  1451. // Description:
  1452. // Retrieve the BOOL property for this WMI object.
  1453. //
  1454. // Arguments:
  1455. // pfValueOut -- BOOL variable to receive property value.
  1456. // pwszPropNameIn -- Property Name.
  1457. //
  1458. // Return Values:
  1459. // WBEM_S_NO_ERROR
  1460. // WBEM_E_FAILED
  1461. //
  1462. //--
  1463. //////////////////////////////////////////////////////////////////////////////
  1464. HRESULT
  1465. CWbemClassObject::GetProperty(
  1466. BOOL * pfValueOut,
  1467. LPCWSTR pwszPropNameIn
  1468. )
  1469. {
  1470. HRESULT sc;
  1471. _ASSERTE(pwszPropNameIn != NULL);
  1472. _ASSERTE(pfValueOut != NULL);
  1473. VariantClear( &m_v );
  1474. sc = m_pClassObject->Get(
  1475. _bstr_t( pwszPropNameIn ),
  1476. 0,
  1477. &m_v,
  1478. NULL,
  1479. NULL
  1480. );
  1481. if ( m_v.vt == VT_BOOL )
  1482. {
  1483. *pfValueOut = m_v.boolVal;
  1484. return sc;
  1485. }
  1486. return WBEM_E_FAILED;
  1487. } //*** CWbemClassObject::GetProperty
  1488. //////////////////////////////////////////////////////////////////////////////
  1489. //++
  1490. //
  1491. // HRESULT
  1492. // CWbemClassObject::GetProperty(
  1493. // DWORD * pdwSizeOut,
  1494. // PBYTE * ppByteOut,
  1495. // LPCWSTR pwszPropNameIn
  1496. // )
  1497. //
  1498. // Description:
  1499. // Retrieve the binary property for this WMI object.
  1500. //
  1501. // Arguments:
  1502. // pdwSizeOut -- Size of the output buffer.
  1503. // ppByteOut -- Output buffer.
  1504. // pwszPropNameIn -- Property Name.
  1505. //
  1506. // Return Values:
  1507. // WBEM_S_NO_ERROR
  1508. //
  1509. //--
  1510. //////////////////////////////////////////////////////////////////////////////
  1511. HRESULT
  1512. CWbemClassObject::GetProperty(
  1513. DWORD * pdwSizeOut,
  1514. PBYTE * ppByteOut,
  1515. LPCWSTR pwszPropNameIn
  1516. )
  1517. {
  1518. HRESULT sc;
  1519. VariantClear(&m_v);
  1520. _ASSERTE(pwszPropNameIn != NULL);
  1521. _ASSERTE(pdwSizeOut != NULL);
  1522. _ASSERTE(ppByteOut != NULL);
  1523. *pdwSizeOut = 0;
  1524. sc = m_pClassObject->Get(
  1525. _bstr_t( pwszPropNameIn ),
  1526. 0,
  1527. & m_v,
  1528. NULL,
  1529. NULL
  1530. );
  1531. if ( SUCCEEDED ( sc ) )
  1532. {
  1533. if ( m_v.vt == ( VT_ARRAY | VT_UI1 ) )
  1534. {
  1535. PBYTE pByte;
  1536. * pdwSizeOut = m_v.parray->rgsabound[ 0 ].cElements;
  1537. * ppByteOut = new BYTE[ *pdwSizeOut ];
  1538. if ( * ppByteOut == NULL )
  1539. throw CProvException( E_OUTOFMEMORY );
  1540. sc = SafeArrayAccessData( m_v.parray, ( void ** ) &pByte );
  1541. if ( SUCCEEDED ( sc ) )
  1542. {
  1543. UINT idx;
  1544. for ( idx = 0; idx < *pdwSizeOut; idx ++ )
  1545. {
  1546. *( (* ppByteOut ) + idx ) = *( pByte + idx );
  1547. }
  1548. SafeArrayUnaccessData( m_v.parray );
  1549. }
  1550. }
  1551. else
  1552. {
  1553. throw CProvException(static_cast< HRESULT > (WBEM_E_INVALID_PARAMETER));
  1554. }
  1555. }
  1556. else
  1557. {
  1558. throw CProvException( sc );
  1559. }
  1560. return WBEM_S_NO_ERROR;
  1561. } //*** CWbemClassObject::GetProperty( ppByteOut )
  1562. //////////////////////////////////////////////////////////////////////////////
  1563. //++
  1564. //
  1565. // HRESULT
  1566. // CWbemClassObject::GetProperty(
  1567. // DWORD * pdwSizeOut,
  1568. // _bstr_t ** ppbstrOut,
  1569. // LPCWSTR pwszPropNameIn
  1570. // )
  1571. //
  1572. // Description:
  1573. // Retrieve the BSTR array property for this WMI object.
  1574. //
  1575. // Arguments:
  1576. // pdwSizeOut -- Size of the output buffer.
  1577. // ppbstrOut -- BSTR variable to receive property value.
  1578. // pwszPropNameIn -- Property Name.
  1579. //
  1580. // Return Values:
  1581. // WBEM_S_NO_ERROR
  1582. //
  1583. //--
  1584. //////////////////////////////////////////////////////////////////////////////
  1585. HRESULT
  1586. CWbemClassObject::GetProperty(
  1587. DWORD * pdwSizeOut,
  1588. _bstr_t ** ppbstrOut,
  1589. LPCWSTR pwszPropNameIn
  1590. )
  1591. {
  1592. HRESULT sc;
  1593. VariantClear( &m_v );
  1594. _ASSERTE(pwszPropNameIn != NULL);
  1595. _ASSERTE(pdwSizeOut != NULL);
  1596. _ASSERTE(ppbstrOut != NULL);
  1597. *pdwSizeOut = 0;
  1598. sc = m_pClassObject->Get(
  1599. _bstr_t( pwszPropNameIn ),
  1600. 0,
  1601. & m_v,
  1602. NULL,
  1603. NULL
  1604. );
  1605. if ( SUCCEEDED ( sc ) )
  1606. {
  1607. if ( m_v.vt == ( VT_ARRAY | VT_BSTR ) )
  1608. {
  1609. BSTR * pBstr;
  1610. *pdwSizeOut = m_v.parray->rgsabound[0].cElements;
  1611. *ppbstrOut = new _bstr_t[ *pdwSizeOut ];
  1612. if ( * ppbstrOut == NULL )
  1613. throw CProvException( E_OUTOFMEMORY );
  1614. sc = SafeArrayAccessData( m_v.parray, (void **) & pBstr );
  1615. if ( SUCCEEDED ( sc ) )
  1616. {
  1617. UINT idx;
  1618. for( idx = 0; idx < *pdwSizeOut; idx ++)
  1619. {
  1620. *( (*ppbstrOut) + idx ) = *( pBstr + idx );
  1621. }
  1622. SafeArrayUnaccessData( m_v.parray );
  1623. }
  1624. }
  1625. else
  1626. {
  1627. throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) );
  1628. }
  1629. }
  1630. else
  1631. {
  1632. throw CProvException( sc );
  1633. }
  1634. return WBEM_S_NO_ERROR;
  1635. } //*** CWbemClassObject::GetProperty( ppbstrOut )
  1636. //////////////////////////////////////////////////////////////////////////////
  1637. //++
  1638. //
  1639. // HRESULT
  1640. // CWbemClassObject::GetProperty(
  1641. // DWORD * pdwSizeOut,
  1642. // LPWSTR * ppwszMultiSzOut,
  1643. // LPCWSTR pwszPropNameIn
  1644. // )
  1645. //
  1646. // Description:
  1647. // Retrieve the MultiSz property for this WMI object.
  1648. //
  1649. // Arguments:
  1650. // pdwSizeOut -- Size of the output buffer.
  1651. // ppwszMultiSzOut -- MultiSz output buffer.
  1652. // pwszPropNameIn -- Property Name.
  1653. //
  1654. // Return Values:
  1655. // WBEM_S_NO_ERROR
  1656. //
  1657. //--
  1658. //////////////////////////////////////////////////////////////////////////////
  1659. HRESULT
  1660. CWbemClassObject::GetPropertyMultiSz(
  1661. DWORD * pdwSizeOut,
  1662. LPWSTR * ppwszMultiSzOut,
  1663. LPCWSTR pwszPropNameIn
  1664. )
  1665. {
  1666. HRESULT sc;
  1667. DWORD cElements;
  1668. DWORD cMultiSz = 0;
  1669. _ASSERTE(pwszPropNameIn != NULL);
  1670. _ASSERTE(pdwSizeOut != NULL);
  1671. _ASSERTE(ppwszMultiSzOut != NULL);
  1672. VariantClear(&m_v);
  1673. *pdwSizeOut = 0;
  1674. // *ppOut = NULL;
  1675. sc = m_pClassObject->Get(
  1676. _bstr_t( pwszPropNameIn ),
  1677. 0,
  1678. & m_v,
  1679. NULL,
  1680. NULL
  1681. );
  1682. if ( SUCCEEDED ( sc ) )
  1683. {
  1684. if ( m_v.vt == ( VT_ARRAY | VT_BSTR ) )
  1685. {
  1686. LPWSTR * ppwsz = NULL;
  1687. cElements = m_v.parray->rgsabound[ 0 ].cElements;
  1688. sc = SafeArrayAccessData( m_v.parray, ( void ** ) & ppwsz );
  1689. if ( SUCCEEDED ( sc ) )
  1690. {
  1691. UINT idx;
  1692. for( idx = 0; idx < cElements; idx ++)
  1693. {
  1694. cMultiSz = cMultiSz + wcslen( *(ppwsz + idx) ) + sizeof (WCHAR);
  1695. }
  1696. cMultiSz += sizeof( WCHAR ) * 2;
  1697. *ppwszMultiSzOut = new WCHAR[ cMultiSz ];
  1698. if (*ppwszMultiSzOut == NULL) // prefix change
  1699. { // prefix change
  1700. SafeArrayUnaccessData( m_v.parray ); // prefix change
  1701. throw CProvException( E_OUTOFMEMORY ); // prefix change
  1702. } // prefix change
  1703. LPWSTR pwszDst = *ppwszMultiSzOut;
  1704. LPWSTR pwszSrc;
  1705. for ( idx = 0; idx < cElements ; idx ++)
  1706. {
  1707. for( pwszSrc = *( ppwsz + idx); *pwszSrc ; pwszDst++, pwszSrc ++ )
  1708. {
  1709. *pwszDst = *pwszSrc;
  1710. }
  1711. *(pwszDst++) = L'\0';
  1712. }
  1713. *pwszDst = L'\0';
  1714. *pdwSizeOut = cMultiSz;
  1715. SafeArrayUnaccessData( m_v.parray );
  1716. }
  1717. }
  1718. else
  1719. {
  1720. throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) );
  1721. }
  1722. }
  1723. else
  1724. {
  1725. throw CProvException( sc );
  1726. }
  1727. return WBEM_S_NO_ERROR;
  1728. } //*** CWbemClassObject::GetProperty( ppwszMultiSzOut )
  1729. //////////////////////////////////////////////////////////////////////////////
  1730. //++
  1731. //
  1732. // HRESULT
  1733. // CWbemClassObject::GetProperty(
  1734. // VARIANT * pVariantOut,
  1735. // LPCWSTR pwszPropNameIn
  1736. // )
  1737. //
  1738. // Description:
  1739. // Retrieve the variant property for this WMI object.
  1740. //
  1741. // Arguments:
  1742. // pVariantOut -- Variant variable to receive property value
  1743. // pwszPropNameIn -- Property Name.
  1744. //
  1745. // Return Values:
  1746. // WBEM_S_NO_ERROR
  1747. //
  1748. //--
  1749. //////////////////////////////////////////////////////////////////////////////
  1750. HRESULT
  1751. CWbemClassObject::GetProperty(
  1752. VARIANT * pVariantOut,
  1753. LPCWSTR pwszPropNameIn
  1754. )
  1755. {
  1756. HRESULT sc;
  1757. _ASSERTE(pwszPropNameIn != NULL);
  1758. _ASSERTE(pVariantOut != NULL);
  1759. sc = m_pClassObject->Get(
  1760. _bstr_t( pwszPropNameIn ),
  1761. 0,
  1762. pVariantOut,
  1763. NULL,
  1764. NULL
  1765. );
  1766. if ( FAILED( sc ) )
  1767. {
  1768. CProvException e( sc );
  1769. throw e;
  1770. }
  1771. return WBEM_S_NO_ERROR;
  1772. } //*** CWbemClassObject::GetProperty( pVariantOut )
  1773. //////////////////////////////////////////////////////////////////////////////
  1774. //++
  1775. //
  1776. // HRESULT
  1777. // CWbemClassObject::GetProperty(
  1778. // CWbemClassObject & rWcoInout,
  1779. // LPCWSTR pwszPropNameIn
  1780. // )
  1781. //
  1782. // Description:
  1783. // Retrieve the embeded object property for this WMI object.
  1784. //
  1785. // Arguments:
  1786. // rWcoInout -- class object variable to receive property value
  1787. // pwszPropNameIn -- Property Name.
  1788. //
  1789. // Return Values:
  1790. // WBEM_S_NO_ERROR
  1791. //
  1792. //--
  1793. //////////////////////////////////////////////////////////////////////////////
  1794. HRESULT
  1795. CWbemClassObject::GetProperty(
  1796. CWbemClassObject & rWcoInout,
  1797. LPCWSTR pwszPropNameIn
  1798. )
  1799. {
  1800. HRESULT hr = E_FAIL;
  1801. _ASSERTE(pwszPropNameIn != NULL);
  1802. VariantClear( &m_v );
  1803. hr = m_pClassObject->Get(
  1804. _bstr_t( pwszPropNameIn ),
  1805. 0,
  1806. &m_v,
  1807. NULL,
  1808. NULL
  1809. );
  1810. if (FAILED(hr))
  1811. {
  1812. throw CProvException (hr);
  1813. }
  1814. if ( m_v.vt != VT_UNKNOWN )
  1815. {
  1816. hr = WBEM_E_INVALID_PARAMETER;
  1817. throw CProvException(hr);
  1818. }
  1819. IWbemClassObject * pwco = NULL;
  1820. hr = m_v.punkVal->QueryInterface( & pwco );
  1821. rWcoInout = pwco;
  1822. VariantClear( & m_v );
  1823. return WBEM_S_NO_ERROR;
  1824. } //*** CWbemClassObject::GetProperty( rWcoInout )
  1825. //////////////////////////////////////////////////////////////////////////////
  1826. //++
  1827. //
  1828. // BOOL
  1829. // CWbemClassObject::IsPropertyNull(
  1830. // LPCWSTR pwszPropNameIn
  1831. // )
  1832. //
  1833. // Description:
  1834. // return TRUE if the property is NULL
  1835. //
  1836. // Arguments:
  1837. // pwszPropNameIn -- Property Name.
  1838. //
  1839. // Return Values:
  1840. // TRUE
  1841. // FALSE
  1842. //
  1843. //--
  1844. //////////////////////////////////////////////////////////////////////////////
  1845. BOOL
  1846. CWbemClassObject::IsPropertyNull(
  1847. LPCWSTR pwszPropNameIn
  1848. )
  1849. {
  1850. HRESULT sc;
  1851. _ASSERTE(pwszPropNameIn != NULL);
  1852. VariantClear( &m_v );
  1853. sc = m_pClassObject->Get(
  1854. _bstr_t( pwszPropNameIn ),
  1855. 0,
  1856. &m_v,
  1857. NULL,
  1858. NULL
  1859. );
  1860. if (FAILED(sc))
  1861. {
  1862. CProvException e( sc );
  1863. throw e;
  1864. }
  1865. if ( m_v.vt == VT_NULL )
  1866. return TRUE;
  1867. return FALSE;
  1868. } //*** CWbemClassObject::IsPropertyNull