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.

1444 lines
36 KiB

  1. /////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // NtRkComm.cpp
  7. //
  8. // Description:
  9. // Implementation of CWbemServices, CImpersonatedProvider, CInstanceMgr
  10. // class.
  11. //
  12. // Author:
  13. // Henry Wang (HenryWa) 24-AUG-1999
  14. //
  15. //////////////////////////////////////////////////////////////////////
  16. #include "Pch.h"
  17. #include "NtRkComm.h"
  18. #include "ObjectPath.h"
  19. //****************************************************************************
  20. //
  21. // CWbemServices
  22. //
  23. //****************************************************************************
  24. /////////////////////////////////////////////////////////////////////////////
  25. //++
  26. //
  27. // CWbemServices::CWbemServices(
  28. // IWbemServices * pNamespace
  29. // )
  30. //
  31. // Description:
  32. // Constructor.
  33. //
  34. // Arguments:
  35. // pNamespace --
  36. //
  37. // Return Value:
  38. // None.
  39. //
  40. //--
  41. /////////////////////////////////////////////////////////////////////////////
  42. CWbemServices::CWbemServices(
  43. IWbemServices * pNamespace
  44. )
  45. : m_pWbemServices( NULL )
  46. {
  47. m_pWbemServices = pNamespace;
  48. if ( m_pWbemServices != NULL )
  49. {
  50. m_pWbemServices->AddRef( );
  51. }
  52. } //*** CWbemServices::CWbemServices()
  53. /////////////////////////////////////////////////////////////////////////////
  54. //++
  55. //
  56. // CWbemServices::~CWbemServices( void )
  57. //
  58. // Description:
  59. // Destructor.
  60. //
  61. // Arguments:
  62. // None.
  63. //
  64. // Return Value:
  65. // None.
  66. //
  67. //--
  68. /////////////////////////////////////////////////////////////////////////////
  69. CWbemServices::~CWbemServices( void )
  70. {
  71. if ( m_pWbemServices != NULL )
  72. {
  73. m_pWbemServices->Release();
  74. }
  75. } //*** CWbemServices::~CWbemServices()
  76. /////////////////////////////////////////////////////////////////////////////
  77. //++
  78. //
  79. // HRESULT
  80. // CWbemServices::CreateClassEnum(
  81. // BSTR bstrSuperclassIn,
  82. // long lFlagsIn,
  83. // IWbemContext * pCtxIn,
  84. // IEnumWbemClassObject ** ppEnumOut
  85. // )
  86. //
  87. // Description:
  88. // Returns an enumerator for all classes satisfying the
  89. // selection criteria
  90. //
  91. // Arguments:
  92. // bstrSuperclassIn
  93. // Specifies a superclass name
  94. //
  95. // lFlagsIn
  96. // accepts WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_
  97. // RETURN_IMMEDIATELY, WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_
  98. // BIDIRECTIONAL
  99. //
  100. // pCtxIn
  101. // Typically NULL
  102. //
  103. // ppEnumOut
  104. // Receives the pointer to the enumerator
  105. //
  106. // Return Value:
  107. // WBEM stand error
  108. //
  109. //--
  110. /////////////////////////////////////////////////////////////////////////////
  111. HRESULT
  112. CWbemServices::CreateClassEnum(
  113. BSTR bstrSuperclassIn,
  114. long lFlagsIn,
  115. IWbemContext * pCtxIn,
  116. IEnumWbemClassObject ** ppEnumOut
  117. )
  118. {
  119. HRESULT hr;
  120. hr = m_pWbemServices->CreateClassEnum(
  121. bstrSuperclassIn,
  122. lFlagsIn,
  123. pCtxIn,
  124. ppEnumOut
  125. );
  126. if ( SUCCEEDED( hr ) )
  127. {
  128. hr = CoImpersonateClient();
  129. } // if:
  130. return hr;
  131. } //*** CWbemServices::CreateClassEnum()
  132. /////////////////////////////////////////////////////////////////////////////
  133. //++
  134. //
  135. // HRESULT
  136. // CWbemServices::CreateInstanceEnum(
  137. // BSTR bstrClassIn,
  138. // long lFlagsIn,
  139. // IWbemContext * pCtxIn,
  140. // IEnumWbemClassObject ** ppEnumOut
  141. // )
  142. //
  143. // Description:
  144. // creates an enumerator that returns the instances of a
  145. // specified class according to user-specified selection
  146. // criteria
  147. //
  148. // Arguments:
  149. // bstrClassIn
  150. // Specifies a superclass name
  151. //
  152. // lFlagsIn
  153. // accepts WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_
  154. // RETURN_IMMEDIATELY, WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_
  155. // BIDIRECTIONAL
  156. //
  157. // pCtxIn
  158. // Typically NULL
  159. //
  160. // ppEnumOut
  161. // Receives the pointer to the enumerator
  162. //
  163. // Return Value:
  164. // WBEM standard error
  165. //
  166. //--
  167. /////////////////////////////////////////////////////////////////////////////
  168. HRESULT
  169. CWbemServices::CreateInstanceEnum(
  170. BSTR bstrClassIn,
  171. long lFlagsIn,
  172. IWbemContext * pCtxIn,
  173. IEnumWbemClassObject ** ppEnumOut
  174. )
  175. {
  176. HRESULT hr;
  177. hr = m_pWbemServices->CreateInstanceEnum(
  178. bstrClassIn,
  179. lFlagsIn,
  180. pCtxIn,
  181. ppEnumOut
  182. );
  183. if ( SUCCEEDED( hr ) )
  184. {
  185. hr = CoImpersonateClient();
  186. } // if:
  187. return hr;
  188. } //*** CWbemServices::CreateInstanceEnum()
  189. /////////////////////////////////////////////////////////////////////////////
  190. //++
  191. //
  192. // HRESULT
  193. // CWbemServices::DeleteClass(
  194. // BSTR bstrClassIn,
  195. // long lFlagsIn,
  196. // IWbemContext * pCtxIn,
  197. // IWbemCallResult ** ppCallResultInout
  198. // )
  199. //
  200. // Description:
  201. // Deletes the specified class from the current namespace.
  202. //
  203. // Arguments:
  204. // bstrClassIn
  205. // The name of the class targeted for deletion.
  206. //
  207. // lFlagsIn
  208. // accepts WBEM_FLAG_RETURN_IMMEDIATELY, WBEM_FLAG_
  209. // OWNER_UPDATE
  210. //
  211. // pCtxIn
  212. // Typically NULL
  213. //
  214. // ppCallResultInout
  215. // Receives the call result
  216. //
  217. // Return Value:
  218. // WBEM stand error
  219. //
  220. //--
  221. /////////////////////////////////////////////////////////////////////////////
  222. HRESULT
  223. CWbemServices::DeleteClass(
  224. BSTR bstrClassIn,
  225. long lFlagsIn,
  226. IWbemContext * pCtxIn,
  227. IWbemCallResult ** ppCallResultInout
  228. )
  229. {
  230. HRESULT hr;
  231. hr = m_pWbemServices->DeleteClass(
  232. bstrClassIn,
  233. lFlagsIn,
  234. pCtxIn,
  235. ppCallResultInout
  236. );
  237. if ( SUCCEEDED( hr ) )
  238. {
  239. hr = CoImpersonateClient();
  240. } // if:
  241. return hr;
  242. } //*** CWbemServices::DeleteClass()
  243. /////////////////////////////////////////////////////////////////////////////
  244. //++
  245. //
  246. // HRESULT
  247. // CWbemServices::DeleteInstance(
  248. // BSTR bstrObjectPathIn,
  249. // long lFlagsIn,
  250. // IWbemContext * pCtxIn,
  251. // IWbemCallResult ** ppCallResultInout
  252. // )
  253. //
  254. // Description:
  255. // deletes an instance of an existing class in the current namespace
  256. //
  257. // Arguments:
  258. // bstrObjectPathIn
  259. // object path to the instance to be deleted.
  260. //
  261. // lFlagsIn
  262. // accepts WBEM_FLAG_RETURN_IMMEDIATELY
  263. //
  264. // pCtxIn
  265. // Typically NULL
  266. //
  267. // ppCallResultInout
  268. // Receives the call result
  269. //
  270. // Return Value:
  271. // WBEM standard error
  272. //
  273. //--
  274. /////////////////////////////////////////////////////////////////////////////
  275. HRESULT
  276. CWbemServices::DeleteInstance(
  277. BSTR bstrObjectPathIn,
  278. long lFlagsIn,
  279. IWbemContext * pCtxIn,
  280. IWbemCallResult ** ppCallResultInout
  281. )
  282. {
  283. HRESULT hr;
  284. hr = m_pWbemServices->DeleteInstance(
  285. bstrObjectPathIn,
  286. lFlagsIn,
  287. pCtxIn,
  288. ppCallResultInout
  289. );
  290. if ( SUCCEEDED( hr ) )
  291. {
  292. hr = CoImpersonateClient();
  293. } // if:
  294. return hr;
  295. } //*** CWbemServices::DeleteInstance()
  296. /////////////////////////////////////////////////////////////////////////////
  297. //++
  298. //
  299. // HRESULT
  300. // CWbemServices::ExecMethod(
  301. // BSTR bstrObjectPathIn,
  302. // BSTR bstrMethodNameIn,
  303. // long lFlagsIn,
  304. // IWbemContext * pCtxIn,
  305. // IWbemClassObject * pInParamsIn,
  306. // IWbemClassObject ** ppOurParamsOut,
  307. // IWbemCallResult ** ppCallResultOut
  308. // )
  309. //
  310. // Description:
  311. // execute methods for the given object
  312. //
  313. // Arguments:
  314. // bstrObjectPathIn
  315. // object path of the object for which the method is executed
  316. //
  317. // bstrMethodNameIn
  318. // name of the method to be invoked
  319. //
  320. // lFlagsIn
  321. // zero to make this a synchronous call
  322. //
  323. // pCtxIn
  324. // Typically NULL
  325. //
  326. // pInParamsIn
  327. // Input parameters for the method
  328. //
  329. // ppOurParamsOut
  330. // output parameters for the method
  331. //
  332. // ppCallResultOut
  333. // To receive call result
  334. //
  335. // Return Value:
  336. // WBEM standard error
  337. //
  338. //--
  339. /////////////////////////////////////////////////////////////////////////////
  340. HRESULT
  341. CWbemServices::ExecMethod(
  342. BSTR bstrObjectPathIn,
  343. BSTR bstrMethodNameIn,
  344. long lFlagsIn,
  345. IWbemContext * pCtxIn,
  346. IWbemClassObject * pInParamsIn,
  347. IWbemClassObject ** ppOurParamsOut,
  348. IWbemCallResult ** ppCallResultOut
  349. )
  350. {
  351. HRESULT hr;
  352. hr = m_pWbemServices->ExecMethod(
  353. bstrObjectPathIn,
  354. bstrMethodNameIn,
  355. lFlagsIn,
  356. pCtxIn,
  357. pInParamsIn,
  358. ppOurParamsOut,
  359. ppCallResultOut
  360. );
  361. if ( SUCCEEDED( hr ) )
  362. {
  363. hr = CoImpersonateClient();
  364. } // if:
  365. return hr;
  366. } //*** CWbemServices::ExecMethod()
  367. /////////////////////////////////////////////////////////////////////////////
  368. //++
  369. //
  370. // HRESULT
  371. // CWbemServices::ExecNotificationQuery(
  372. // BSTR bstrQueryLanguageIn,
  373. // BSTR bstrQueryIn,
  374. // long lFlagsIn,
  375. // IWbemContext * pCtxIn,
  376. // IEnumWbemClassObject ** ppEnumOut
  377. // )
  378. //
  379. // Description:
  380. // Executes a query to receive events.
  381. //
  382. // Arguments:
  383. // bstrQueryLanguageIn
  384. // BSTR containing one of the query languages supported by WMI
  385. //
  386. // bstrQueryIn
  387. // text of the event-related query
  388. //
  389. // lFlagsIn
  390. // WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_RETURN_IMMEDIATELY
  391. //
  392. // pCtxIn
  393. // Typically NULL
  394. //
  395. // ppEnumOut
  396. // Receives the enumerator
  397. //
  398. // Return Value:
  399. // WBEM standard error
  400. //
  401. //--
  402. /////////////////////////////////////////////////////////////////////////////
  403. HRESULT
  404. CWbemServices::ExecNotificationQuery(
  405. BSTR bstrQueryLanguageIn,
  406. BSTR bstrQueryIn,
  407. long lFlagsIn,
  408. IWbemContext * pCtxIn,
  409. IEnumWbemClassObject ** ppEnumOut
  410. )
  411. {
  412. HRESULT hr;
  413. hr = m_pWbemServices->ExecNotificationQuery(
  414. bstrQueryLanguageIn,
  415. bstrQueryIn,
  416. lFlagsIn,
  417. pCtxIn,
  418. ppEnumOut
  419. );
  420. if ( SUCCEEDED( hr ) )
  421. {
  422. hr = CoImpersonateClient();
  423. } // if:
  424. return hr;
  425. } //*** CWbemServices::ExecNotificationQuery()
  426. /////////////////////////////////////////////////////////////////////////////
  427. //++
  428. //
  429. // HRESULT
  430. // CWbemServices::ExecQuery(
  431. // BSTR bstrQueryLanguageIn,
  432. // BSTR bstrQueryIn,
  433. // long lFlagsIn,
  434. // IWbemContext * pCtxIn,
  435. // IEnumWbemClassObject ** ppEnumOut
  436. // )
  437. //
  438. // Description:
  439. // executes a query to retrieve objects.
  440. //
  441. // Arguments:
  442. // bstrQueryLanguageIn
  443. // BSTR containing one of the query languages supported by WMI
  444. //
  445. // bstrQueryIn
  446. // containing the text of the query
  447. //
  448. // lFllFlagsIn
  449. // WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_RETURN_IMMEDIATELY
  450. // WBEM_FLAG_BIDIRECTIONAL, WBEM_FLAG_ENSURE_LOCATABLE
  451. // WBEM_FLAG_PROTOTYPE
  452. //
  453. // pCtxIn
  454. // Typically NULL
  455. //
  456. // ppEnumOut
  457. // receives the enumerator
  458. //
  459. // Return Value:
  460. // WBEM standard error
  461. //
  462. //--
  463. /////////////////////////////////////////////////////////////////////////////
  464. HRESULT
  465. CWbemServices::ExecQuery(
  466. BSTR bstrQueryLanguageIn,
  467. BSTR bstrQueryIn,
  468. long lFlagsIn,
  469. IWbemContext * pCtxIn,
  470. IEnumWbemClassObject ** ppEnumOut
  471. )
  472. {
  473. HRESULT hr;
  474. hr = m_pWbemServices->ExecQuery(
  475. bstrQueryLanguageIn,
  476. bstrQueryIn,
  477. lFlagsIn,
  478. pCtxIn,
  479. ppEnumOut
  480. );
  481. if ( SUCCEEDED( hr ) )
  482. {
  483. hr = CoImpersonateClient();
  484. } // if:
  485. return hr;
  486. } //*** CWbemServices::ExecQuery()
  487. /////////////////////////////////////////////////////////////////////////////
  488. //++
  489. //
  490. // HRESULT
  491. // CWbemServices::GetObject(
  492. // BSTR bstrObjectPathIn,
  493. // long lFlagsIn,
  494. // IWbemContext * pCtxIn,
  495. // IWbemClassObject ** ppObjectInout,
  496. // IWbemCallResult ** ppCallResultInout
  497. // )
  498. //
  499. // Description:
  500. // retrieves a class or instance
  501. //
  502. // Arguments:
  503. // bstrObjectPathIn
  504. // The object path of the object to retrieve
  505. //
  506. // lFlagsIn
  507. // 0
  508. //
  509. // pCtxIn
  510. // Typically NULL
  511. //
  512. // ppObjectInout
  513. // If not NULL, this receives the object
  514. //
  515. // ppCallResultInout
  516. // If the lFlags parameter contains WBEM_FLAG_RETURN_IMMEDIATELY,
  517. // this call will return immediately with WBEM_S_NO_ERROR. The
  518. // ppCallResult parameter will receive a pointer to a new
  519. // IWbemCallResult object
  520. //
  521. // Return Value:
  522. // WBEM standard error
  523. //
  524. //--
  525. /////////////////////////////////////////////////////////////////////////////
  526. HRESULT
  527. CWbemServices::GetObject(
  528. BSTR bstrObjectPathIn,
  529. long lFlagsIn,
  530. IWbemContext * pCtxIn,
  531. IWbemClassObject ** ppObjectInout,
  532. IWbemCallResult ** ppCallResultInout
  533. )
  534. {
  535. HRESULT hr;
  536. hr = m_pWbemServices->GetObject(
  537. bstrObjectPathIn,
  538. lFlagsIn,
  539. pCtxIn,
  540. ppObjectInout,
  541. ppCallResultInout
  542. );
  543. if ( SUCCEEDED( hr ) )
  544. {
  545. hr = CoImpersonateClient();
  546. } // if:
  547. return hr;
  548. } //*** CWbemServices::GetObject()
  549. /////////////////////////////////////////////////////////////////////////////
  550. //++
  551. //
  552. // HRESULT
  553. // CWbemServices::PutClass(
  554. // IWbemClassObject * pObjectIn,
  555. // long lFlagsIn,
  556. // IWbemContext * pCtxIn,
  557. // IWbemCallResult ** ppCallResultInout
  558. // )
  559. //
  560. // Description:
  561. // Creates a new class or updates an existing one
  562. //
  563. // Arguments:
  564. // pObjectIn
  565. // point to a valid class definition
  566. //
  567. // lFlagsIn
  568. // WBEM_FLAG_CREATE_OR_UPDATE,WBEM_FLAG_UPDATE_ONLY,
  569. // WBEM_FLAG_CREATE_ONLY, WBEM_FLAG_RETURN_IMMEDIATELY,
  570. // WBEM_FLAG_OWNER_UPDATE, WBEM_FLAG_UPDATE_COMPATIBLE,
  571. // WBEM_FLAG_UPDATE_SAFE_MODE, WBEM_FLAG_UPDATE_FORCE_MODE
  572. //
  573. // pCtxIn
  574. // Typically NULL
  575. //
  576. // ppCallResultInout
  577. // If the lFlags parameter contains WBEM_FLAG_RETURN_IMMEDIATELY,
  578. // this call will return immediately with WBEM_S_NO_ERROR. The
  579. // ppCallResult parameter will receive a pointer to a new
  580. // IWbemCallResult object
  581. //
  582. // Return Value:
  583. // WBEM standard error
  584. //
  585. //--
  586. /////////////////////////////////////////////////////////////////////////////
  587. HRESULT
  588. CWbemServices::PutClass(
  589. IWbemClassObject * pObjectIn,
  590. long lFlagsIn,
  591. IWbemContext * pCtxIn,
  592. IWbemCallResult ** ppCallResultInout
  593. )
  594. {
  595. HRESULT hr;
  596. hr = m_pWbemServices->PutClass(
  597. pObjectIn,
  598. lFlagsIn,
  599. pCtxIn,
  600. ppCallResultInout
  601. );
  602. if ( SUCCEEDED( hr ) )
  603. {
  604. hr = CoImpersonateClient();
  605. } // if:
  606. return hr;
  607. } //*** CWbemServices::PutClass()
  608. /////////////////////////////////////////////////////////////////////////////
  609. //++
  610. //
  611. // HRESULT
  612. // CWbemServices::PutInstance(
  613. // IWbemClassObject * pInstIn,
  614. // long lFlagsIn,
  615. // IWbemContext * pCtxIn,
  616. // IWbemCallResult ** ppCallResultInout
  617. // )
  618. //
  619. // Description:
  620. // Creates or updates an instance of an existing class.
  621. //
  622. // Arguments:
  623. // pInstIn
  624. // Points to the instance to be written
  625. //
  626. // lFlagsIn
  627. // WBEM_FLAG_CREATE_OR_UPDATE,WBEM_FLAG_UPDATE_ONLY,
  628. // WBEM_FLAG_CREATE_ONLY, WBEM_FLAG_RETURN_IMMEDIATELY,
  629. //
  630. // pCtxIn
  631. // Typically NULL
  632. //
  633. // ppCallResultInout
  634. // If the lFlags parameter contains WBEM_FLAG_RETURN_IMMEDIATELY,
  635. // this call will return immediately with WBEM_S_NO_ERROR. The
  636. // ppCallResult parameter will receive a pointer to a new
  637. // IWbemCallResult object
  638. //
  639. // Return Value:
  640. // WBEM standard error
  641. //
  642. //--
  643. /////////////////////////////////////////////////////////////////////////////
  644. HRESULT
  645. CWbemServices::PutInstance(
  646. IWbemClassObject * pInstIn,
  647. long lFlagsIn,
  648. IWbemContext * pCtxIn,
  649. IWbemCallResult ** ppCallResultInout
  650. )
  651. {
  652. HRESULT hr;
  653. hr = m_pWbemServices->PutInstance(
  654. pInstIn,
  655. lFlagsIn,
  656. pCtxIn,
  657. ppCallResultInout
  658. );
  659. if ( SUCCEEDED( hr ) )
  660. {
  661. hr = CoImpersonateClient();
  662. } // if:
  663. return hr;
  664. } //*** CWbemServices::PutInstance()
  665. //****************************************************************************
  666. //
  667. // CImpersonatedProvider
  668. //
  669. //****************************************************************************
  670. /////////////////////////////////////////////////////////////////////////////
  671. //++
  672. //
  673. // CImpersonatedProvider::CImpersonatedProvider(
  674. // BSTR bstrObjectPathIn = NULL,
  675. // BSTR bstrUserIn = NULL,
  676. // BSTR bstrPasswordIn = NULL,
  677. // IWbemContext * pCtxIn = NULL
  678. // )
  679. //
  680. // Description:
  681. // Constructor.
  682. //
  683. // Arguments:
  684. // bstrObjectPathIn --
  685. // bstrUserIn --
  686. // bstrPasswordIn --
  687. // pCtxIn --
  688. //
  689. // Return Values:
  690. // None.
  691. //
  692. //--
  693. /////////////////////////////////////////////////////////////////////////////
  694. CImpersonatedProvider::CImpersonatedProvider(
  695. BSTR ,// bstrObjectPathIn.
  696. BSTR ,// bstrUserIn,
  697. BSTR ,// bstrPasswordIn,
  698. IWbemContext * // pCtxIn
  699. )
  700. : m_cRef( 0 ), m_pNamespace( NULL )
  701. {
  702. } //*** CImpersonatedProvider::CImpersonatedProvider()
  703. /////////////////////////////////////////////////////////////////////////////
  704. //++
  705. //
  706. // CImpersonatedProvider::~CImpersonatedProvider( void )
  707. //
  708. // Description:
  709. // Destructor.
  710. //
  711. // Arguments:
  712. // None.
  713. //
  714. // Return Values:
  715. // None.
  716. //
  717. //--
  718. /////////////////////////////////////////////////////////////////////////////
  719. CImpersonatedProvider::~CImpersonatedProvider( void )
  720. {
  721. delete m_pNamespace;
  722. } //*** CImpersonatedProvider::~CImpersonatedProvider()
  723. /////////////////////////////////////////////////////////////////////////////
  724. //++
  725. //
  726. // STDMETHODIMP_( ULONG )
  727. // CImpersonatedProvider::AddRef( void )
  728. //
  729. // Description:
  730. // Increment the reference count on the COM object.
  731. //
  732. // Arguments:
  733. // None.
  734. //
  735. // Return Values:
  736. // New reference count.
  737. //
  738. //--
  739. /////////////////////////////////////////////////////////////////////////////
  740. STDMETHODIMP_( ULONG )
  741. CImpersonatedProvider::AddRef( void )
  742. {
  743. return InterlockedIncrement( ( long * ) & m_cRef );
  744. } //*** CImpersonatedProvider::AddRef()
  745. /////////////////////////////////////////////////////////////////////////////
  746. //++
  747. //
  748. // STDMETHODIMP_( ULONG )
  749. // CImpersonatedProvider::Release( void )
  750. //
  751. // Description:
  752. // Release a reference on the COM object.
  753. //
  754. // Arguments:
  755. // None.
  756. //
  757. // Return Value:
  758. // New reference count.
  759. //
  760. //--
  761. /////////////////////////////////////////////////////////////////////////////
  762. STDMETHODIMP_( ULONG )
  763. CImpersonatedProvider::Release( void )
  764. {
  765. ULONG nNewCount = InterlockedDecrement( ( long * ) & m_cRef );
  766. if ( 0L == nNewCount )
  767. delete this;
  768. return nNewCount;
  769. } //*** CImpersonatedProvider::Release()
  770. /////////////////////////////////////////////////////////////////////////////
  771. //++
  772. //
  773. // HRESULT
  774. // CImpersonatedProvider::QueryInterface(
  775. // REFIID riid,
  776. // PPVOID ppv
  777. // )
  778. //
  779. // Description:
  780. // Initialize the provider.
  781. //
  782. // Arguments:
  783. // riidIn -- Interface ID being queried.
  784. // ppvOut -- Pointer in which to return interface pointer.
  785. //
  786. // Return Value:
  787. // NOERROR
  788. // E_NOINTERFACE
  789. //
  790. //--
  791. /////////////////////////////////////////////////////////////////////////////
  792. STDMETHODIMP
  793. CImpersonatedProvider::QueryInterface(
  794. REFIID riid,
  795. PPVOID ppv
  796. )
  797. {
  798. *ppv = NULL;
  799. // Since we have dual inheritance, it is necessary to cast the return type
  800. if ( riid == IID_IWbemServices )
  801. {
  802. *ppv = static_cast< IWbemServices * >( this );
  803. }
  804. if ( IID_IUnknown == riid || riid == IID_IWbemProviderInit )
  805. {
  806. *ppv = static_cast< IWbemProviderInit * >( this );
  807. }
  808. if ( NULL != *ppv )
  809. {
  810. AddRef();
  811. return NOERROR;
  812. }
  813. else
  814. {
  815. return E_NOINTERFACE;
  816. }
  817. } //*** CImpersonatedProvider::QueryInterface()
  818. /////////////////////////////////////////////////////////////////////////////
  819. //++
  820. //
  821. // HRESULT
  822. // CImpersonatedProvider::Initialize(
  823. // LPWSTR pszUserIn,
  824. // LONG lFlagsIn,
  825. // LPWSTR pszNamespaceIn,
  826. // LPWSTR pszLocaleIn,
  827. // IWbemServices * pNamespaceIn,
  828. // IWbemContext * pCtxIn,
  829. // IWbemProviderInitSink * pInitSinkIn
  830. // )
  831. //
  832. // Description:
  833. // Initialize the provider.
  834. //
  835. // Arguments:
  836. // pszUserIn --
  837. // lFlagsIn --
  838. // pszNamespaeIn --
  839. // pszLocaleIn --
  840. // pNamespaceIn --
  841. // pCtxIn --
  842. // pInitSinkIn --
  843. //
  844. // Return Value:
  845. // WBEM_S_NO_ERROR
  846. // WBEM_E_OUT_OF_MEMORY
  847. //
  848. //--
  849. /////////////////////////////////////////////////////////////////////////////
  850. STDMETHODIMP
  851. CImpersonatedProvider::Initialize(
  852. LPWSTR ,// pszUserIn,
  853. LONG ,// lFlagsIn,
  854. LPWSTR ,// pszNamespaceIn,
  855. LPWSTR ,// pszLocaleIn,
  856. IWbemServices * pNamespaceIn,
  857. IWbemContext * ,// pCtxIn,
  858. IWbemProviderInitSink * pInitSinkIn
  859. )
  860. {
  861. HRESULT hr = WBEM_S_NO_ERROR;
  862. LONG lStatus = WBEM_S_INITIALIZED;
  863. m_pNamespace = new CWbemServices( pNamespaceIn );
  864. if ( m_pNamespace == NULL )
  865. {
  866. hr = WBEM_E_OUT_OF_MEMORY;
  867. lStatus = WBEM_E_FAILED;
  868. } // if: error allocating memory
  869. //Let CIMOM know you are initialized
  870. //==================================
  871. pInitSinkIn->SetStatus( lStatus, 0 );
  872. return hr;
  873. } //*** CImpersonatedProvider::Initialize()
  874. /////////////////////////////////////////////////////////////////////////////
  875. //++
  876. //
  877. // HRESULT
  878. // CImpersonatedProvider::CreateInstanceEnumAsync(
  879. // const BSTR bstrClassIn,
  880. // long lFlagsIn,
  881. // IWbemContext * pCtxIn,
  882. // IWbemObjectSink * pResponseHandlerIn
  883. // )
  884. //
  885. // Description:
  886. // Create an instance asynchronously.
  887. //
  888. // Arguments:
  889. // bstrClassIn --
  890. // lFlagsIn --
  891. // pCtxIn --
  892. // pResonseHandlerIn --
  893. //
  894. // Return Value:
  895. // Any return values fro DoCreateInstanceEnumAsync().
  896. //
  897. //--
  898. /////////////////////////////////////////////////////////////////////////////
  899. HRESULT
  900. CImpersonatedProvider::CreateInstanceEnumAsync(
  901. const BSTR bstrClassIn,
  902. long lFlagsIn,
  903. IWbemContext * pCtxIn,
  904. IWbemObjectSink * pResponseHandlerIn
  905. )
  906. {
  907. HRESULT hr;
  908. hr = CoImpersonateClient();
  909. if ( SUCCEEDED( hr ) )
  910. {
  911. hr = DoCreateInstanceEnumAsync(
  912. bstrClassIn,
  913. lFlagsIn,
  914. pCtxIn,
  915. pResponseHandlerIn
  916. );
  917. } // if:
  918. return hr;
  919. } //*** CImpersonatedProvider::CreateInstanceEnumAsync()
  920. /////////////////////////////////////////////////////////////////////////////
  921. //++
  922. //
  923. // HRESULT
  924. // CImpersonatedProvider::DeleteInstanceAsync(
  925. // const BSTR bstrObjectPathIn,
  926. // long lFlagsIn,
  927. // IWbemContext * pCtxIn,
  928. // IWbemObjectSink * pResponseHandlerIn
  929. // )
  930. //
  931. // Description:
  932. // Delete an instance asynchronously.
  933. //
  934. // Arguments:
  935. // bstrObjectPathIn --
  936. // lFlagsIn --
  937. // pCtxIn --
  938. // pResonseHandlerIn --
  939. //
  940. // Return Value:
  941. // Any return values fro DoDeleteInstanceAsync().
  942. //
  943. //--
  944. /////////////////////////////////////////////////////////////////////////////
  945. HRESULT
  946. CImpersonatedProvider::DeleteInstanceAsync(
  947. const BSTR bstrObjectPathIn,
  948. long lFlagsIn,
  949. IWbemContext * pCtxIn,
  950. IWbemObjectSink * pResponseHandlerIn
  951. )
  952. {
  953. HRESULT hr;
  954. hr = CoImpersonateClient();
  955. if ( SUCCEEDED( hr ) )
  956. {
  957. hr = DoDeleteInstanceAsync(
  958. bstrObjectPathIn,
  959. lFlagsIn,
  960. pCtxIn,
  961. pResponseHandlerIn
  962. );
  963. } // if:
  964. return hr;
  965. } //*** CImpersonatedProvider::DeleteInstanceAsync()
  966. /////////////////////////////////////////////////////////////////////////////
  967. //++
  968. //
  969. // HRESULT
  970. // CImpersonatedProvider::ExecMethodAsync(
  971. // const BSTR bstrObjectPathIn,
  972. // const BSTR bstrMethodNameIn,
  973. // long lFlagsIn,
  974. // IWbemContext * pCtxIn,
  975. // IWbemClassObject * pInParamsIn,
  976. // IWbemObjectSink * pResponseHandlerIn
  977. // )
  978. //
  979. // Description:
  980. // Execute a method asynchronously.
  981. //
  982. // Arguments:
  983. // bstrObjectPathIn --
  984. // bstrMethodNameIn --
  985. // lFlagsIn --
  986. // pCtxIn --
  987. // pInParamsIn --
  988. // pResonseHandlerIn --
  989. //
  990. // Return Value:
  991. // Any return values fro DoExecMethodAsync().
  992. //
  993. //--
  994. /////////////////////////////////////////////////////////////////////////////
  995. HRESULT
  996. CImpersonatedProvider::ExecMethodAsync(
  997. const BSTR bstrObjectPathIn,
  998. const BSTR bstrMethodNameIn,
  999. long lFlagsIn,
  1000. IWbemContext * pCtxIn,
  1001. IWbemClassObject * pInParamsIn,
  1002. IWbemObjectSink * pResponseHandlerIn
  1003. )
  1004. {
  1005. HRESULT hr;
  1006. hr = CoImpersonateClient();
  1007. if ( SUCCEEDED( hr ) )
  1008. {
  1009. hr = DoExecMethodAsync(
  1010. bstrObjectPathIn,
  1011. bstrMethodNameIn,
  1012. lFlagsIn,
  1013. pCtxIn,
  1014. pInParamsIn,
  1015. pResponseHandlerIn
  1016. );
  1017. } // if:
  1018. return hr;
  1019. } //*** CImpersonatedProvider::ExecMethodAsync()
  1020. /////////////////////////////////////////////////////////////////////////////
  1021. //++
  1022. //
  1023. // HRESULT
  1024. // CImpersonatedProvider::ExecQueryAsync(
  1025. // const BSTR bstrQueryLanguageIn,
  1026. // const BSTR bstrQueryIn,
  1027. // long lFlagsIn,
  1028. // IWbemContext * pCtxIn,
  1029. // IWbemObjectSink * pResponseHandlerIn
  1030. // )
  1031. //
  1032. // Description:
  1033. // Execute a query asynchronously.
  1034. //
  1035. // Arguments:
  1036. // bstrQueryLanguageIn --
  1037. // bstrQueryIn --
  1038. // lFlagsIn --
  1039. // pCtxIn --
  1040. // pResonseHandlerIn --
  1041. //
  1042. // Return Value:
  1043. // Any return values fro DoExecQueryAsync().
  1044. //
  1045. //--
  1046. /////////////////////////////////////////////////////////////////////////////
  1047. HRESULT
  1048. CImpersonatedProvider::ExecQueryAsync(
  1049. const BSTR bstrQueryLanguageIn,
  1050. const BSTR bstrQueryIn,
  1051. long lFlagsIn,
  1052. IWbemContext * pCtxIn,
  1053. IWbemObjectSink * pResponseHandlerIn
  1054. )
  1055. {
  1056. HRESULT hr;
  1057. hr = CoImpersonateClient();
  1058. if ( SUCCEEDED( hr ) )
  1059. {
  1060. hr = DoExecQueryAsync(
  1061. bstrQueryLanguageIn,
  1062. bstrQueryIn,
  1063. lFlagsIn,
  1064. pCtxIn,
  1065. pResponseHandlerIn
  1066. );
  1067. } // if:
  1068. return hr;
  1069. } //*** CImpersonatedProvider::ExecQueryAsync()
  1070. /////////////////////////////////////////////////////////////////////////////
  1071. //++
  1072. //
  1073. // HRESULT
  1074. // CImpersonatedProvider::GetObjectAsync(
  1075. // const BSTR bstrObjectPathIn,
  1076. // long lFlagsIn,
  1077. // IWbemContext * pCtxIn,
  1078. // IWbemObjectSink * pResponseHandlerIn
  1079. // )
  1080. //
  1081. // Description:
  1082. // Get an instance asynchronously.
  1083. //
  1084. // Arguments:
  1085. // bstrObjectPathIn --
  1086. // lFlagsIn --
  1087. // pCtxIn --
  1088. // pResonseHandlerIn --
  1089. //
  1090. // Return Value:
  1091. // Any return values fro DoGetObjectAsync().
  1092. //
  1093. //--
  1094. /////////////////////////////////////////////////////////////////////////////
  1095. HRESULT
  1096. CImpersonatedProvider::GetObjectAsync(
  1097. const BSTR bstrObjectPathIn,
  1098. long lFlagsIn,
  1099. IWbemContext * pCtxIn,
  1100. IWbemObjectSink * pResponseHandlerIn
  1101. )
  1102. {
  1103. HRESULT hr;
  1104. hr = CoImpersonateClient();
  1105. if ( SUCCEEDED( hr ) )
  1106. {
  1107. hr = DoGetObjectAsync(
  1108. bstrObjectPathIn,
  1109. lFlagsIn,
  1110. pCtxIn,
  1111. pResponseHandlerIn
  1112. );
  1113. } // if:
  1114. return hr;
  1115. } //*** CImpersonatedProvider::GetObjectAsync()
  1116. /////////////////////////////////////////////////////////////////////////////
  1117. //++
  1118. //
  1119. // HRESULT
  1120. // CImpersonatedProvider::PutInstanceAsync(
  1121. // IWbemClassObject * pInstIn,
  1122. // long lFlagsIn,
  1123. // IWbemContext * pCtxIn,
  1124. // IWbemObjectSink * pResponseHandlerIn
  1125. // )
  1126. //
  1127. // Description:
  1128. // Save an instance asynchronously.
  1129. //
  1130. // Arguments:
  1131. // pInstIn --
  1132. // lFlagsIn --
  1133. // pCtxIn --
  1134. // pResonseHandlerIn --
  1135. //
  1136. // Return Value:
  1137. // Any return values fro DoPutInstanceAsync().
  1138. //
  1139. //--
  1140. /////////////////////////////////////////////////////////////////////////////
  1141. HRESULT
  1142. CImpersonatedProvider::PutInstanceAsync(
  1143. IWbemClassObject * pInstIn,
  1144. long lFlagsIn,
  1145. IWbemContext * pCtxIn,
  1146. IWbemObjectSink * pResponseHandlerIn
  1147. )
  1148. {
  1149. HRESULT hr;
  1150. hr = CoImpersonateClient();
  1151. if ( SUCCEEDED( hr ) )
  1152. {
  1153. hr = DoPutInstanceAsync(
  1154. pInstIn,
  1155. lFlagsIn,
  1156. pCtxIn,
  1157. pResponseHandlerIn
  1158. );
  1159. } // if:
  1160. return hr;
  1161. } //*** CImpersonatedProvider::PutInstanceAsync()
  1162. //****************************************************************************
  1163. //
  1164. // CWbemInstanceMgr
  1165. //
  1166. //****************************************************************************
  1167. /////////////////////////////////////////////////////////////////////////////
  1168. //++
  1169. //
  1170. // CWbemInstanceMgr::CWbemInstanceMgr(
  1171. // IWbemObjectSink * pHandlerIn,
  1172. // DWORD dwSizeIn
  1173. // )
  1174. //
  1175. // Description:
  1176. // Constructor.
  1177. //
  1178. // Arguments:
  1179. // pHandlerIn -- WMI sink.
  1180. // dwSizeIn --
  1181. //
  1182. // Return Value:
  1183. // None.
  1184. //
  1185. //--
  1186. /////////////////////////////////////////////////////////////////////////////
  1187. CWbemInstanceMgr::CWbemInstanceMgr(
  1188. IWbemObjectSink * pHandlerIn,
  1189. DWORD dwSizeIn // = 50
  1190. )
  1191. : m_pSink( NULL )
  1192. , m_ppInst( NULL )
  1193. , m_dwIndex( 0 )
  1194. {
  1195. DWORD dwIndex = 0;
  1196. m_pSink = pHandlerIn;
  1197. if ( m_pSink == NULL )
  1198. {
  1199. throw static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER );
  1200. } // if: no sink specified
  1201. m_pSink->AddRef( );
  1202. m_dwThreshHold = dwSizeIn;
  1203. m_ppInst = new IWbemClassObject*[ dwSizeIn ];
  1204. for ( dwIndex = 0 ; dwIndex < dwSizeIn ; dwIndex++ )
  1205. {
  1206. m_ppInst[ dwIndex ] = NULL;
  1207. } // for each in m_ppInst
  1208. } //*** CWbemInstanceMgr::CWbemInstanceMgr()
  1209. /////////////////////////////////////////////////////////////////////////////
  1210. //++
  1211. //
  1212. // CWbemInstanceMgr::CWbemInstanceMgr( void )
  1213. //
  1214. // Description:
  1215. // Destructor.
  1216. //
  1217. // Arguments:
  1218. // None.
  1219. //
  1220. // Return Value:
  1221. // None.
  1222. //
  1223. //--
  1224. /////////////////////////////////////////////////////////////////////////////
  1225. CWbemInstanceMgr::~CWbemInstanceMgr( void )
  1226. {
  1227. if ( m_ppInst != NULL )
  1228. {
  1229. if ( m_dwIndex > 0 )
  1230. {
  1231. m_pSink->Indicate( m_dwIndex, m_ppInst );
  1232. }
  1233. DWORD dwIndex = 0;
  1234. for ( dwIndex = 0; dwIndex < m_dwIndex; dwIndex++ )
  1235. {
  1236. if ( m_ppInst[ dwIndex ] != NULL )
  1237. {
  1238. ( m_ppInst[ dwIndex ] )->Release( );
  1239. }
  1240. }
  1241. delete [] m_ppInst;
  1242. }
  1243. m_pSink->Release( );
  1244. } //*** CWbemInstanceMgr::~CWbemInstanceMgr()
  1245. /////////////////////////////////////////////////////////////////////////////
  1246. //++
  1247. //
  1248. // void
  1249. // CWbemInstanceMgr::Indicate(
  1250. // IN IWbemClassObject * pInstIn
  1251. // )
  1252. //
  1253. // Description:
  1254. // Notify an instance to WMI sink
  1255. //
  1256. // Arguments:
  1257. // pInstIn -- Instance to send to WMI
  1258. //
  1259. // Return Value:
  1260. // None.
  1261. //
  1262. //--
  1263. /////////////////////////////////////////////////////////////////////////////
  1264. void
  1265. CWbemInstanceMgr::Indicate(
  1266. IN IWbemClassObject * pInstIn
  1267. )
  1268. {
  1269. if ( pInstIn == NULL )
  1270. {
  1271. throw static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER );
  1272. }
  1273. m_ppInst[ m_dwIndex++ ] = pInstIn;
  1274. pInstIn->AddRef( );
  1275. if ( m_dwIndex == m_dwThreshHold )
  1276. {
  1277. HRESULT sc = WBEM_S_NO_ERROR;
  1278. sc = m_pSink->Indicate( m_dwIndex, m_ppInst );
  1279. if( FAILED( sc ) )
  1280. {
  1281. if ( sc == WBEM_E_CALL_CANCELLED )
  1282. {
  1283. sc = WBEM_S_NO_ERROR;
  1284. }
  1285. throw CProvException( sc );
  1286. }
  1287. // reset state
  1288. DWORD dwIndex = 0;
  1289. for ( dwIndex = 0; dwIndex < m_dwThreshHold; dwIndex++ )
  1290. {
  1291. if ( m_ppInst[ dwIndex ] != NULL )
  1292. {
  1293. ( m_ppInst[ dwIndex ] )->Release( );
  1294. } //*** if m_ppInst[ _dwIndex ] != NULL
  1295. m_ppInst[ dwIndex ] = NULL;
  1296. } //*** for each in m_ppInst
  1297. m_dwIndex = 0;
  1298. } //*** if( m_dwIndex == m_dwThreshHold )
  1299. return;
  1300. } //*** CWbemInstanceMgr::Indicate()
  1301. /////////////////////////////////////////////////////////////////////////////
  1302. //++
  1303. //
  1304. // CWbemInstanceMgr::SetStatus
  1305. //
  1306. // Description:
  1307. // send status to WMI sink
  1308. //
  1309. // Arguments:
  1310. // lFlagsIn -- WMI flag
  1311. // hrIn -- HResult
  1312. // bstrParamIn -- Message
  1313. // pObjParamIn -- WMI extended error object
  1314. //
  1315. // Return Value:
  1316. // None.
  1317. //
  1318. //--
  1319. /////////////////////////////////////////////////////////////////////////////
  1320. void
  1321. CWbemInstanceMgr::SetStatus(
  1322. LONG lFlagsIn,
  1323. HRESULT hrIn,
  1324. BSTR bstrParamIn,
  1325. IWbemClassObject * pObjParamIn
  1326. )
  1327. {
  1328. m_pSink->SetStatus(
  1329. lFlagsIn,
  1330. hrIn,
  1331. bstrParamIn,
  1332. pObjParamIn
  1333. );
  1334. } //*** CWbemInstanceMgr::SetStatus()