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.

683 lines
17 KiB

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