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.

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