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.

1168 lines
28 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // CProxyCfgNodeInfo.cpp
  7. //
  8. // Description:
  9. // CProxyCfgNodeInfo implementation.
  10. //
  11. // Maintained By:
  12. // Galen Barbee (GalenB) 02-AUG-2000
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. //////////////////////////////////////////////////////////////////////////////
  16. // Include Files
  17. //////////////////////////////////////////////////////////////////////////////
  18. #include "Pch.h"
  19. #include "CProxyCfgNodeInfo.h"
  20. #include "CProxyCfgClusterInfo.h"
  21. #include "nameutil.h"
  22. //////////////////////////////////////////////////////////////////////////////
  23. // Constant Definitions
  24. //////////////////////////////////////////////////////////////////////////////
  25. DEFINE_THISCLASS("CProxyCfgNodeInfo")
  26. //////////////////////////////////////////////////////////////////////////////
  27. //++
  28. //
  29. // CProxyCfgNodeInfo::S_HrCreateInstance
  30. //
  31. // Description:
  32. // Create a CProxyCfgNodeInfo instance.
  33. //
  34. // Arguments:
  35. // ppunkOut
  36. //
  37. // Return Values:
  38. // S_OK
  39. // Success.
  40. //
  41. // E_POINTER
  42. // A passed in argument is NULL.
  43. //
  44. // E_OUTOFMEMORY
  45. // Out of memory.
  46. //
  47. // Other HRESULT error.
  48. //
  49. //--
  50. //////////////////////////////////////////////////////////////////////////////
  51. HRESULT
  52. CProxyCfgNodeInfo::S_HrCreateInstance(
  53. IUnknown ** ppunkOut,
  54. IUnknown * punkOuterIn,
  55. HCLUSTER * phClusterIn,
  56. CLSID * pclsidMajorIn,
  57. LPCWSTR pcszNodeNameIn,
  58. LPCWSTR pcszDomainIn
  59. )
  60. {
  61. TraceFunc( "" );
  62. HRESULT hr = S_OK;
  63. CProxyCfgNodeInfo * ppcni = NULL;
  64. if ( ppunkOut == NULL )
  65. {
  66. hr = THR( E_POINTER );
  67. goto Cleanup;
  68. } // if:
  69. ppcni = new CProxyCfgNodeInfo;
  70. if ( ppcni == NULL )
  71. {
  72. hr = THR( E_OUTOFMEMORY );
  73. goto Cleanup;
  74. } // if:
  75. hr = THR( ppcni->HrInit( punkOuterIn, phClusterIn, pclsidMajorIn, pcszNodeNameIn, pcszDomainIn ) );
  76. if ( FAILED( hr ) )
  77. {
  78. goto Cleanup;
  79. }
  80. hr = THR( ppcni->TypeSafeQI( IUnknown, ppunkOut ) );
  81. if ( FAILED( hr ) )
  82. {
  83. goto Cleanup;
  84. }
  85. Cleanup:
  86. if ( ppcni != NULL )
  87. {
  88. ppcni->Release();
  89. } // if:
  90. HRETURN( hr );
  91. } //*** CProxyCfgNodeInfo::S_HrCreateInstance
  92. //////////////////////////////////////////////////////////////////////////////
  93. //++
  94. //
  95. // CProxyCfgNodeInfo::CProxyCfgNodeInfo
  96. //
  97. // Description:
  98. // Constructor of the CProxyCfgNodeInfo class. This initializes
  99. // the m_cRef variable to 1 instead of 0 to account of possible
  100. // QueryInterface failure in DllGetClassObject.
  101. //
  102. // Arguments:
  103. // None.
  104. //
  105. // Return Value:
  106. // None.
  107. //
  108. // Remarks:
  109. // None.
  110. //
  111. //--
  112. //////////////////////////////////////////////////////////////////////////////
  113. CProxyCfgNodeInfo::CProxyCfgNodeInfo( void )
  114. : m_cRef( 1 )
  115. {
  116. TraceFunc( "" );
  117. InterlockedIncrement( &g_cObjects );
  118. Assert( m_punkOuter == NULL );
  119. Assert( m_phCluster == NULL );
  120. Assert( m_pclsidMajor == NULL );
  121. Assert( m_pcccb == NULL );
  122. // m_cplNode?
  123. // m_cplNodeRO?
  124. Assert( m_hNode == NULL );
  125. TraceFuncExit();
  126. } //*** CProxyCfgNodeInfo::CProxyCfgNodeInfo
  127. //////////////////////////////////////////////////////////////////////////////
  128. //++
  129. //
  130. // CProxyCfgNodeInfo::~CProxyCfgNodeInfo
  131. //
  132. // Description:
  133. // Destructor of the CProxyCfgNodeInfo class.
  134. //
  135. // Arguments:
  136. // None.
  137. //
  138. // Return Value:
  139. // None.
  140. //
  141. // Remarks:
  142. // None.
  143. //
  144. //--
  145. //////////////////////////////////////////////////////////////////////////////
  146. CProxyCfgNodeInfo::~CProxyCfgNodeInfo( void )
  147. {
  148. TraceFunc( "" );
  149. // m_cRef
  150. if ( m_punkOuter != NULL )
  151. {
  152. m_punkOuter->Release();
  153. }
  154. // m_phCluster - DO NOT CLOSE!
  155. // m_pclsidMajor
  156. if ( m_pcccb != NULL )
  157. {
  158. m_pcccb->Release();
  159. }
  160. // m_cplNode - has its own dotr
  161. // m_cplNodeRO - has its own dotr
  162. if ( m_hNode != NULL )
  163. {
  164. BOOL bRet;
  165. bRet = CloseClusterNode( m_hNode );
  166. Assert( bRet );
  167. }
  168. TraceSysFreeString( m_bstrDomain );
  169. InterlockedDecrement( &g_cObjects );
  170. TraceFuncExit();
  171. } //*** CProxyCfgNodeInfo::~CProxyCfgNodeInfo
  172. //////////////////////////////////////////////////////////////////////////////
  173. //++
  174. //
  175. // CProxyCfgNodeInfo::HrInit
  176. //
  177. // Description:
  178. // Initializes the object.
  179. //
  180. // Arguments:
  181. // None.
  182. //
  183. // Return Value:
  184. // S_OK
  185. // Succeeded
  186. //
  187. // other HRESULTs
  188. // Failed.
  189. //
  190. // Remarks:
  191. // None.
  192. //
  193. //--
  194. //////////////////////////////////////////////////////////////////////////////
  195. HRESULT
  196. CProxyCfgNodeInfo::HrInit(
  197. IUnknown * punkOuterIn,
  198. HCLUSTER * phClusterIn,
  199. CLSID * pclsidMajorIn,
  200. LPCWSTR pcszNodeNameIn,
  201. LPCWSTR pcszDomainIn
  202. )
  203. {
  204. TraceFunc( "" );
  205. HRESULT hr;
  206. DWORD sc;
  207. BSTR bstrShortNodeName = NULL;
  208. // IUnknown
  209. Assert( m_cRef == 1 );
  210. //
  211. // Gather information from the input parameters.
  212. //
  213. if ( punkOuterIn != NULL )
  214. {
  215. m_punkOuter = punkOuterIn;
  216. m_punkOuter->AddRef();
  217. }
  218. if ( phClusterIn == NULL )
  219. {
  220. hr = THR( E_INVALIDARG );
  221. goto Cleanup;
  222. }
  223. m_phCluster = phClusterIn;
  224. if ( pclsidMajorIn != NULL )
  225. {
  226. m_pclsidMajor = pclsidMajorIn;
  227. }
  228. else
  229. {
  230. m_pclsidMajor = (CLSID *) &TASKID_Major_Client_And_Server_Log;
  231. }
  232. //
  233. // See if we can callback.
  234. //
  235. hr = THR( m_punkOuter->TypeSafeQI( IClusCfgCallback, &m_pcccb ) );
  236. if ( FAILED( hr ) )
  237. {
  238. goto Cleanup;
  239. }
  240. //
  241. // Save away the domain.
  242. //
  243. m_bstrDomain = TraceSysAllocString( pcszDomainIn );
  244. if ( m_bstrDomain == NULL )
  245. {
  246. hr = THR( E_OUTOFMEMORY );
  247. goto Cleanup;
  248. }
  249. //
  250. // Open the node.
  251. //
  252. if ( pcszNodeNameIn != NULL )
  253. {
  254. //
  255. // Caller supplied the node name.
  256. //
  257. hr = THR( HrGetFQNDisplayName( pcszNodeNameIn, &bstrShortNodeName ) );
  258. if ( FAILED( hr ) )
  259. {
  260. goto Cleanup;
  261. }
  262. m_hNode = OpenClusterNode( *m_phCluster, bstrShortNodeName );
  263. if ( m_hNode == NULL )
  264. {
  265. sc = GetLastError();
  266. if ( sc != ERROR_NOT_FOUND )
  267. {
  268. hr = HRESULT_FROM_WIN32( TW32( sc ) );
  269. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_HrInit_OpenClusterNode_Failed, hr );
  270. goto Cleanup;
  271. }
  272. }
  273. }
  274. else
  275. {
  276. sc = TW32( ResUtilEnumResourcesEx( *m_phCluster,
  277. NULL,
  278. L"Network Name",
  279. &DwEnumResourcesExCallback,
  280. this
  281. ) );
  282. if ( sc != ERROR_SUCCESS )
  283. {
  284. hr = HRESULT_FROM_WIN32( sc );
  285. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_HrInit_ResUtilEnumResourcesEx_Failed, hr );
  286. goto Cleanup;
  287. }
  288. Assert( m_hNode != NULL );
  289. }
  290. //
  291. // Retrieve the properties.
  292. //
  293. sc = TW32( m_cplNode.ScGetNodeProperties( m_hNode, CLUSCTL_NODE_GET_COMMON_PROPERTIES ) );
  294. if ( sc != ERROR_SUCCESS )
  295. {
  296. hr = HRESULT_FROM_WIN32( sc );
  297. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_HrInit_ScGetNodeProperties_Failed, hr );
  298. goto Cleanup;
  299. } // if:
  300. sc = TW32( m_cplNodeRO.ScGetNodeProperties( m_hNode, CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES ) );
  301. if ( sc != ERROR_SUCCESS )
  302. {
  303. hr = HRESULT_FROM_WIN32( sc );
  304. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_HrInit_ScGetNodeProperties_Failed, hr );
  305. goto Cleanup;
  306. } // if:
  307. Cleanup:
  308. TraceSysFreeString( bstrShortNodeName );
  309. HRETURN( hr );
  310. } //*** CProxyCfgNodeInfo::HrInit
  311. //*************************************************************************//
  312. /////////////////////////////////////////////////////////////////////////////
  313. // CProxyCfgNodeInfo -- IUknkown interface.
  314. /////////////////////////////////////////////////////////////////////////////
  315. //////////////////////////////////////////////////////////////////////////////
  316. //++
  317. //
  318. // CProxyCfgNodeInfo::QueryInterface
  319. //
  320. // Description:
  321. // Query this object for the passed in interface.
  322. //
  323. // Arguments:
  324. // riidIn
  325. // Id of interface requested.
  326. //
  327. // ppvOut
  328. // Pointer to the requested interface.
  329. //
  330. // Return Value:
  331. // S_OK
  332. // If the interface is available on this object.
  333. //
  334. // E_NOINTERFACE
  335. // If the interface is not available.
  336. //
  337. // E_POINTER
  338. // ppvOut was NULL.
  339. //
  340. // Remarks:
  341. // None.
  342. //
  343. //--
  344. //////////////////////////////////////////////////////////////////////////////
  345. STDMETHODIMP
  346. CProxyCfgNodeInfo::QueryInterface(
  347. REFIID riidIn
  348. , void ** ppvOut
  349. )
  350. {
  351. TraceQIFunc( riidIn, ppvOut );
  352. HRESULT hr = S_OK;
  353. //
  354. // Validate arguments.
  355. //
  356. Assert( ppvOut != NULL );
  357. if ( ppvOut == NULL )
  358. {
  359. hr = THR( E_POINTER );
  360. goto Cleanup;
  361. }
  362. //
  363. // Handle known interfaces.
  364. //
  365. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  366. {
  367. *ppvOut = static_cast< IClusCfgNodeInfo * >( this );
  368. } // if: IUnknown
  369. else if ( IsEqualIID( riidIn, IID_IClusCfgNodeInfo ) )
  370. {
  371. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgNodeInfo, this, 0 );
  372. } // else if: IClusCfgNodeInfo
  373. else
  374. {
  375. *ppvOut = NULL;
  376. hr = E_NOINTERFACE;
  377. } // else
  378. //
  379. // Add a reference to the interface if successful.
  380. //
  381. if ( SUCCEEDED( hr ) )
  382. {
  383. ((IUnknown *) *ppvOut)->AddRef();
  384. } // if: success
  385. Cleanup:
  386. QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
  387. } //*** CConfigClusApi::QueryInterface
  388. //////////////////////////////////////////////////////////////////////////////
  389. //++
  390. //
  391. // CProxyCfgNodeInfo::AddRef
  392. //
  393. // Description:
  394. // Increment the reference count of this object by one.
  395. //
  396. // Arguments:
  397. // None.
  398. //
  399. // Return Value:
  400. // The new reference count.
  401. //
  402. // Remarks:
  403. // None.
  404. //
  405. //--
  406. //////////////////////////////////////////////////////////////////////////////
  407. STDMETHODIMP_( ULONG )
  408. CProxyCfgNodeInfo::AddRef( void )
  409. {
  410. TraceFunc( "[IUnknown]" );
  411. InterlockedIncrement( &m_cRef );
  412. CRETURN( m_cRef );
  413. } //*** CProxyCfgNodeInfo::AddRef
  414. //////////////////////////////////////////////////////////////////////////////
  415. //++
  416. //
  417. // CProxyCfgNodeInfo::Release
  418. //
  419. // Description:
  420. // Decrement the reference count of this object by one.
  421. //
  422. // Arguments:
  423. // None.
  424. //
  425. // Return Value:
  426. // The new reference count.
  427. //
  428. // Remarks:
  429. // None.
  430. //
  431. //--
  432. //////////////////////////////////////////////////////////////////////////////
  433. STDMETHODIMP_( ULONG )
  434. CProxyCfgNodeInfo::Release( void )
  435. {
  436. TraceFunc( "[IUnknown]" );
  437. LONG cRef;
  438. cRef = InterlockedDecrement( &m_cRef );
  439. if ( cRef == 0 )
  440. {
  441. TraceDo( delete this );
  442. }
  443. CRETURN( cRef );
  444. } //*** CProxyCfgNodeInfo::Release
  445. //*************************************************************************//
  446. /////////////////////////////////////////////////////////////////////////////
  447. // CProxyCfgNodeInfo -- IClusCfgNodeInfo interface.
  448. /////////////////////////////////////////////////////////////////////////////
  449. //
  450. //
  451. //
  452. STDMETHODIMP
  453. CProxyCfgNodeInfo::GetClusterConfigInfo(
  454. IClusCfgClusterInfo ** ppClusCfgClusterInfoOut
  455. )
  456. {
  457. TraceFunc( "[IClusCfgNodeInfo]" );
  458. HRESULT hr;
  459. IUnknown * punk = NULL;
  460. //
  461. // Check parameters.
  462. //
  463. if ( ppClusCfgClusterInfoOut == NULL )
  464. goto InvalidPointer;
  465. //
  466. // Create the cluster object
  467. //
  468. hr = THR( CProxyCfgClusterInfo::S_HrCreateInstance( &punk,
  469. m_punkOuter,
  470. m_phCluster,
  471. m_pclsidMajor,
  472. m_bstrDomain
  473. ) );
  474. if ( FAILED( hr ) )
  475. {
  476. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetClusterConfigInfo_Create_CProxyCfgClusterInfo_Failed, hr );
  477. goto Cleanup;
  478. } // if:
  479. //
  480. // QI for the return interface.
  481. //
  482. hr = THR( punk->TypeSafeQI( IClusCfgClusterInfo, ppClusCfgClusterInfoOut ) );
  483. if ( FAILED( hr ) )
  484. {
  485. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetClusterConfigInfo_QI_Failed, hr );
  486. goto Cleanup;
  487. }
  488. Cleanup:
  489. if ( punk != NULL )
  490. {
  491. punk->Release();
  492. } // if:
  493. HRETURN( hr );
  494. InvalidPointer:
  495. hr = THR( E_POINTER );
  496. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetClusterConfigInfo_InvalidPointer, hr );
  497. goto Cleanup;
  498. } //*** CProxyCfgNodeInfo::GetClusterConfigInfo
  499. //
  500. //
  501. //
  502. STDMETHODIMP
  503. CProxyCfgNodeInfo::GetOSVersion(
  504. DWORD * pdwMajorVersionOut,
  505. DWORD * pdwMinorVersionOut,
  506. WORD * pwSuiteMaskOut,
  507. BYTE * pbProductTypeOut,
  508. BSTR * pbstrCSDVersionOut
  509. )
  510. {
  511. TraceFunc( "[IClusCfgNodeInfo]" );
  512. HRESULT hr;
  513. DWORD sc;
  514. //
  515. // Check parameters.
  516. //
  517. if ( pdwMajorVersionOut == NULL )
  518. {
  519. hr = THR( E_POINTER );
  520. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetOSVersion_InvalidPointer, hr );
  521. goto Cleanup;
  522. }
  523. if ( pdwMinorVersionOut == NULL )
  524. {
  525. hr = THR( E_POINTER );
  526. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetOSVersion_InvalidPointer, hr );
  527. goto Cleanup;
  528. }
  529. if ( pwSuiteMaskOut == NULL )
  530. {
  531. hr = THR( E_POINTER );
  532. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetOSVersion_InvalidPointer, hr );
  533. goto Cleanup;
  534. }
  535. if ( pbProductTypeOut == NULL )
  536. {
  537. hr = THR( E_POINTER );
  538. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetOSVersion_InvalidPointer, hr );
  539. goto Cleanup;
  540. }
  541. if ( pbstrCSDVersionOut == NULL )
  542. {
  543. hr = THR( E_POINTER );
  544. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetOSVersion_InvalidPointer, hr );
  545. goto Cleanup;
  546. }
  547. //
  548. // "Major Version"
  549. //
  550. sc = TW32( m_cplNodeRO.ScMoveToPropertyByName( L"MajorVersion" ) );
  551. if ( sc != ERROR_SUCCESS )
  552. {
  553. hr = HRESULT_FROM_WIN32( sc );
  554. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetOSVersion_ScMoveToPropertyByName_MajorVersion_Failed, hr );
  555. goto Cleanup;
  556. } // if:
  557. Assert( m_cplNodeRO.CbhCurrentValue().pSyntax->dw == CLUSPROP_SYNTAX_LIST_VALUE_DWORD );
  558. *pdwMajorVersionOut = *m_cplNodeRO.CbhCurrentValue().pdw;
  559. //
  560. // "Minor Version"
  561. //
  562. sc = TW32( m_cplNodeRO.ScMoveToPropertyByName( L"MinorVersion" ) );
  563. if ( sc != ERROR_SUCCESS )
  564. {
  565. hr = HRESULT_FROM_WIN32( sc );
  566. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetOSVersion_ScMoveToPropertyByName_MinorVersion_Failed, hr );
  567. goto Cleanup;
  568. } // if:
  569. Assert( m_cplNodeRO.CbhCurrentValue().pSyntax->dw == CLUSPROP_SYNTAX_LIST_VALUE_DWORD );
  570. *pdwMinorVersionOut = *m_cplNodeRO.CbhCurrentValue().pdw;
  571. //
  572. // "CSD Version"
  573. //
  574. sc = TW32( m_cplNodeRO.ScMoveToPropertyByName( L"CSDVersion" ) );
  575. if ( sc != ERROR_SUCCESS )
  576. {
  577. hr = HRESULT_FROM_WIN32( sc );
  578. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetOSVersion_ScMoveToPropertyByName_CSDVersion_Failed, hr );
  579. goto Cleanup;
  580. } // if:
  581. Assert( m_cplNodeRO.CbhCurrentValue().pSyntax->dw == CLUSPROP_SYNTAX_LIST_VALUE_SZ );
  582. *pbstrCSDVersionOut = SysAllocString( m_cplNodeRO.CbhCurrentValue().pStringValue->sz );
  583. if ( *pbstrCSDVersionOut == NULL )
  584. {
  585. hr = THR( E_OUTOFMEMORY );
  586. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetOSVersion_OutOfMemory, hr );
  587. goto Cleanup;
  588. }
  589. //
  590. // Stuff we can't gather (yet?)
  591. //
  592. *pwSuiteMaskOut = 0;
  593. *pbProductTypeOut = 0;
  594. hr = S_OK;
  595. Cleanup:
  596. HRETURN( hr );
  597. } //*** CProxyCfgNodeInfo::GetOSVersion
  598. //
  599. //
  600. //
  601. STDMETHODIMP
  602. CProxyCfgNodeInfo::GetName(
  603. BSTR * pbstrNameOut
  604. )
  605. {
  606. TraceFunc( "[IClusCfgNodeInfo]" );
  607. HRESULT hr = S_OK;
  608. DWORD sc = ERROR_SUCCESS;
  609. BSTR bstrHostName = NULL;
  610. BSTR bstrNodeFQDN = NULL;
  611. if ( pbstrNameOut == NULL )
  612. {
  613. hr = THR( E_POINTER );
  614. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_W2kProxy_NodeInfo_GetName_InvalidPointer, hr );
  615. goto Cleanup;
  616. }
  617. sc = TW32( m_cplNodeRO.ScMoveToPropertyByName( L"NodeName" ) );
  618. if ( sc != ERROR_SUCCESS )
  619. {
  620. hr = HRESULT_FROM_WIN32( sc );
  621. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetOSVersion_ScMoveToPropertyByName_MinorVersion_Failed, hr );
  622. goto Cleanup;
  623. } // if:
  624. Assert( m_cplNodeRO.CbhCurrentValue().pSyntax->dw == CLUSPROP_SYNTAX_LIST_VALUE_SZ );
  625. bstrHostName = SysAllocString( m_cplNodeRO.CbhCurrentValue().pStringValue->sz );
  626. if ( bstrHostName == NULL )
  627. {
  628. hr = THR( E_OUTOFMEMORY );
  629. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_W2KProxy_NodeInfo_GetName_OutOfMemory, hr );
  630. goto Cleanup;
  631. }
  632. hr = THR( HrMakeFQN( bstrHostName, m_bstrDomain, true, &bstrNodeFQDN ) );
  633. if ( FAILED( hr ) )
  634. {
  635. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_W2KProxy_NodeInfo_GetName_HrMakeFQN_Failed, hr );
  636. goto Cleanup;
  637. }
  638. *pbstrNameOut = bstrNodeFQDN;
  639. TraceMemoryDelete( bstrNodeFQDN, false ); // prevent false reports of memory leaks
  640. bstrNodeFQDN = NULL;
  641. Cleanup:
  642. TraceSysFreeString( bstrHostName );
  643. TraceSysFreeString( bstrNodeFQDN );
  644. HRETURN( hr );
  645. } //*** CProxyCfgNodeInfo::GetName
  646. //
  647. //
  648. //
  649. STDMETHODIMP
  650. CProxyCfgNodeInfo::IsMemberOfCluster( void )
  651. {
  652. TraceFunc( "[IClusCfgNodeInfo]" );
  653. HRESULT hr = S_OK;
  654. HRETURN( hr );
  655. } //*** CProxyCfgNodeInfo::IsMemberOfCluster
  656. //
  657. //
  658. //
  659. STDMETHODIMP
  660. CProxyCfgNodeInfo::GetClusterVersion(
  661. DWORD * pdwNodeHighestVersionOut,
  662. DWORD * pdwNodeLowestVersionOut
  663. )
  664. {
  665. TraceFunc( "[IClusCfgNodeInfo]" );
  666. HRESULT hr = S_OK;
  667. BSTR bstrClusterName = NULL;
  668. CLUSTERVERSIONINFO ClusInfo;
  669. if ( pdwNodeHighestVersionOut == NULL )
  670. goto InvalidPointer;
  671. if ( pdwNodeLowestVersionOut == NULL )
  672. goto InvalidPointer;
  673. // Initialize variables.
  674. ClusInfo.dwVersionInfoSize = sizeof(CLUSTERVERSIONINFO);
  675. hr = THR( HrGetClusterInformation( *m_phCluster, &bstrClusterName, &ClusInfo ) );
  676. if ( FAILED( hr ) )
  677. {
  678. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetClusterInformation_Failed, hr );
  679. goto Cleanup;
  680. }
  681. *pdwNodeHighestVersionOut = ClusInfo.dwClusterHighestVersion;
  682. *pdwNodeLowestVersionOut = ClusInfo.dwClusterLowestVersion;
  683. Cleanup:
  684. TraceSysFreeString( bstrClusterName );
  685. HRETURN( hr );
  686. InvalidPointer:
  687. hr = THR( E_POINTER );
  688. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetClusterVersion_InvalidPointer, hr );
  689. goto Cleanup;
  690. } //*** CProxyCfgNodeInfo::GetClusterVersion
  691. //
  692. //
  693. //
  694. STDMETHODIMP
  695. CProxyCfgNodeInfo::GetDriveLetterMappings(
  696. SDriveLetterMapping * pdlmDriveLetterUsageOut
  697. )
  698. {
  699. TraceFunc( "[IClusCfgNodeInfo]" );
  700. HRESULT hr = S_OK;
  701. if ( pdlmDriveLetterUsageOut == NULL )
  702. goto InvalidPointer;
  703. //
  704. // NOTE: This really does not do anything (yet). Just clear the array.
  705. //
  706. ZeroMemory( pdlmDriveLetterUsageOut, sizeof(*pdlmDriveLetterUsageOut) );
  707. Cleanup:
  708. HRETURN( hr );
  709. InvalidPointer:
  710. hr = THR( E_POINTER );
  711. SSR_W2KPROXY_STATUS( TASKID_Major_Client_And_Server_Log, TASKID_Minor_GetDriveLetterMappings_InvalidPointer, hr );
  712. goto Cleanup;
  713. } //*** CProxyCfgNodeInfo::GetDriveLetterMappings
  714. //
  715. //
  716. //
  717. STDMETHODIMP
  718. CProxyCfgNodeInfo::SetName( LPCWSTR pcszNameIn )
  719. {
  720. TraceFunc1( "[IClusCfgNodeInfo] pcszNameIn = '%ls'", pcszNameIn );
  721. HRESULT hr = S_FALSE;
  722. AssertMsg( FALSE, "Why is someone calling this?" );
  723. HRETURN( hr );
  724. } //*** CProxyCfgNodeInfo::SetName
  725. //////////////////////////////////////////////////////////////////////////////
  726. //++
  727. //
  728. // CProxyCfgNodeInfo::GetMaxNodeCount
  729. //
  730. // Description:
  731. // Returns the maximun number of nodes for this node's product
  732. // suite type.
  733. //
  734. // Notes:
  735. //
  736. // Parameter:
  737. // pcMaxNodesOut
  738. // The maximum number of nodes allowed by this node's product
  739. // suite type.
  740. //
  741. // Return Value:
  742. // S_OK
  743. // Success.
  744. //
  745. // other HRESULT
  746. // The call failed.
  747. //
  748. //--
  749. //////////////////////////////////////////////////////////////////////////////
  750. STDMETHODIMP
  751. CProxyCfgNodeInfo::GetMaxNodeCount(
  752. DWORD * pcMaxNodesOut
  753. )
  754. {
  755. TraceFunc( "[IClusCfgNodeInfo]" );
  756. HRESULT hr = S_OK;
  757. if ( pcMaxNodesOut == NULL )
  758. {
  759. hr = THR( E_POINTER );
  760. goto Cleanup;
  761. } // if:
  762. //
  763. // TODO: 11-OCT-2001 GalenB
  764. //
  765. // Need to figure out the correct max nodes for the suite type
  766. // of the Win2K node that we are proxying for. Since we are
  767. // not running on the node this could be hard.
  768. //
  769. hr = S_FALSE;
  770. Cleanup:
  771. HRETURN( hr );
  772. } //*** CProxyCfgNodeInfo::GetMaxNodeCount
  773. //////////////////////////////////////////////////////////////////////////////
  774. //++
  775. //
  776. // CProxyCfgNodeInfo::GetProcessorInfo
  777. //
  778. // Description:
  779. // Get the processor information for this node.
  780. //
  781. // Arguments:
  782. // pwProcessorArchitectureOut
  783. // The processor architecture.
  784. //
  785. // pwProcessorLevelOut
  786. // The processor type.
  787. //
  788. // Return Value:
  789. // S_OK
  790. // Success.
  791. //
  792. // other HRESULT
  793. // The call failed.
  794. //
  795. // Remarks:
  796. // See SYSTEM_INFO in MSDN and/or the Platform SDK for more
  797. // information.
  798. //
  799. //--
  800. //////////////////////////////////////////////////////////////////////////////
  801. STDMETHODIMP
  802. CProxyCfgNodeInfo::GetProcessorInfo(
  803. WORD * pwProcessorArchitectureOut
  804. , WORD * pwProcessorLevelOut
  805. )
  806. {
  807. TraceFunc( "[IClusCfgNodeInfo]" );
  808. HRESULT hr = S_OK;
  809. if ( ( pwProcessorArchitectureOut == NULL ) && ( pwProcessorLevelOut == NULL ) )
  810. {
  811. hr = THR( E_POINTER );
  812. goto Cleanup;
  813. } // if:
  814. hr = S_FALSE;
  815. Cleanup:
  816. HRETURN( hr );
  817. } //*** CProxyCfgNodeInfo::GetProcessorInfo
  818. //****************************************************************************
  819. //
  820. // IClusCfgCallback
  821. //
  822. //****************************************************************************
  823. //////////////////////////////////////////////////////////////////////////////
  824. //++
  825. //
  826. // CProxyCfgNodeInfo::SendStatusReport
  827. //
  828. // Description:
  829. //
  830. // Arguments:
  831. //
  832. // Return Value:
  833. //
  834. // Remarks:
  835. // None.
  836. //
  837. //--
  838. //////////////////////////////////////////////////////////////////////////////
  839. STDMETHODIMP
  840. CProxyCfgNodeInfo::SendStatusReport(
  841. LPCWSTR pcszNodeNameIn
  842. , CLSID clsidTaskMajorIn
  843. , CLSID clsidTaskMinorIn
  844. , ULONG ulMinIn
  845. , ULONG ulMaxIn
  846. , ULONG ulCurrentIn
  847. , HRESULT hrStatusIn
  848. , LPCWSTR pcszDescriptionIn
  849. , FILETIME * pftTimeIn
  850. , LPCWSTR pcszReferenceIn
  851. )
  852. {
  853. TraceFunc( "[IClusCfgCallback]" );
  854. HRESULT hr = S_OK;
  855. if ( m_pcccb != NULL )
  856. {
  857. hr = THR( m_pcccb->SendStatusReport( pcszNodeNameIn,
  858. clsidTaskMajorIn,
  859. clsidTaskMinorIn,
  860. ulMinIn,
  861. ulMaxIn,
  862. ulCurrentIn,
  863. hrStatusIn,
  864. pcszDescriptionIn,
  865. pftTimeIn,
  866. pcszReferenceIn
  867. ) );
  868. } // if:
  869. HRETURN( hr );
  870. } //*** CProxyCfgNodeInfo::SendStatusReport
  871. //****************************************************************************
  872. //
  873. // Privates
  874. //
  875. //****************************************************************************
  876. //
  877. //
  878. //
  879. DWORD
  880. CProxyCfgNodeInfo::DwEnumResourcesExCallback(
  881. HCLUSTER hClusterIn,
  882. HRESOURCE hResourceSelfIn,
  883. HRESOURCE hResourceIn,
  884. PVOID pvIn
  885. )
  886. {
  887. TraceFunc( "" );
  888. DWORD sc;
  889. DWORD dwFlags;
  890. DWORD cchName;
  891. CLUSTER_RESOURCE_STATE state;
  892. BSTR bstrName = NULL;
  893. CProxyCfgNodeInfo * pthis = reinterpret_cast< CProxyCfgNodeInfo * >( pvIn );
  894. sc = TW32( ClusterResourceControl( hResourceIn,
  895. NULL,
  896. CLUSCTL_RESOURCE_GET_FLAGS,
  897. NULL,
  898. 0,
  899. &dwFlags,
  900. sizeof(dwFlags),
  901. NULL
  902. ) );
  903. if ( sc != ERROR_SUCCESS )
  904. goto Cleanup;
  905. if ( ( dwFlags & CLUS_FLAG_CORE ) == 0 )
  906. {
  907. Assert( sc == ERROR_SUCCESS );
  908. goto Cleanup;
  909. }
  910. cchName = 64; // arbitary size
  911. bstrName = TraceSysAllocStringLen( NULL, cchName );
  912. if ( bstrName == NULL )
  913. {
  914. sc = TW32( ERROR_NOT_ENOUGH_MEMORY );
  915. goto Cleanup;
  916. }
  917. cchName ++; // SysAllocStringLen allocate cchName + 1
  918. state = GetClusterResourceState( hResourceIn, bstrName, &cchName, NULL, NULL );
  919. if ( state == ClusterResourceStateUnknown )
  920. {
  921. sc = TW32( GetLastError() );
  922. if ( sc == ERROR_MORE_DATA )
  923. {
  924. TraceSysFreeString( bstrName );
  925. bstrName = TraceSysAllocStringLen( NULL, cchName );
  926. if ( bstrName == NULL )
  927. {
  928. sc = TW32( ERROR_NOT_ENOUGH_MEMORY );
  929. goto Cleanup;
  930. }
  931. cchName ++; // SysAllocStringLen allocate cchName + 1
  932. state = GetClusterResourceState( hResourceIn, bstrName, &cchName, NULL, NULL );
  933. if ( state == ClusterResourceStateUnknown )
  934. {
  935. sc = TW32( GetLastError() );
  936. goto Cleanup;
  937. }
  938. }
  939. else
  940. {
  941. goto Cleanup;
  942. }
  943. } // if: unknown resource state
  944. pthis->m_hNode = OpenClusterNode( hClusterIn, bstrName );
  945. if ( pthis->m_hNode == NULL )
  946. {
  947. sc = TW32( GetLastError() );
  948. goto Cleanup;
  949. }
  950. sc = ERROR_SUCCESS;
  951. Cleanup:
  952. TraceSysFreeString( bstrName );
  953. RETURN( sc );
  954. } //*** CProxyCfgNodeInfo::DwEnumResourcesExCallback