Source code of Windows XP (NT5)
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.

822 lines
18 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // CClusCfgIPAddressInfo.cpp
  7. //
  8. // Description:
  9. // This file contains the definition of the CClusCfgIPAddressInfo
  10. // class.
  11. //
  12. // The class CClusCfgIPAddressInfo represents a cluster manageable
  13. // network. It implements the IClusCfgIPAddressInfo interface.
  14. //
  15. // Documentation:
  16. //
  17. // Header File:
  18. // CClusCfgIPAddressInfo.h
  19. //
  20. // Maintained By:
  21. // Galen Barbee (GalenB) 23-MAR-2000
  22. //
  23. //////////////////////////////////////////////////////////////////////////////
  24. //////////////////////////////////////////////////////////////////////////////
  25. // Include Files
  26. //////////////////////////////////////////////////////////////////////////////
  27. #include "pch.h"
  28. #include "CClusCfgIPAddressInfo.h"
  29. #include <ClusRtl.h>
  30. //////////////////////////////////////////////////////////////////////////////
  31. // Constant Definitions
  32. //////////////////////////////////////////////////////////////////////////////
  33. DEFINE_THISCLASS( "CClusCfgIPAddressInfo" );
  34. //*************************************************************************//
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CClusCfgIPAddressInfo class
  37. /////////////////////////////////////////////////////////////////////////////
  38. //////////////////////////////////////////////////////////////////////////////
  39. //++
  40. //
  41. // CClusCfgIPAddressInfo::S_HrCreateInstance
  42. //
  43. // Description:
  44. // Create a CClusCfgIPAddressInfo instance.
  45. //
  46. // Arguments:
  47. // None.
  48. //
  49. // Return Values:
  50. // Pointer to CClusCfgIPAddressInfo instance.
  51. //
  52. //--
  53. //////////////////////////////////////////////////////////////////////////////
  54. HRESULT
  55. CClusCfgIPAddressInfo::S_HrCreateInstance( IUnknown ** ppunkOut )
  56. {
  57. TraceFunc( "" );
  58. Assert( ppunkOut != NULL );
  59. HRESULT hr;
  60. CClusCfgIPAddressInfo * lpccs = NULL;
  61. if ( ppunkOut == NULL )
  62. {
  63. hr = THR( E_POINTER );
  64. goto Cleanup;
  65. } // if:
  66. lpccs = new CClusCfgIPAddressInfo();
  67. if ( lpccs == NULL )
  68. {
  69. hr = THR( E_OUTOFMEMORY );
  70. goto Cleanup;
  71. } // if: error allocating object
  72. hr = THR( lpccs->HrInit() );
  73. if ( FAILED( hr ) )
  74. {
  75. goto Cleanup;
  76. } // if: HrInit() failed
  77. hr = THR( lpccs->TypeSafeQI( IUnknown, ppunkOut ) );
  78. Cleanup:
  79. if ( FAILED( hr ) )
  80. {
  81. LogMsg( L"[SRV] CClusCfgIPAddressInfo::S_HrCreateInstance() failed. (hr = %#08x)", hr );
  82. } // if:
  83. if ( lpccs != NULL )
  84. {
  85. lpccs->Release();
  86. } // if:
  87. HRETURN( hr );
  88. } //*** CClusCfgIPAddressInfo::S_HrCreateInstance
  89. //////////////////////////////////////////////////////////////////////////////
  90. //++
  91. //
  92. // CClusCfgIPAddressInfo::S_HrCreateInstance
  93. //
  94. // Description:
  95. // Create a CClusCfgIPAddressInfo instance.
  96. //
  97. // Arguments:
  98. // None.
  99. //
  100. // Return Values:
  101. // Pointer to CClusCfgIPAddressInfo instance.
  102. //
  103. //--
  104. //////////////////////////////////////////////////////////////////////////////
  105. HRESULT
  106. CClusCfgIPAddressInfo::S_HrCreateInstance(
  107. ULONG ulIPAddressIn
  108. , ULONG ulIPSubnetIn
  109. , IUnknown ** ppunkOut
  110. )
  111. {
  112. TraceFunc( "" );
  113. Assert( ppunkOut != NULL );
  114. Assert( ulIPAddressIn != 0 );
  115. Assert( ulIPSubnetIn != 0 );
  116. HRESULT hr;
  117. CClusCfgIPAddressInfo * pccsd = NULL;
  118. if ( ppunkOut == NULL )
  119. {
  120. hr = THR( E_POINTER );
  121. goto Cleanup;
  122. } // if:
  123. pccsd = new CClusCfgIPAddressInfo();
  124. if ( pccsd == NULL )
  125. {
  126. hr = THR( E_OUTOFMEMORY );
  127. goto Cleanup;
  128. } // if: error allocating object
  129. hr = THR( pccsd->HrInit( ulIPAddressIn, ulIPSubnetIn ) );
  130. if ( FAILED( hr ) )
  131. {
  132. goto Cleanup;
  133. } // if: HrInit() failed
  134. hr = THR( pccsd->TypeSafeQI( IUnknown, ppunkOut ) );
  135. Cleanup:
  136. if ( FAILED( hr ) )
  137. {
  138. LogMsg( L"[SRV] CClusCfgIPAddressInfo::S_HrCreateInstance( ULONG, ULONG ) failed. (hr = %#08x)", hr );
  139. } // if:
  140. if ( pccsd != NULL )
  141. {
  142. pccsd->Release();
  143. } // if:
  144. HRETURN( hr );
  145. } //*** CClusCfgIPAddressInfo::S_HrCreateInstance
  146. //////////////////////////////////////////////////////////////////////////////
  147. //++
  148. //
  149. // CClusCfgIPAddressInfo::CClusCfgIPAddressInfo
  150. //
  151. // Description:
  152. // Constructor of the CClusCfgIPAddressInfo class. This initializes
  153. // the m_cRef variable to 1 instead of 0 to account of possible
  154. // QueryInterface failure in DllGetClassObject.
  155. //
  156. // Arguments:
  157. // None.
  158. //
  159. // Return Value:
  160. // None.
  161. //
  162. // Remarks:
  163. // None.
  164. //
  165. //--
  166. //////////////////////////////////////////////////////////////////////////////
  167. CClusCfgIPAddressInfo::CClusCfgIPAddressInfo( void )
  168. : m_cRef( 1 )
  169. {
  170. TraceFunc( "" );
  171. // Increment the count of components in memory so the DLL hosting this
  172. // object cannot be unloaded.
  173. InterlockedIncrement( &g_cObjects );
  174. Assert( m_ulIPAddress == 0 );
  175. Assert( m_ulIPSubnet == 0 );
  176. Assert( m_pIWbemServices == NULL );
  177. Assert( m_picccCallback == NULL );
  178. TraceFuncExit();
  179. } //*** CClusCfgIPAddressInfo::CClusCfgIPAddressInfo
  180. //////////////////////////////////////////////////////////////////////////////
  181. //++
  182. //
  183. // CClusCfgIPAddressInfo::~CClusCfgIPAddressInfo
  184. //
  185. // Description:
  186. // Desstructor of the CClusCfgIPAddressInfo class.
  187. //
  188. // Arguments:
  189. // None.
  190. //
  191. // Return Value:
  192. // None.
  193. //
  194. // Remarks:
  195. // None.
  196. //
  197. //--
  198. //////////////////////////////////////////////////////////////////////////////
  199. CClusCfgIPAddressInfo::~CClusCfgIPAddressInfo( void )
  200. {
  201. TraceFunc( "" );
  202. if ( m_pIWbemServices != NULL )
  203. {
  204. m_pIWbemServices->Release();
  205. } // if:
  206. if ( m_picccCallback != NULL )
  207. {
  208. m_picccCallback->Release();
  209. } // if:
  210. // There's going to be one less component in memory. Decrement component count.
  211. InterlockedDecrement( &g_cObjects );
  212. TraceFuncExit();
  213. } //*** CClusCfgIPAddressInfo::~CClusCfgIPAddressInfo
  214. //*************************************************************************//
  215. /////////////////////////////////////////////////////////////////////////////
  216. // CClusCfgIPAddressInfo -- IUknkown interface.
  217. /////////////////////////////////////////////////////////////////////////////
  218. //////////////////////////////////////////////////////////////////////////////
  219. //++
  220. //
  221. // STDMETHODIMP_( ULONG )
  222. // CClusCfgIPAddressInfo:: [IUNKNOWN] AddRef
  223. //
  224. // Description:
  225. // Increment the reference count of this object by one.
  226. //
  227. // Arguments:
  228. // None.
  229. //
  230. // Return Value:
  231. // The new reference count.
  232. //
  233. // Remarks:
  234. // None.
  235. //
  236. //--
  237. //////////////////////////////////////////////////////////////////////////////
  238. STDMETHODIMP_( ULONG )
  239. CClusCfgIPAddressInfo::AddRef( void )
  240. {
  241. TraceFunc( "[IUnknown]" );
  242. InterlockedIncrement( & m_cRef );
  243. RETURN( m_cRef );
  244. } //*** CClusCfgIPAddressInfo::AddRef
  245. //////////////////////////////////////////////////////////////////////////////
  246. //++
  247. //
  248. // STDMETHODIMP_( ULONG )
  249. // CClusCfgIPAddressInfo:: [IUNKNOWN] Release
  250. //
  251. // Description:
  252. // Decrement the reference count of this object by one.
  253. //
  254. // Arguments:
  255. // None.
  256. //
  257. // Return Value:
  258. // The new reference count.
  259. //
  260. // Remarks:
  261. // None.
  262. //
  263. //--
  264. //////////////////////////////////////////////////////////////////////////////
  265. STDMETHODIMP_( ULONG )
  266. CClusCfgIPAddressInfo::Release( void )
  267. {
  268. TraceFunc( "[IUnknown]" );
  269. LONG cRef;
  270. cRef = InterlockedDecrement( &m_cRef );
  271. if ( cRef == 0 )
  272. {
  273. TraceDo( delete this );
  274. } // if: reference count equal to zero
  275. RETURN( cRef );
  276. } //*** CClusCfgIPAddressInfo::Release
  277. //////////////////////////////////////////////////////////////////////////////
  278. //++
  279. //
  280. // CClusCfgIPAddressInfo:: [INKNOWN] QueryInterface
  281. //
  282. // Description:
  283. // Query this object for the passed in interface.
  284. //
  285. // Arguments:
  286. // IN REFIID riid,
  287. // Id of interface requested.
  288. //
  289. // OUT void ** ppv
  290. // Pointer to the requested interface.
  291. //
  292. // Return Value:
  293. // S_OK
  294. // If the interface is available on this object.
  295. //
  296. // E_NOINTERFACE
  297. // If the interface is not available.
  298. //
  299. // Remarks:
  300. // None.
  301. //
  302. //--
  303. //////////////////////////////////////////////////////////////////////////////
  304. STDMETHODIMP
  305. CClusCfgIPAddressInfo::QueryInterface( REFIID riid, void ** ppv )
  306. {
  307. TraceQIFunc( riid, ppv );
  308. HRESULT hr = E_NOINTERFACE;
  309. if ( IsEqualIID( riid, IID_IUnknown ) )
  310. {
  311. *ppv = static_cast< IClusCfgIPAddressInfo * >( this );
  312. hr = S_OK;
  313. } // if: IUnknown
  314. else if ( IsEqualIID( riid, IID_IClusCfgIPAddressInfo ) )
  315. {
  316. *ppv = TraceInterface( __THISCLASS__, IClusCfgIPAddressInfo, this, 0 );
  317. hr = S_OK;
  318. } // else if:
  319. else if ( IsEqualIID( riid, IID_IClusCfgWbemServices ) )
  320. {
  321. *ppv = TraceInterface( __THISCLASS__, IClusCfgWbemServices, this, 0 );
  322. hr = S_OK;
  323. } // else if:
  324. else if ( IsEqualIID( riid, IID_IClusCfgInitialize ) )
  325. {
  326. *ppv = TraceInterface( __THISCLASS__, IClusCfgInitialize, this, 0 );
  327. hr = S_OK;
  328. } // else if:
  329. if ( SUCCEEDED( hr ) )
  330. {
  331. ((IUnknown *) *ppv)->AddRef( );
  332. } // if: success
  333. QIRETURN_IGNORESTDMARSHALLING( hr, riid );
  334. } //*** CClusCfgIPAddressInfo::QueryInterface
  335. //*************************************************************************//
  336. /////////////////////////////////////////////////////////////////////////////
  337. // CClusCfgIPAddressInfo -- IClusCfgInitialize interface.
  338. /////////////////////////////////////////////////////////////////////////////
  339. //////////////////////////////////////////////////////////////////////////////
  340. //++
  341. //
  342. // CClusCfgIPAddressInfo::Initialize
  343. //
  344. // Description:
  345. // Initialize this component.
  346. //
  347. // Arguments:
  348. // IN IUknown * punkCallbackIn
  349. //
  350. // IN LCID lcidIn
  351. //
  352. // Return Value:
  353. // S_OK
  354. // Success
  355. //
  356. // Remarks:
  357. // None.
  358. //
  359. //--
  360. //////////////////////////////////////////////////////////////////////////////
  361. STDMETHODIMP
  362. CClusCfgIPAddressInfo::Initialize(
  363. IUnknown * punkCallbackIn,
  364. LCID lcidIn
  365. )
  366. {
  367. TraceFunc( "[IClusCfgInitialize]" );
  368. Assert( m_picccCallback == NULL );
  369. HRESULT hr = S_OK;
  370. m_lcid = lcidIn;
  371. if ( punkCallbackIn == NULL )
  372. {
  373. hr = THR( E_POINTER );
  374. goto Cleanup;
  375. } // if:
  376. hr = THR( punkCallbackIn->TypeSafeQI( IClusCfgCallback, &m_picccCallback ) );
  377. Cleanup:
  378. HRETURN( hr );
  379. } //*** CClusCfgIPAddressInfo::Initialize
  380. //*************************************************************************//
  381. /////////////////////////////////////////////////////////////////////////////
  382. // CClusCfgIPAddressInfo -- IClusCfgWbemServices interface.
  383. /////////////////////////////////////////////////////////////////////////////
  384. //////////////////////////////////////////////////////////////////////////////
  385. //++
  386. //
  387. // CClusCfgIPAddressInfo::SetWbemServices
  388. //
  389. // Description:
  390. // Set the WBEM services provider.
  391. //
  392. // Arguments:
  393. // IN IWbemServices pIWbemServicesIn
  394. //
  395. // Return Value:
  396. // S_OK
  397. // Success
  398. //
  399. // E_POINTER
  400. // The pIWbemServicesIn param is NULL.
  401. //
  402. // Remarks:
  403. // None.
  404. //
  405. //--
  406. //////////////////////////////////////////////////////////////////////////////
  407. STDMETHODIMP
  408. CClusCfgIPAddressInfo::SetWbemServices( IWbemServices * pIWbemServicesIn )
  409. {
  410. TraceFunc( "[IClusCfgWbemServices]" );
  411. HRESULT hr = S_OK;
  412. if ( pIWbemServicesIn == NULL )
  413. {
  414. hr = THR( E_POINTER );
  415. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_SetWbemServices_IPAddress, IDS_ERROR_NULL_POINTER, hr );
  416. goto Cleanup;
  417. } // if:
  418. m_pIWbemServices = pIWbemServicesIn;
  419. m_pIWbemServices->AddRef();
  420. Cleanup:
  421. HRETURN( hr );
  422. } //*** CClusCfgIPAddressInfo::SetWbemServices
  423. //*************************************************************************//
  424. /////////////////////////////////////////////////////////////////////////////
  425. // CClusCfgIPAddressInfo class -- IClusCfgIPAddressInfo interface
  426. /////////////////////////////////////////////////////////////////////////////
  427. //////////////////////////////////////////////////////////////////////////////
  428. //++
  429. //
  430. // CClusCfgIPAddressInfo::GetUID
  431. //
  432. // Description:
  433. //
  434. // Arguments:
  435. // None.
  436. //
  437. // Return Value:
  438. //
  439. //
  440. // Remarks:
  441. // None.
  442. //
  443. //--
  444. //////////////////////////////////////////////////////////////////////////////
  445. STDMETHODIMP
  446. CClusCfgIPAddressInfo::GetUID( BSTR * pbstrUIDOut )
  447. {
  448. TraceFunc( "[IClusCfgIPAddressInfo]" );
  449. Assert( m_ulIPAddress != 0 );
  450. Assert( m_ulIPSubnet != 0 );
  451. HRESULT hr = S_OK;
  452. ULONG ulNetwork = ( m_ulIPAddress & m_ulIPSubnet );
  453. LPWSTR psz = NULL;
  454. DWORD sc;
  455. if ( pbstrUIDOut == NULL )
  456. {
  457. hr = THR( E_POINTER );
  458. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_IPAddressInfo_GetUID_Pointer, IDS_ERROR_NULL_POINTER, hr );
  459. goto Cleanup;
  460. } // if:
  461. sc = ClRtlTcpipAddressToString( ulNetwork, &psz ); // KB: Allocates to psz using LocalAlloc().
  462. if ( sc != ERROR_SUCCESS )
  463. {
  464. hr = THR( HRESULT_FROM_WIN32( sc ) );
  465. LOG_STATUS_REPORT( L"CClusCfgIPAddressInfo::GetUID() ClRtlTcpipAddressToString() failed.", hr );
  466. goto Cleanup;
  467. } // if:
  468. *pbstrUIDOut = SysAllocString( psz );
  469. if ( *pbstrUIDOut == NULL )
  470. {
  471. hr = THR( E_OUTOFMEMORY );
  472. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_IPAddressInfo_GetUID_Memory, IDS_ERROR_OUTOFMEMORY, hr );
  473. goto Cleanup;
  474. } // if:
  475. Cleanup:
  476. if ( psz != NULL )
  477. {
  478. LocalFree( psz ); // KB: Don't use TraceFree() here!
  479. } // if:
  480. HRETURN( hr );
  481. } //*** CClusCfgIPAddressInfo::GetUID
  482. //////////////////////////////////////////////////////////////////////////////
  483. //++
  484. //
  485. // CClusCfgIPAddressInfo::GetIPAddress
  486. //
  487. // Description:
  488. //
  489. // Arguments:
  490. // None.
  491. //
  492. // Return Value:
  493. //
  494. //
  495. // Remarks:
  496. // None.
  497. //
  498. //--
  499. //////////////////////////////////////////////////////////////////////////////
  500. STDMETHODIMP
  501. CClusCfgIPAddressInfo::GetIPAddress( ULONG * pulDottedQuadOut )
  502. {
  503. TraceFunc( "[IClusCfgIPAddressInfo]" );
  504. HRESULT hr = S_OK;
  505. if ( pulDottedQuadOut == NULL )
  506. {
  507. hr = THR( E_POINTER );
  508. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_GetNetworkGetIPAddress, IDS_ERROR_NULL_POINTER, hr );
  509. goto Cleanup;
  510. } // if:
  511. *pulDottedQuadOut = m_ulIPAddress;
  512. Cleanup:
  513. HRETURN( hr );
  514. } //*** CClusCfgIPAddressInfo::GetIPAddress
  515. //////////////////////////////////////////////////////////////////////////////
  516. //++
  517. //
  518. // CClusCfgIPAddressInfo::SetIPAddress
  519. //
  520. // Description:
  521. //
  522. // Arguments:
  523. // None.
  524. //
  525. // Return Value:
  526. //
  527. //
  528. // Remarks:
  529. // None.
  530. //
  531. //--
  532. //////////////////////////////////////////////////////////////////////////////
  533. STDMETHODIMP
  534. CClusCfgIPAddressInfo::SetIPAddress( ULONG ulDottedQuadIn )
  535. {
  536. TraceFunc( "[IClusCfgIPAddressInfo]" );
  537. HRESULT hr = S_OK;
  538. if ( ulDottedQuadIn == 0 )
  539. {
  540. hr = THR( E_INVALIDARG );
  541. goto Cleanup;
  542. } // if:
  543. m_ulIPAddress = ulDottedQuadIn;
  544. Cleanup:
  545. HRETURN( hr );
  546. } //*** CClusCfgIPAddressInfo::SetIPAddress
  547. //////////////////////////////////////////////////////////////////////////////
  548. //++
  549. //
  550. // CClusCfgIPAddressInfo::GetSubnetMask
  551. //
  552. // Description:
  553. //
  554. // Arguments:
  555. // None.
  556. //
  557. // Return Value:
  558. //
  559. //
  560. // Remarks:
  561. // None.
  562. //
  563. //--
  564. //////////////////////////////////////////////////////////////////////////////
  565. STDMETHODIMP
  566. CClusCfgIPAddressInfo::GetSubnetMask( ULONG * pulDottedQuadOut )
  567. {
  568. TraceFunc( "[IClusCfgIPAddressInfo]" );
  569. HRESULT hr = S_OK;
  570. if ( pulDottedQuadOut == NULL )
  571. {
  572. hr = THR( E_POINTER );
  573. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_GetSubnetMask, IDS_ERROR_NULL_POINTER, hr );
  574. goto Cleanup;
  575. } // if:
  576. *pulDottedQuadOut = m_ulIPSubnet;
  577. Cleanup:
  578. HRETURN( hr );
  579. } //*** CClusCfgIPAddressInfo::GetSubnetMask
  580. //////////////////////////////////////////////////////////////////////////////
  581. //++
  582. //
  583. // CClusCfgIPAddressInfo::SetSubnetMask
  584. //
  585. // Description:
  586. //
  587. // Arguments:
  588. // None.
  589. //
  590. // Return Value:
  591. //
  592. //
  593. // Remarks:
  594. // None.
  595. //
  596. //--
  597. //////////////////////////////////////////////////////////////////////////////
  598. STDMETHODIMP
  599. CClusCfgIPAddressInfo::SetSubnetMask( ULONG ulDottedQuadIn )
  600. {
  601. TraceFunc( "[IClusCfgIPAddressInfo]" );
  602. HRESULT hr = S_OK;
  603. if ( ulDottedQuadIn == 0 )
  604. {
  605. hr = THR( E_INVALIDARG );
  606. goto Cleanup;
  607. } // if:
  608. m_ulIPSubnet = ulDottedQuadIn;
  609. Cleanup:
  610. HRETURN( hr );
  611. } //*** CClusCfgIPAddressInfo::SetSubnetMask
  612. //*************************************************************************//
  613. /////////////////////////////////////////////////////////////////////////////
  614. // CClusCfgIPAddressInfo class -- Private Methods.
  615. /////////////////////////////////////////////////////////////////////////////
  616. //////////////////////////////////////////////////////////////////////////////
  617. //++
  618. //
  619. // CClusCfgIPAddressInfo::HrInit
  620. //
  621. // Description:
  622. // Initialize this component.
  623. //
  624. // Arguments:
  625. // None.
  626. //
  627. // Return Value:
  628. //
  629. //
  630. // Remarks:
  631. // None.
  632. //
  633. //--
  634. //////////////////////////////////////////////////////////////////////////////
  635. HRESULT
  636. CClusCfgIPAddressInfo::HrInit( void )
  637. {
  638. TraceFunc( "" );
  639. HRESULT hr = S_OK;
  640. HRETURN( hr );
  641. } //*** CClusCfgIPAddressInfo::HrInit
  642. //////////////////////////////////////////////////////////////////////////////
  643. //++
  644. //
  645. // CClusCfgIPAddressInfo::HrInit
  646. //
  647. // Description:
  648. // Initialize this component.
  649. //
  650. // Arguments:
  651. // None.
  652. //
  653. // Return Value:
  654. //
  655. //
  656. // Remarks:
  657. // None.
  658. //
  659. //--
  660. //////////////////////////////////////////////////////////////////////////////
  661. HRESULT
  662. CClusCfgIPAddressInfo::HrInit( ULONG ulIPAddressIn, ULONG ulIPSubnetIn )
  663. {
  664. TraceFunc( "" );
  665. HRESULT hr = S_OK;
  666. m_ulIPAddress = ulIPAddressIn;
  667. m_ulIPSubnet = ulIPSubnetIn;
  668. HRETURN( hr );
  669. } //*** CClusCfgIPAddressInfo::HrInit