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.

726 lines
19 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // CClusterNetwork.cpp
  7. //
  8. // Description:
  9. // Implementation of CClusterNetwork class
  10. //
  11. // Author:
  12. // Henry Wang (HenryWa) 24-AUG-1999
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "Pch.h"
  16. #include "ClusterNetworks.h"
  17. //****************************************************************************
  18. //
  19. // CClusterNetwork
  20. //
  21. //****************************************************************************
  22. //////////////////////////////////////////////////////////////////////////////
  23. //++
  24. //
  25. // CClusterNetwork::CClusterNetwork(
  26. // LPCWSTR pwszNameIn,
  27. // CWbemServices * pNamespaceIn
  28. // )
  29. //
  30. // Description:
  31. // Constructor.
  32. //
  33. // Arguments:
  34. // pwszNameIn -- Class name
  35. // pNamespaceIn -- Namespace
  36. //
  37. // Return Values:
  38. // None.
  39. //
  40. //--
  41. //////////////////////////////////////////////////////////////////////////////
  42. CClusterNetwork::CClusterNetwork(
  43. LPCWSTR pwszNameIn,
  44. CWbemServices * pNamespaceIn
  45. )
  46. :CProvBase( pwszNameIn, pNamespaceIn )
  47. {
  48. } //*** CClusterNetwork::CClusterNetwork()
  49. //////////////////////////////////////////////////////////////////////////////
  50. //++
  51. //
  52. // static
  53. // CProvBase *
  54. // CClusterNetwork::S_CreateThis(
  55. // LPCWSTR pwszNameIn,
  56. // CWbemServices * pNamespaceIn,
  57. // DWORD // dwEnumTypeIn
  58. // )
  59. //
  60. // Description:
  61. // Create a cluster node object.
  62. //
  63. // Arguments:
  64. // pwszNameIn -- Class name
  65. // pNamespaceIn -- Namespace
  66. // dwEnumTypeIn -- Type id
  67. //
  68. // Return Values:
  69. // pointer to the CProvBase
  70. //
  71. //--
  72. //////////////////////////////////////////////////////////////////////////////
  73. CProvBase *
  74. CClusterNetwork::S_CreateThis(
  75. LPCWSTR pwszNameIn,
  76. CWbemServices * pNamespaceIn,
  77. DWORD // dwEnumTypeIn
  78. )
  79. {
  80. return new CClusterNetwork( pwszNameIn, pNamespaceIn );
  81. } //*** CClusterNetwork::S_CreateThis()
  82. //////////////////////////////////////////////////////////////////////////////
  83. //++
  84. //
  85. // const SPropMapEntryArray *
  86. // CClusterNetwork::RgGetPropMap( void )
  87. //
  88. // Description:
  89. // Retrieve the property maping table of the cluster network.
  90. //
  91. // Arguments:
  92. // None.
  93. //
  94. // Return Values:
  95. // Reference to the array of property maping table.
  96. //
  97. //--
  98. //////////////////////////////////////////////////////////////////////////////
  99. const SPropMapEntryArray *
  100. CClusterNetwork::RgGetPropMap( void )
  101. {
  102. static SPropMapEntry s_rgpm[] =
  103. {
  104. {
  105. NULL,
  106. CLUSREG_NAME_NET_PRIORITY,
  107. SZ_TYPE,
  108. READONLY
  109. }
  110. ,
  111. {
  112. NULL,
  113. CLUSREG_NAME_NET_TRANSPORT,
  114. DWORD_TYPE,
  115. READWRITE
  116. }
  117. };
  118. static SPropMapEntryArray s_pmea(
  119. sizeof( s_rgpm ) /sizeof( SPropMapEntry ),
  120. s_rgpm
  121. );
  122. return & s_pmea;
  123. } //*** CClusterNetwork::RgGetPropMap()
  124. //////////////////////////////////////////////////////////////////////////////
  125. //++
  126. //
  127. // SCODE
  128. // CClusterNetwork::EnumInstance(
  129. // long lFlagsIn,
  130. // IWbemContext * pCtxIn,
  131. // IWbemObjectSink * pHandlerIn
  132. // )
  133. //
  134. // Description:
  135. // enum cluster instance
  136. //
  137. // Arguments:
  138. // lFlagsIn -- WMI flag
  139. // pCtxIn -- WMI context
  140. // pHandlerIn -- WMI sink pointer
  141. //
  142. // Return Values:
  143. // WBEM_S_NO_ERROR
  144. //
  145. //--
  146. //////////////////////////////////////////////////////////////////////////////
  147. SCODE
  148. CClusterNetwork::EnumInstance(
  149. long lFlagsIn,
  150. IWbemContext * pCtxIn,
  151. IWbemObjectSink * pHandlerIn
  152. )
  153. {
  154. SAFECLUSTER shCluster;
  155. SAFENETWORK shNetwork;
  156. LPCWSTR pwszName;
  157. shCluster = OpenCluster( NULL );
  158. CClusterEnum cluEnum( shCluster, CLUSTER_ENUM_NETWORK );
  159. while ( pwszName = cluEnum.GetNext() )
  160. {
  161. shNetwork = OpenClusterNetwork( shCluster, pwszName );
  162. ClusterToWMI( shNetwork, pHandlerIn );
  163. } // while: more networks
  164. return WBEM_S_NO_ERROR;
  165. } //*** CClusterNetwork::EnumInstance()
  166. //////////////////////////////////////////////////////////////////////////////
  167. //++
  168. //
  169. // void
  170. // CClusterResource::ClusterToWMI(
  171. // HNETWORK hNetworkIn,
  172. // IWbemObjectSink * pHandlerIn
  173. // )
  174. //
  175. // Description:
  176. // Translate a cluster resource objects to WMI object.
  177. //
  178. // Arguments:
  179. // hResourceIn -- handle to resource
  180. // pHandlerIn -- Pointer to WMI sink
  181. //
  182. // Return Values:
  183. // WBEM_S_NO_ERROR
  184. // win32 error
  185. //
  186. //--
  187. //////////////////////////////////////////////////////////////////////////////
  188. void
  189. CClusterNetwork::ClusterToWMI(
  190. HNETWORK hNetworkIn,
  191. IWbemObjectSink * pHandlerIn
  192. )
  193. {
  194. static SGetControl s_rgControl[] =
  195. {
  196. { CLUSCTL_NETWORK_GET_RO_COMMON_PROPERTIES, FALSE },
  197. { CLUSCTL_NETWORK_GET_COMMON_PROPERTIES, FALSE },
  198. { CLUSCTL_NETWORK_GET_RO_PRIVATE_PROPERTIES, TRUE },
  199. { CLUSCTL_NETWORK_GET_PRIVATE_PROPERTIES, TRUE }
  200. };
  201. static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetControl );
  202. CWbemClassObject wco;
  203. CError er;
  204. UINT idx;
  205. m_pClass->SpawnInstance( 0, & wco );
  206. for ( idx = 0 ; idx < s_cControl ; idx ++ )
  207. {
  208. CClusPropList pl;
  209. er = pl.ScGetNetworkProperties(
  210. hNetworkIn,
  211. s_rgControl[ idx ].dwControl,
  212. NULL,
  213. 0
  214. );
  215. CClusterApi::GetObjectProperties(
  216. RgGetPropMap(),
  217. pl,
  218. wco,
  219. s_rgControl[ idx ].fPrivate
  220. );
  221. } // for: each control code
  222. {
  223. DWORD dwState = GetClusterNetworkState( hNetworkIn );
  224. wco.SetProperty( dwState, PVD_PROP_NETWORK_STATE );
  225. }
  226. //
  227. // flags and characteristics
  228. //
  229. {
  230. DWORD cbReturned;
  231. DWORD dwOut;
  232. er = ClusterNetworkControl(
  233. hNetworkIn,
  234. NULL,
  235. CLUSCTL_NETWORK_GET_CHARACTERISTICS, // this control code
  236. NULL, // input buffer (not used)
  237. 0, // input buffer size (not used)
  238. & dwOut,
  239. sizeof( DWORD ),
  240. & cbReturned
  241. );
  242. wco.SetProperty(
  243. dwOut,
  244. PVD_PROP_CHARACTERISTIC
  245. );
  246. }
  247. pHandlerIn->Indicate( 1, & wco );
  248. return;
  249. } //*** CClusterResource::ClusterToWMI()
  250. //////////////////////////////////////////////////////////////////////////////
  251. //++
  252. //
  253. // SCODE
  254. // CClusterNetwork::GetObject(
  255. // CObjPath & rObjPathIn,
  256. // long lFlagsIn,
  257. // IWbemContext * pCtxIn,
  258. // IWbemObjectSink * pHandlerIn
  259. // )
  260. //
  261. // Description:
  262. // Retrieve cluster node object based given object path.
  263. //
  264. // Arguments:
  265. // rObjPathIn -- Object path to cluster object
  266. // lFlagsIn -- WMI flag
  267. // pCtxIn -- WMI context
  268. // pHandlerIn -- WMI sink pointer
  269. //
  270. // Return Values:
  271. // WBEM_S_NO_ERROR
  272. // win32 error
  273. //
  274. //--
  275. //////////////////////////////////////////////////////////////////////////////
  276. SCODE
  277. CClusterNetwork::GetObject(
  278. CObjPath & rObjPathIn,
  279. long lFlagsIn,
  280. IWbemContext * pCtxIn,
  281. IWbemObjectSink * pHandlerIn
  282. )
  283. {
  284. SAFECLUSTER shCluster;
  285. SAFENETWORK shNetwork;
  286. shCluster = OpenCluster( NULL );
  287. shNetwork = OpenClusterNetwork(
  288. shCluster,
  289. rObjPathIn.GetStringValueForProperty( PVD_PROP_NAME )
  290. );
  291. ClusterToWMI( shNetwork, pHandlerIn );
  292. return WBEM_S_NO_ERROR;
  293. } //*** CClusterNetwork::GetObject()
  294. //////////////////////////////////////////////////////////////////////////////
  295. //++
  296. //
  297. // SCODE
  298. // CClusterNetwork::ExecuteMethod(
  299. // CObjPath & rObjPathIn,
  300. // WCHAR * pwszMethodNameIn,
  301. // long lFlagIn,
  302. // IWbemClassObject * pParamsIn,
  303. // IWbemObjectSink * pHandlerIn
  304. // )
  305. //
  306. // Description:
  307. // Execute methods defined in the mof for cluster network.
  308. //
  309. // Arguments:
  310. // rObjPathIn -- Object path to cluster object
  311. // pwszMethodNameIn -- Name of the method to be invoked
  312. // lFlagIn -- WMI flag
  313. // pParamsIn -- Input parameters for the method
  314. // pHandlerIn -- WMI sink pointer
  315. //
  316. // Return Values:
  317. // WBEM_S_NO_ERROR
  318. //
  319. //--
  320. //////////////////////////////////////////////////////////////////////////////
  321. SCODE
  322. CClusterNetwork::ExecuteMethod(
  323. CObjPath & rObjPathIn,
  324. WCHAR * pwszMethodNameIn,
  325. long lFlagIn,
  326. IWbemClassObject * pParamsIn,
  327. IWbemObjectSink * pHandlerIn
  328. )
  329. {
  330. SAFECLUSTER shCluster;
  331. CWbemClassObject wcoInArgs( pParamsIn );
  332. CError er;
  333. shCluster = OpenCluster( NULL );
  334. if ( _wcsicmp( pwszMethodNameIn, PVD_MTH_NETWORK_RENAME ) == 0 )
  335. {
  336. _bstr_t bstrName;
  337. SAFENETWORK shNetwork;
  338. wcoInArgs.GetProperty( bstrName, PVD_MTH_NETWORK_PARM_NEWNAME );
  339. shNetwork = OpenClusterNetwork(
  340. shCluster,
  341. rObjPathIn.GetStringValueForProperty( PVD_PROP_NAME )
  342. );
  343. er = SetClusterNetworkName( shNetwork, bstrName );
  344. } // if: RENAME
  345. else
  346. {
  347. er = static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER );
  348. }
  349. return WBEM_S_NO_ERROR;
  350. } //*** CClusterNetwork::ExecuteMethod()
  351. //////////////////////////////////////////////////////////////////////////////
  352. //++
  353. //
  354. // SCODE
  355. // CClusterNetwork::PutInstance
  356. // CWbemClassObject & rInstToPutIn,
  357. // long lFlagIn,
  358. // IWbemContext * pCtxIn,
  359. // IWbemObjectSink * pHandlerIn
  360. // )
  361. //
  362. // Description:
  363. // Save this instance.
  364. //
  365. // Arguments:
  366. // rInstToPutIn -- WMI object to be saved
  367. // lFlagIn -- WMI flag
  368. // pCtxIn -- WMI context
  369. // pHandlerIn -- WMI sink pointer
  370. //
  371. // Return Values:
  372. // WBEM_S_NO_ERROR
  373. //
  374. //--
  375. //////////////////////////////////////////////////////////////////////////////
  376. SCODE
  377. CClusterNetwork::PutInstance(
  378. CWbemClassObject & rInstToPutIn,
  379. long lFlagIn,
  380. IWbemContext * pCtxIn,
  381. IWbemObjectSink * pHandlerIn
  382. )
  383. {
  384. static SGetSetControl s_rgControl[] =
  385. {
  386. {
  387. CLUSCTL_NETWORK_GET_COMMON_PROPERTIES,
  388. CLUSCTL_NETWORK_SET_COMMON_PROPERTIES,
  389. FALSE
  390. },
  391. {
  392. CLUSCTL_NETWORK_GET_PRIVATE_PROPERTIES,
  393. CLUSCTL_NETWORK_SET_PRIVATE_PROPERTIES,
  394. TRUE
  395. }
  396. };
  397. static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetSetControl );
  398. _bstr_t bstrName;
  399. SAFECLUSTER shCluster;
  400. SAFENETWORK shNetwork;
  401. CError er;
  402. UINT idx;
  403. rInstToPutIn.GetProperty( bstrName, PVD_PROP_NAME );
  404. shCluster = OpenCluster( NULL );
  405. shNetwork = OpenClusterNetwork( shCluster, bstrName );
  406. for ( idx = 0 ; idx < s_cControl; idx ++ )
  407. {
  408. CClusPropList plOld;
  409. CClusPropList plNew;
  410. er = plOld.ScGetNetworkProperties(
  411. shNetwork,
  412. s_rgControl[ idx ].dwGetControl,
  413. NULL,
  414. NULL,
  415. 0
  416. );
  417. CClusterApi::SetObjectProperties(
  418. RgGetPropMap(),
  419. plNew,
  420. plOld,
  421. rInstToPutIn,
  422. s_rgControl[ idx ].fPrivate
  423. );
  424. if ( plNew.Cprops() > 0 )
  425. {
  426. er = ClusterNetworkControl(
  427. shNetwork,
  428. NULL,
  429. s_rgControl[ idx ].dwSetControl,
  430. plNew.PbPropList(),
  431. plNew.CbPropList(),
  432. NULL,
  433. 0,
  434. NULL
  435. );
  436. }
  437. } // for: each control code
  438. return WBEM_S_NO_ERROR;
  439. } //*** CClusterNetwork::PutInstance()
  440. //////////////////////////////////////////////////////////////////////////////
  441. //++
  442. //
  443. // SCODE
  444. // CClusterNetwork::DeleteInstance(
  445. //
  446. // Description:
  447. // Delete the object specified in rObjPathIn.
  448. //
  449. // Arguments:
  450. // rObjPathIn -- ObjPath for the instance to be deleted
  451. // lFlagIn -- WMI flag
  452. // pCtxIn -- WMI context
  453. // pHandlerIn -- WMI sink pointer
  454. //
  455. // Return Values:
  456. // WBEM_E_NOT_SUPPORTED
  457. //
  458. //--
  459. //////////////////////////////////////////////////////////////////////////////
  460. SCODE
  461. CClusterNetwork::DeleteInstance(
  462. CObjPath & rObjPathIn,
  463. long lFlagIn,
  464. IWbemContext * pCtxIn,
  465. IWbemObjectSink * pHandlerIn
  466. )
  467. {
  468. return WBEM_E_NOT_SUPPORTED;
  469. } //*** CClusterNetwork::DeleteInstance()
  470. //****************************************************************************
  471. //
  472. // CClusterNetNetInterface
  473. //
  474. //****************************************************************************
  475. //////////////////////////////////////////////////////////////////////////////
  476. //++
  477. //
  478. // ClusterNetNetInterface::CClusterNetNetInterface(
  479. // LPCWSTR pwszNameIn,
  480. // CWbemServices * pNamespaceIn,
  481. // DWORD dwEnumTypeIn
  482. // )
  483. //
  484. // Description:
  485. // Constructor.
  486. //
  487. // Arguments:
  488. // pwszNameIn -- Class name
  489. // pNamespaceIn -- Namespace
  490. // dwEnumTypeIn -- Type id
  491. //
  492. // Return Values:
  493. // None.
  494. //
  495. //--
  496. //////////////////////////////////////////////////////////////////////////////
  497. CClusterNetNetInterface::CClusterNetNetInterface(
  498. const WCHAR * pwszNameIn,
  499. CWbemServices * pNamespaceIn,
  500. DWORD dwEnumTypeIn
  501. )
  502. : CClusterObjAssoc( pwszNameIn, pNamespaceIn, dwEnumTypeIn )
  503. {
  504. } //*** ClusterNetNetInterface::ClusterNetNetInterface()
  505. //////////////////////////////////////////////////////////////////////////////
  506. //++
  507. //
  508. // static
  509. // CProvBase *
  510. // ClusterNetNetInterface::S_CreateThis(
  511. // LPCWSTR pwszNameIn,
  512. // CWbemServices * pNamespaceIn,
  513. // DWORD dwEnumTypeIn
  514. // )
  515. //
  516. // Description:
  517. // Create a cluster node object
  518. //
  519. // Arguments:
  520. // pwszNameIn -- Class name
  521. // pNamespaceIn -- Namespace
  522. // dwEnumTypeIn -- Type id
  523. //
  524. // Return Values:
  525. // Pointer to the CProvBase
  526. //
  527. //--
  528. //////////////////////////////////////////////////////////////////////////////
  529. CProvBase *
  530. CClusterNetNetInterface::S_CreateThis(
  531. LPCWSTR pwszNameIn,
  532. CWbemServices * pNamespaceIn,
  533. DWORD dwEnumTypeIn
  534. )
  535. {
  536. return new CClusterNetNetInterface(
  537. pwszNameIn,
  538. pNamespaceIn,
  539. dwEnumTypeIn
  540. );
  541. } //*** ClusterNetNetInterface::S_CreateThis()
  542. //////////////////////////////////////////////////////////////////////////////
  543. //++
  544. //
  545. // SCODE
  546. // ClusterNetNetInterface::GetPropMap(
  547. // long lFlagsIn,
  548. // IWbemContext * pCtxIn,
  549. // IWbemObjectSink * pHandlerIn
  550. // )
  551. //
  552. // Description:
  553. // Retrieve the property maping table of the cluster network net interface.
  554. //
  555. // Arguments:
  556. // lFlagsIn --
  557. // pCtxIn --
  558. // pHandlerIn --
  559. //
  560. // Return Values:
  561. // Reference to the array of property maping table
  562. //
  563. //--
  564. //////////////////////////////////////////////////////////////////////////////
  565. SCODE
  566. CClusterNetNetInterface::EnumInstance(
  567. long lFlagsIn,
  568. IWbemContext * pCtxIn,
  569. IWbemObjectSink * pHandlerIn
  570. )
  571. {
  572. SAFECLUSTER shCluster;
  573. LPCWSTR pwszName = NULL;
  574. CError er;
  575. DWORD dwError;
  576. CWbemClassObject wcoGroup;
  577. _bstr_t bstrGroup;
  578. _bstr_t bstrPart;
  579. DWORD cbNetworkName = MAX_PATH;
  580. CWstrBuf wsbNetworkName;
  581. HRESULT hr;
  582. CComPtr< IEnumWbemClassObject > pEnum;
  583. shCluster = OpenCluster( NULL );
  584. CClusterEnum clusEnum( shCluster, m_dwEnumType );
  585. m_wcoGroup.SpawnInstance( 0, & wcoGroup );
  586. //
  587. // network interface objects
  588. //
  589. er = m_pNamespace->CreateInstanceEnum(
  590. _bstr_t( PVD_CLASS_NETWORKSINTERFACE ),
  591. 0,
  592. NULL,
  593. & pEnum
  594. );
  595. wsbNetworkName.SetSize( cbNetworkName );
  596. for ( ; ; )
  597. {
  598. CWbemClassObject wcoNetInterface;
  599. DWORD cWco;
  600. hr = pEnum->Next(
  601. 5000,
  602. 1,
  603. & wcoNetInterface,
  604. & cWco
  605. );
  606. if ( hr == WBEM_S_NO_ERROR )
  607. {
  608. SAFENETINTERFACE shNetInterface;
  609. DWORD cbReturn;
  610. CWbemClassObject wco;
  611. wcoNetInterface.GetProperty( bstrPart, PVD_WBEM_PROP_DEVICEID );
  612. shNetInterface = OpenClusterNetInterface( shCluster, bstrPart );
  613. dwError = ClusterNetInterfaceControl(
  614. shNetInterface,
  615. NULL,
  616. CLUSCTL_NETINTERFACE_GET_NETWORK,
  617. NULL,
  618. 0,
  619. wsbNetworkName,
  620. cbNetworkName,
  621. & cbReturn
  622. );
  623. if ( dwError == ERROR_MORE_DATA )
  624. {
  625. cbNetworkName = cbReturn;
  626. wsbNetworkName.SetSize( cbNetworkName );
  627. er = ClusterNetInterfaceControl(
  628. shNetInterface,
  629. NULL,
  630. CLUSCTL_NETINTERFACE_GET_NETWORK,
  631. NULL,
  632. 0,
  633. wsbNetworkName,
  634. cbNetworkName,
  635. & cbReturn
  636. );
  637. } // if: buffer is too small
  638. wcoGroup.SetProperty( wsbNetworkName, CLUSREG_NAME_NET_NAME );
  639. wcoGroup.GetProperty( bstrGroup, PVD_WBEM_RELPATH );
  640. wcoNetInterface.GetProperty( bstrPart, PVD_WBEM_RELPATH );
  641. m_pClass->SpawnInstance( 0, & wco );
  642. wco.SetProperty( (LPWSTR) bstrGroup, PVD_PROP_GROUPCOMPONENT );
  643. wco.SetProperty( (LPWSTR ) bstrPart, PVD_PROP_PARTCOMPONENT );
  644. pHandlerIn->Indicate( 1, & wco );
  645. } // if: no error
  646. else
  647. {
  648. break;
  649. } // else S_FALSE, or error
  650. } // forever
  651. if ( FAILED ( hr ) )
  652. {
  653. er = hr;
  654. }
  655. return WBEM_S_NO_ERROR;
  656. } //*** ClusterNetNetInterface::EnumInstance()