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.

1446 lines
33 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // CClusCfgPartitionInfo.cpp
  7. //
  8. // Description:
  9. // This file contains the definition of the CClusCfgPartitionInfo
  10. // class.
  11. //
  12. // The class CClusCfgPartitionInfo represents a disk partition.
  13. // It implements the IClusCfgPartitionInfo interface.
  14. //
  15. // Documentation:
  16. //
  17. // Header File:
  18. // CClusCfgPartitionInfo.h
  19. //
  20. // Maintained By:
  21. // Galen Barbee (GalenB) 05-JUN-2000
  22. //
  23. //////////////////////////////////////////////////////////////////////////////
  24. //////////////////////////////////////////////////////////////////////////////
  25. // Include Files
  26. //////////////////////////////////////////////////////////////////////////////
  27. #include "pch.h"
  28. #include "CClusCfgPartitionInfo.h"
  29. #include <StdIo.h>
  30. //////////////////////////////////////////////////////////////////////////////
  31. // Constant Definitions
  32. //////////////////////////////////////////////////////////////////////////////
  33. DEFINE_THISCLASS( "CClusCfgPartitionInfo" );
  34. //*************************************************************************//
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CClusCfgPartitionInfo class
  37. /////////////////////////////////////////////////////////////////////////////
  38. //////////////////////////////////////////////////////////////////////////////
  39. //++
  40. //
  41. // CClusCfgPartitionInfo::S_HrCreateInstance()
  42. //
  43. // Description:
  44. // Create a CClusCfgPartitionInfo instance.
  45. //
  46. // Arguments:
  47. // None.
  48. //
  49. // Return Values:
  50. // Pointer to CClusCfgPartitionInfo instance.
  51. //
  52. //--
  53. //////////////////////////////////////////////////////////////////////////////
  54. HRESULT
  55. CClusCfgPartitionInfo::S_HrCreateInstance( IUnknown ** ppunkOut )
  56. {
  57. TraceFunc( "" );
  58. HRESULT hr;
  59. CClusCfgPartitionInfo * lpccs = NULL;
  60. if ( ppunkOut == NULL )
  61. {
  62. hr = THR( E_POINTER );
  63. goto Cleanup;
  64. } // if:
  65. lpccs = new CClusCfgPartitionInfo();
  66. if ( lpccs == NULL )
  67. {
  68. hr = THR( E_OUTOFMEMORY );
  69. goto Cleanup;
  70. } // if: error allocating object
  71. hr = THR( lpccs->HrInit() );
  72. if ( FAILED( hr ) )
  73. {
  74. goto Cleanup;
  75. } // if: HrInit() failed
  76. hr = THR( lpccs->TypeSafeQI( IUnknown, ppunkOut ) );
  77. Cleanup:
  78. if ( FAILED( hr ) )
  79. {
  80. LogMsg( L"[SRV] CClusCfgPartitionInfo::S_HrCreateInstance() failed. (hr = %#08x)", hr );
  81. } // if:
  82. if ( lpccs != NULL )
  83. {
  84. lpccs->Release();
  85. } // if:
  86. HRETURN( hr );
  87. } //*** CClusCfgPartitionInfo::S_HrCreateInstance()
  88. //////////////////////////////////////////////////////////////////////////////
  89. //++
  90. //
  91. // CClusCfgPartitionInfo::CClusCfgPartitionInfo()
  92. //
  93. // Description:
  94. // Constructor of the CClusCfgPartitionInfo class. This initializes
  95. // the m_cRef variable to 1 instead of 0 to account of possible
  96. // QueryInterface failure in DllGetClassObject.
  97. //
  98. // Arguments:
  99. // None.
  100. //
  101. // Return Value:
  102. // None.
  103. //
  104. // Remarks:
  105. // None.
  106. //
  107. //--
  108. //////////////////////////////////////////////////////////////////////////////
  109. CClusCfgPartitionInfo::CClusCfgPartitionInfo( void )
  110. : m_cRef( 1 )
  111. {
  112. TraceFunc( "" );
  113. // Increment the count of components in memory so the DLL hosting this
  114. // object cannot be unloaded.
  115. InterlockedIncrement( &g_cObjects );
  116. Assert( m_pIWbemServices == NULL );
  117. Assert( m_bstrName == NULL );
  118. Assert( m_bstrDescription == NULL );
  119. Assert( m_bstrUID == NULL );
  120. Assert( m_prgLogicalDisks == NULL );
  121. Assert( m_idxNextLogicalDisk == 0 );
  122. Assert( m_ulPartitionSize == 0 );
  123. Assert( m_picccCallback == NULL );
  124. TraceFuncExit();
  125. } //*** CClusCfgPartitionInfo::CClusCfgPartitionInfo
  126. //////////////////////////////////////////////////////////////////////////////
  127. //++
  128. //
  129. // CClusCfgPartitionInfo::~CClusCfgPartitionInfo()
  130. //
  131. // Description:
  132. // Desstructor of the CClusCfgPartitionInfo class.
  133. //
  134. // Arguments:
  135. // None.
  136. //
  137. // Return Value:
  138. // None.
  139. //
  140. // Remarks:
  141. // None.
  142. //
  143. //--
  144. //////////////////////////////////////////////////////////////////////////////
  145. CClusCfgPartitionInfo::~CClusCfgPartitionInfo( void )
  146. {
  147. TraceFunc( "" );
  148. ULONG idx;
  149. TraceSysFreeString( m_bstrName );
  150. TraceSysFreeString( m_bstrDescription );
  151. TraceSysFreeString( m_bstrUID );
  152. for ( idx = 0; idx < m_idxNextLogicalDisk; idx++ )
  153. {
  154. ((*m_prgLogicalDisks)[ idx ])->Release();
  155. } // for:
  156. TraceFree( m_prgLogicalDisks );
  157. if ( m_pIWbemServices != NULL )
  158. {
  159. m_pIWbemServices->Release();
  160. } // if:
  161. if ( m_picccCallback != NULL )
  162. {
  163. m_picccCallback->Release();
  164. } // if:
  165. // There's going to be one less component in memory. Decrement component count.
  166. InterlockedDecrement( &g_cObjects );
  167. TraceFuncExit();
  168. } //*** CClusCfgPartitionInfo::~CClusCfgPartitionInfo
  169. //*************************************************************************//
  170. /////////////////////////////////////////////////////////////////////////////
  171. // CClusCfgPartitionInfo -- IUknkown interface.
  172. /////////////////////////////////////////////////////////////////////////////
  173. //////////////////////////////////////////////////////////////////////////////
  174. //++
  175. //
  176. // STDMETHODIMP_( ULONG )
  177. // CClusCfgPartitionInfo:: [IUNKNOWN] AddRef()
  178. //
  179. // Description:
  180. // Increment the reference count of this object by one.
  181. //
  182. // Arguments:
  183. // None.
  184. //
  185. // Return Value:
  186. // The new reference count.
  187. //
  188. // Remarks:
  189. // None.
  190. //
  191. //--
  192. //////////////////////////////////////////////////////////////////////////////
  193. STDMETHODIMP_( ULONG )
  194. CClusCfgPartitionInfo::AddRef( void )
  195. {
  196. TraceFunc( "[IUnknown]" );
  197. InterlockedIncrement( & m_cRef );
  198. RETURN( m_cRef );
  199. } //*** CClusCfgPartitionInfo::AddRef()
  200. //////////////////////////////////////////////////////////////////////////////
  201. //++
  202. //
  203. // STDMETHODIMP_( ULONG )
  204. // CClusCfgPartitionInfo:: [IUNKNOWN] Release()
  205. //
  206. // Description:
  207. // Decrement the reference count of this object by one.
  208. //
  209. // Arguments:
  210. // None.
  211. //
  212. // Return Value:
  213. // The new reference count.
  214. //
  215. // Remarks:
  216. // None.
  217. //
  218. //--
  219. //////////////////////////////////////////////////////////////////////////////
  220. STDMETHODIMP_( ULONG )
  221. CClusCfgPartitionInfo::Release( void )
  222. {
  223. TraceFunc( "[IUnknown]" );
  224. LONG cRef;
  225. cRef = InterlockedDecrement( &m_cRef );
  226. if ( cRef == 0 )
  227. {
  228. TraceDo( delete this );
  229. } // if: reference count equal to zero
  230. RETURN( cRef );
  231. } //*** CClusCfgPartitionInfo::Release()
  232. //////////////////////////////////////////////////////////////////////////////
  233. //++
  234. //
  235. // CClusCfgPartitionInfo:: [INKNOWN] QueryInterface()
  236. //
  237. // Description:
  238. // Query this object for the passed in interface.
  239. //
  240. // Arguments:
  241. // IN REFIID riid,
  242. // Id of interface requested.
  243. //
  244. // OUT void ** ppv
  245. // Pointer to the requested interface.
  246. //
  247. // Return Value:
  248. // S_OK
  249. // If the interface is available on this object.
  250. //
  251. // E_NOINTERFACE
  252. // If the interface is not available.
  253. //
  254. // Remarks:
  255. // None.
  256. //
  257. //--
  258. //////////////////////////////////////////////////////////////////////////////
  259. STDMETHODIMP
  260. CClusCfgPartitionInfo::QueryInterface( REFIID riid, void ** ppv )
  261. {
  262. TraceQIFunc( riid, ppv );
  263. HRESULT hr = E_NOINTERFACE;
  264. if ( IsEqualIID( riid, IID_IUnknown ) )
  265. {
  266. *ppv = static_cast< IClusCfgPartitionInfo * >( this );
  267. hr = S_OK;
  268. } // if: IUnknown
  269. else if ( IsEqualIID( riid, IID_IClusCfgPartitionInfo ) )
  270. {
  271. *ppv = TraceInterface( __THISCLASS__, IClusCfgPartitionInfo, this, 0 );
  272. hr = S_OK;
  273. } // else if:
  274. else if ( IsEqualIID( riid, IID_IClusCfgWbemServices ) )
  275. {
  276. *ppv = TraceInterface( __THISCLASS__, IClusCfgWbemServices, this, 0 );
  277. hr = S_OK;
  278. } // else if:
  279. else if ( IsEqualIID( riid, IID_IClusCfgInitialize ) )
  280. {
  281. *ppv = TraceInterface( __THISCLASS__, IClusCfgInitialize, this, 0 );
  282. hr = S_OK;
  283. } // else if:
  284. else if ( IsEqualIID( riid, IID_IClusCfgPartitionProperties ) )
  285. {
  286. *ppv = TraceInterface( __THISCLASS__, IClusCfgPartitionProperties, this, 0 );
  287. hr = S_OK;
  288. } // else if:
  289. else if ( IsEqualIID( riid, IID_IClusCfgSetWbemObject ) )
  290. {
  291. *ppv = TraceInterface( __THISCLASS__, IClusCfgSetWbemObject, this, 0 );
  292. hr = S_OK;
  293. } // else if:
  294. if ( SUCCEEDED( hr ) )
  295. {
  296. ((IUnknown *) *ppv)->AddRef( );
  297. } // if: success
  298. QIRETURN_IGNORESTDMARSHALLING( hr, riid );
  299. } //*** CClusCfgPartitionInfo::QueryInterface()
  300. //*************************************************************************//
  301. /////////////////////////////////////////////////////////////////////////////
  302. // CClusCfgPartitionInfo -- IClusCfgWbemServices interface.
  303. /////////////////////////////////////////////////////////////////////////////
  304. //////////////////////////////////////////////////////////////////////////////
  305. //++
  306. //
  307. // CClusCfgPartitionInfo::SetWbemServices()
  308. //
  309. // Description:
  310. // Set the WBEM services provider.
  311. //
  312. // Arguments:
  313. // IN IWbemServices pIWbemServicesIn
  314. //
  315. // Return Value:
  316. // S_OK
  317. // Success
  318. //
  319. // E_POINTER
  320. // The pIWbemServicesIn param is NULL.
  321. //
  322. // Remarks:
  323. // None.
  324. //
  325. //--
  326. //////////////////////////////////////////////////////////////////////////////
  327. STDMETHODIMP
  328. CClusCfgPartitionInfo::SetWbemServices( IWbemServices * pIWbemServicesIn )
  329. {
  330. TraceFunc( "[IClusCfgWbemServices]" );
  331. HRESULT hr = S_OK;
  332. if ( pIWbemServicesIn == NULL )
  333. {
  334. hr = THR( E_POINTER );
  335. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_SetWbemServices_Partition, IDS_ERROR_NULL_POINTER, hr );
  336. goto Cleanup;
  337. } // if:
  338. m_pIWbemServices = pIWbemServicesIn;
  339. m_pIWbemServices->AddRef();
  340. Cleanup:
  341. HRETURN( hr );
  342. } //*** CClusCfgPartitionInfo::SetWbemServices()
  343. //*************************************************************************//
  344. /////////////////////////////////////////////////////////////////////////////
  345. // CClusCfgPartitionInfo -- IClusCfgPartitionInfo interface.
  346. /////////////////////////////////////////////////////////////////////////////
  347. //////////////////////////////////////////////////////////////////////////////
  348. //++
  349. //
  350. // CClusCfgPartitionInfo::GetUID()
  351. //
  352. // Description:
  353. //
  354. // Arguments:
  355. //
  356. // Return Value:
  357. //
  358. // Remarks:
  359. // None.
  360. //
  361. //--
  362. //////////////////////////////////////////////////////////////////////////////
  363. STDMETHODIMP
  364. CClusCfgPartitionInfo::GetUID( BSTR * pbstrUIDOut )
  365. {
  366. TraceFunc( "[IClusCfgPartitionInfo]" );
  367. HRESULT hr = S_OK;
  368. if ( pbstrUIDOut == NULL )
  369. {
  370. hr = THR( E_POINTER );
  371. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_PartitionInfo_GetUID_Pointer, IDS_ERROR_NULL_POINTER, hr );
  372. goto Cleanup;
  373. } // if:
  374. *pbstrUIDOut = SysAllocString( m_bstrUID );
  375. if ( *pbstrUIDOut == NULL )
  376. {
  377. hr = THR( E_OUTOFMEMORY );
  378. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_PartitionInfo_GetUID_Memory, IDS_ERROR_OUTOFMEMORY, hr );
  379. } // if:
  380. Cleanup:
  381. HRETURN( hr );
  382. } //*** CClusCfgPartitionInfo::GetUID()
  383. //////////////////////////////////////////////////////////////////////////////
  384. //++
  385. //
  386. // CClusCfgPartitionInfo::GetName()
  387. //
  388. // Description:
  389. //
  390. // Arguments:
  391. //
  392. // Return Value:
  393. //
  394. // Remarks:
  395. // None.
  396. //
  397. //--
  398. //////////////////////////////////////////////////////////////////////////////
  399. STDMETHODIMP
  400. CClusCfgPartitionInfo::GetName( BSTR * pbstrNameOut )
  401. {
  402. TraceFunc( "[IClusCfgPartitionInfo]" );
  403. HRESULT hr = S_OK;
  404. if ( pbstrNameOut == NULL )
  405. {
  406. hr = THR( E_POINTER );
  407. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_PartitionInfo_GetName_Pointer, IDS_ERROR_NULL_POINTER, hr );
  408. goto Cleanup;
  409. } // if:
  410. *pbstrNameOut = SysAllocString( m_bstrName );
  411. if (*pbstrNameOut == NULL )
  412. {
  413. hr = THR( E_OUTOFMEMORY );
  414. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_GetName_Memory, IDS_ERROR_OUTOFMEMORY, hr );
  415. } // if:
  416. Cleanup:
  417. HRETURN( hr );
  418. } //*** CClusCfgPartitionInfo::GetName()
  419. //////////////////////////////////////////////////////////////////////////////
  420. //++
  421. //
  422. // CClusCfgPartitionInfo::SetName()
  423. //
  424. // Description:
  425. //
  426. // Arguments:
  427. //
  428. // Return Value:
  429. //
  430. // Remarks:
  431. // None.
  432. //
  433. //--
  434. //////////////////////////////////////////////////////////////////////////////
  435. STDMETHODIMP
  436. CClusCfgPartitionInfo::SetName( LPCWSTR pcszNameIn )
  437. {
  438. TraceFunc1( "[IClusCfgPartitionInfo] pcszNameIn = '%ls'", pcszNameIn == NULL ? L"<null>" : pcszNameIn );
  439. HRESULT hr = THR( E_NOTIMPL );
  440. HRETURN( hr );
  441. } //*** CClusCfgPartitionInfo::SetName()
  442. //////////////////////////////////////////////////////////////////////////////
  443. //++
  444. //
  445. // CClusCfgPartitionInfo::GetDescription()
  446. //
  447. // Description:
  448. //
  449. // Arguments:
  450. //
  451. // Return Value:
  452. //
  453. // Remarks:
  454. // None.
  455. //
  456. //--
  457. //////////////////////////////////////////////////////////////////////////////
  458. STDMETHODIMP
  459. CClusCfgPartitionInfo::GetDescription( BSTR * pbstrDescriptionOut )
  460. {
  461. TraceFunc( "[IClusCfgPartitionInfo]" );
  462. HRESULT hr = S_OK;
  463. if ( pbstrDescriptionOut == NULL )
  464. {
  465. hr = THR( E_POINTER );
  466. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_PartitionInfo_GetDescription_Pointer, IDS_ERROR_NULL_POINTER, hr );
  467. goto Cleanup;
  468. } // if:
  469. *pbstrDescriptionOut = SysAllocString( m_bstrDescription );
  470. if (*pbstrDescriptionOut == NULL )
  471. {
  472. hr = THR( E_OUTOFMEMORY );
  473. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_PartitionInfo_GetDescription_Memory, IDS_ERROR_OUTOFMEMORY, hr );
  474. } // if:
  475. Cleanup:
  476. HRETURN( hr );
  477. } //*** CClusCfgPartitionInfo::GetDescription()
  478. //////////////////////////////////////////////////////////////////////////////
  479. //++
  480. //
  481. // CClusCfgPartitionInfo::SetDescription()
  482. //
  483. // Description:
  484. //
  485. // Arguments:
  486. //
  487. // Return Value:
  488. //
  489. // Remarks:
  490. // None.
  491. //
  492. //--
  493. //////////////////////////////////////////////////////////////////////////////
  494. STDMETHODIMP
  495. CClusCfgPartitionInfo::SetDescription( LPCWSTR pcszDescriptionIn )
  496. {
  497. TraceFunc1( "[IClusCfgPartitionInfo] pcszDescriptionIn = '%ls'", pcszDescriptionIn == NULL ? L"<null>" : pcszDescriptionIn );
  498. HRESULT hr;
  499. if ( pcszDescriptionIn == NULL )
  500. {
  501. hr = THR( E_INVALIDARG );
  502. } // if:
  503. else
  504. {
  505. hr = THR( E_NOTIMPL );
  506. } // else:
  507. HRETURN( hr );
  508. } //*** CClusCfgPartitionInfo::SetDescription()
  509. //////////////////////////////////////////////////////////////////////////////
  510. //++
  511. //
  512. // CClusCfgPartitionInfo::GetDriveLetterMappings()
  513. //
  514. // Description:
  515. //
  516. // Arguments:
  517. //
  518. // Return Value:
  519. //
  520. // Remarks:
  521. // None.
  522. //
  523. //--
  524. //////////////////////////////////////////////////////////////////////////////
  525. STDMETHODIMP
  526. CClusCfgPartitionInfo::GetDriveLetterMappings(
  527. SDriveLetterMapping * pdlmDriveLetterMappingOut
  528. )
  529. {
  530. TraceFunc( "[IClusCfgPartitionInfo]" );
  531. HRESULT hr = S_FALSE;
  532. IWbemClassObject * pLogicalDisk = NULL;
  533. VARIANT var;
  534. ULONG idx;
  535. int idxDrive;
  536. if ( pdlmDriveLetterMappingOut == NULL )
  537. {
  538. hr = THR( E_POINTER );
  539. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_GetDriveLetterMappings_Partition, IDS_ERROR_NULL_POINTER, hr );
  540. goto Cleanup;
  541. } // if:
  542. VariantInit( & var );
  543. for ( idx = 0; idx < m_idxNextLogicalDisk; idx++ )
  544. {
  545. hr = THR( ((*m_prgLogicalDisks)[ idx ])->TypeSafeQI( IWbemClassObject, &pLogicalDisk ) );
  546. if ( FAILED( hr ) )
  547. {
  548. goto Cleanup;
  549. } // if:
  550. VariantClear( &var );
  551. hr = THR( HrGetWMIProperty( pLogicalDisk, L"Name", VT_BSTR, &var ) );
  552. if ( FAILED( hr ) )
  553. {
  554. goto Cleanup;
  555. } // if:
  556. CharUpper( var.bstrVal );
  557. idxDrive = var.bstrVal[ 0 ] - 'A';
  558. VariantClear( &var );
  559. hr = THR( HrGetWMIProperty( pLogicalDisk, L"DriveType", VT_I4, &var ) );
  560. if ( FAILED( hr ) )
  561. {
  562. goto Cleanup;
  563. } // if:
  564. pdlmDriveLetterMappingOut->dluDrives[ idx ] = (EDriveLetterUsage) var.iVal;
  565. pLogicalDisk->Release();
  566. pLogicalDisk = NULL;
  567. } // for:
  568. Cleanup:
  569. VariantClear( &var );
  570. if ( pLogicalDisk != NULL )
  571. {
  572. pLogicalDisk->Release();
  573. } // if:
  574. HRETURN( hr );
  575. } //*** CClusCfgPartitionInfo::GetDriveLetterMappings()
  576. //////////////////////////////////////////////////////////////////////////////
  577. //++
  578. //
  579. // CClusCfgPartitionInfo::SetDriveLetterMappings()
  580. //
  581. // Description:
  582. //
  583. // Arguments:
  584. //
  585. // Return Value:
  586. //
  587. // Remarks:
  588. // None.
  589. //
  590. //--
  591. //////////////////////////////////////////////////////////////////////////////
  592. STDMETHODIMP
  593. CClusCfgPartitionInfo::SetDriveLetterMappings(
  594. SDriveLetterMapping dlmDriveLetterMappingIn
  595. )
  596. {
  597. TraceFunc( "[IClusCfgPartitionInfo]" );
  598. HRESULT hr = THR( E_NOTIMPL );
  599. HRETURN( hr );
  600. } //*** CClusCfgPartitionInfo::SetDriveLetterMappings()
  601. //////////////////////////////////////////////////////////////////////////////
  602. //++
  603. //
  604. // CClusCfgPartitionInfo::GetSize()
  605. //
  606. // Description:
  607. //
  608. // Arguments:
  609. //
  610. // Return Value:
  611. //
  612. // Remarks:
  613. // None.
  614. //
  615. //--
  616. //////////////////////////////////////////////////////////////////////////////
  617. STDMETHODIMP
  618. CClusCfgPartitionInfo::GetSize( ULONG * pcMegaBytes )
  619. {
  620. TraceFunc( "[IClusCfgPartitionInfo]" );
  621. HRESULT hr = S_OK;
  622. if ( pcMegaBytes == NULL )
  623. {
  624. hr = THR( E_POINTER );
  625. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_GetSize, IDS_ERROR_NULL_POINTER, hr );
  626. goto Cleanup;
  627. } // if:
  628. *pcMegaBytes = m_ulPartitionSize;
  629. Cleanup:
  630. HRETURN( hr );
  631. } //*** CClusCfgPartitionInfo::GetSize()
  632. //*************************************************************************//
  633. /////////////////////////////////////////////////////////////////////////////
  634. // CClusCfgPartitionInfo class -- Private Methods.
  635. /////////////////////////////////////////////////////////////////////////////
  636. //////////////////////////////////////////////////////////////////////////////
  637. //++
  638. //
  639. // CClusCfgPartitionInfo::SetWbemObject()
  640. //
  641. // Description:
  642. // Initialize this component.
  643. //
  644. // Arguments:
  645. // None.
  646. //
  647. // Return Value:
  648. //
  649. //
  650. // Remarks:
  651. // None.
  652. //
  653. //--
  654. //////////////////////////////////////////////////////////////////////////////
  655. HRESULT
  656. CClusCfgPartitionInfo::SetWbemObject(
  657. IWbemClassObject * pPartitionIn
  658. , bool * pfRetainObjectOut
  659. )
  660. {
  661. TraceFunc( "" );
  662. Assert( pPartitionIn != NULL );
  663. Assert( pfRetainObjectOut != NULL );
  664. HRESULT hr = S_OK;
  665. VARIANT var;
  666. ULONGLONG ull;
  667. VariantInit( &var );
  668. hr = THR( HrGetWMIProperty( pPartitionIn, L"Description", VT_BSTR, &var ) );
  669. if ( FAILED( hr ) )
  670. {
  671. goto Cleanup;
  672. } // if:
  673. m_bstrDescription = TraceSysAllocString( var.bstrVal );
  674. if ( m_bstrDescription == NULL )
  675. {
  676. goto OutOfMemory;
  677. } // if:
  678. VariantClear( &var );
  679. hr = THR( HrGetWMIProperty( pPartitionIn, L"Size", VT_BSTR, &var ) );
  680. if ( FAILED( hr ) )
  681. {
  682. goto Cleanup;
  683. } // if:
  684. swscanf( var.bstrVal, L"%I64u", &ull );
  685. m_ulPartitionSize = (ULONG) ( ull / ( 1024 * 1024 ) );
  686. hr = THR( HrGetLogicalDisks( pPartitionIn ) );
  687. *pfRetainObjectOut = true;
  688. goto Cleanup;
  689. OutOfMemory:
  690. hr = THR( E_OUTOFMEMORY );
  691. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_SetWbemObject_Partition, IDS_ERROR_OUTOFMEMORY, hr );
  692. Cleanup:
  693. VariantClear( &var );
  694. HRETURN( hr );
  695. } //*** CClusCfgPartitionInfo::SetWbemObject()
  696. //*************************************************************************//
  697. /////////////////////////////////////////////////////////////////////////////
  698. // CClusCfgPartitionInfo -- IClusCfgInitialize interface.
  699. /////////////////////////////////////////////////////////////////////////////
  700. //////////////////////////////////////////////////////////////////////////////
  701. //++
  702. //
  703. // CClusCfgPartitionInfo::Initialize()
  704. //
  705. // Description:
  706. // Initialize this component.
  707. //
  708. // Arguments:
  709. // IN IUknown * punkCallbackIn
  710. //
  711. // IN LCID lcidIn
  712. //
  713. // Return Value:
  714. // S_OK
  715. // Success
  716. //
  717. // Remarks:
  718. // None.
  719. //
  720. //--
  721. //////////////////////////////////////////////////////////////////////////////
  722. STDMETHODIMP
  723. CClusCfgPartitionInfo::Initialize(
  724. IUnknown * punkCallbackIn,
  725. LCID lcidIn
  726. )
  727. {
  728. TraceFunc( "[IClusCfgInitialize]" );
  729. Assert( m_picccCallback == NULL );
  730. HRESULT hr = S_OK;
  731. m_lcid = lcidIn;
  732. if ( punkCallbackIn == NULL )
  733. {
  734. hr = THR( E_POINTER );
  735. goto Cleanup;
  736. } // if:
  737. hr = THR( punkCallbackIn->TypeSafeQI( IClusCfgCallback, &m_picccCallback ) );
  738. Cleanup:
  739. HRETURN( hr );
  740. } //*** CClusCfgPartitionInfo::Initialize()
  741. //*************************************************************************//
  742. /////////////////////////////////////////////////////////////////////////////
  743. // CClusCfgPartitionInfo -- IClusCfgPartitionProperties interface.
  744. /////////////////////////////////////////////////////////////////////////////
  745. //////////////////////////////////////////////////////////////////////////////
  746. //++
  747. //
  748. // CClusCfgPartitionInfo::IsThisLogicalDisk()
  749. //
  750. // Description:
  751. // Does this partition have the passed in logical disk?
  752. //
  753. // Arguments:
  754. // None.
  755. //
  756. // Return Value:
  757. // S_OK
  758. // Success, the partition has the logical disk.
  759. //
  760. // S_FALSE
  761. // Success, the partition does not have the logical disk.
  762. //
  763. // Remarks:
  764. // None.
  765. //
  766. //--
  767. //////////////////////////////////////////////////////////////////////////////
  768. STDMETHODIMP
  769. CClusCfgPartitionInfo::IsThisLogicalDisk( WCHAR cLogicalDiskIn )
  770. {
  771. TraceFunc( "[IClusCfgPartitionProperties]" );
  772. HRESULT hr = S_FALSE;
  773. DWORD idx;
  774. IWbemClassObject * piwco = NULL;
  775. VARIANT var;
  776. bool fFoundIt = false;
  777. if ( m_idxNextLogicalDisk == 0 )
  778. {
  779. goto Cleanup;
  780. } // if:
  781. VariantInit( &var );
  782. for ( idx = 0; idx < m_idxNextLogicalDisk; idx++ )
  783. {
  784. hr = THR( ((*m_prgLogicalDisks)[ idx ])->TypeSafeQI( IWbemClassObject, &piwco ) );
  785. if ( FAILED( hr ) )
  786. {
  787. goto Cleanup;
  788. } // if:
  789. hr = THR( HrGetWMIProperty( piwco, L"DeviceID", VT_BSTR, &var ) );
  790. if ( FAILED( hr ) )
  791. {
  792. goto Cleanup;
  793. } // if:
  794. if ( cLogicalDiskIn == var.bstrVal[ 0 ] )
  795. {
  796. fFoundIt = true;
  797. break;
  798. } // if:
  799. VariantClear( &var );
  800. piwco->Release();
  801. piwco = NULL;
  802. } // for:
  803. if ( !fFoundIt )
  804. {
  805. hr = S_FALSE;
  806. } // if:
  807. Cleanup:
  808. VariantClear( &var );
  809. if ( piwco != NULL )
  810. {
  811. piwco->Release();
  812. } // if:
  813. HRETURN( hr );
  814. } //*** CClusCfgPartitionInfo::IsThisLogicalDisk()
  815. //////////////////////////////////////////////////////////////////////////////
  816. //++
  817. //
  818. // CClusCfgPartitionInfo::IsNTFS()
  819. //
  820. // Description:
  821. // Is this an NTFS partition?
  822. //
  823. // Arguments:
  824. // None.
  825. //
  826. // Return Value:
  827. // S_OK
  828. // Success, the partition is NTFS.
  829. //
  830. // S_FALSE
  831. // Success, the partition is not NTFS.
  832. //
  833. // Remarks:
  834. // None.
  835. //
  836. //--
  837. //////////////////////////////////////////////////////////////////////////////
  838. STDMETHODIMP
  839. CClusCfgPartitionInfo::IsNTFS( void )
  840. {
  841. TraceFunc( "[IClusCfgPartitionProperties]" );
  842. HRESULT hr = S_FALSE;
  843. VARIANT var;
  844. ULONG idx;
  845. IWbemClassObject * piwco = NULL;
  846. VariantInit( &var );
  847. for ( idx = 0, hr = S_OK; idx < m_idxNextLogicalDisk; idx++ )
  848. {
  849. hr = THR( ((*m_prgLogicalDisks)[ idx ])->TypeSafeQI( IWbemClassObject, &piwco ) );
  850. if ( FAILED( hr ) )
  851. {
  852. goto Cleanup;
  853. } // if:
  854. VariantClear( &var );
  855. hr = HrGetWMIProperty( piwco, L"FileSystem", VT_BSTR, &var );
  856. if ( ( hr == E_PROPTYPEMISMATCH ) && ( var.vt == VT_NULL ) )
  857. {
  858. VariantClear( &var );
  859. hr = S_FALSE;
  860. THR( HrGetWMIProperty( piwco, L"DeviceID", VT_BSTR, &var ) );
  861. STATUS_REPORT_STRING( TASKID_Major_Find_Devices, TASKID_Minor_Phys_Disk_No_File_System, IDS_ERROR_PHYSDISK_NO_FILE_SYSTEM, var.bstrVal, hr );
  862. break;
  863. } // if:
  864. else if ( FAILED( hr ) )
  865. {
  866. THR( hr );
  867. goto Cleanup;
  868. } // else if:
  869. if ( wcscmp( var.bstrVal, L"NTFS" ) != 0 )
  870. {
  871. VariantClear( &var );
  872. hr = S_FALSE;
  873. THR( HrGetWMIProperty( piwco, L"DeviceID", VT_BSTR, &var ) );
  874. STATUS_REPORT_STRING( TASKID_Major_Find_Devices, TASKID_Minor_Phys_Disk_Not_NTFS, IDS_ERROR_PHYSDISK_NOT_NTFS, var.bstrVal, hr );
  875. break;
  876. } // if:
  877. piwco->Release();
  878. piwco = NULL;
  879. } // for:
  880. Cleanup:
  881. VariantClear( &var );
  882. if ( piwco != NULL )
  883. {
  884. piwco->Release();
  885. } // if:
  886. HRETURN( hr );
  887. } //*** CClusCfgPartitionInfo::IsNTFS()
  888. //////////////////////////////////////////////////////////////////////////////
  889. //++
  890. //
  891. // CClusCfgPartitionInfo::GetFriendlyName()
  892. //
  893. // Description:
  894. // Get the friendly name of this partition. This name will be the
  895. // logical disk names of all logical disks on this partition.
  896. //
  897. // Arguments:
  898. // BSTR * pbstrNameOut
  899. //
  900. // Return Value:
  901. // S_OK
  902. // Success.
  903. //
  904. // Remarks:
  905. // None.
  906. //
  907. //--
  908. //////////////////////////////////////////////////////////////////////////////
  909. STDMETHODIMP
  910. CClusCfgPartitionInfo::GetFriendlyName( BSTR * pbstrNameOut )
  911. {
  912. TraceFunc( "[IClusCfgPartitionProperties]" );
  913. HRESULT hr = S_FALSE;
  914. DWORD idx;
  915. IWbemClassObject * piwco = NULL;
  916. WCHAR * psz = NULL;
  917. WCHAR * pszTmp = NULL;
  918. DWORD cch = 0;
  919. VARIANT var;
  920. if ( m_idxNextLogicalDisk == 0 )
  921. {
  922. goto Cleanup;
  923. } // if:
  924. if ( pbstrNameOut == NULL )
  925. {
  926. hr = THR( E_POINTER );
  927. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_GetFriendlyName, IDS_ERROR_NULL_POINTER, hr );
  928. goto Cleanup;
  929. } // if:
  930. VariantInit( &var );
  931. for ( idx = 0; idx < m_idxNextLogicalDisk; idx++ )
  932. {
  933. hr = THR( ((*m_prgLogicalDisks)[ idx ])->TypeSafeQI( IWbemClassObject, &piwco ) );
  934. if ( FAILED( hr ) )
  935. {
  936. goto Cleanup;
  937. } // if:
  938. hr = THR( HrGetWMIProperty( piwco, L"DeviceID", VT_BSTR, &var ) );
  939. if ( FAILED( hr ) )
  940. {
  941. goto Cleanup;
  942. } // if:
  943. cch += ( UINT ) wcslen( var.bstrVal ) + 2; // a space and the '\0'
  944. pszTmp = (WCHAR *) TraceReAlloc( psz, sizeof( WCHAR ) * cch, HEAP_ZERO_MEMORY );
  945. if ( pszTmp == NULL )
  946. {
  947. goto OutOfMemory;
  948. } // if:
  949. psz = pszTmp;
  950. pszTmp = NULL;
  951. wcscat( psz, L" " );
  952. wcscat( psz, var.bstrVal );
  953. VariantClear( &var );
  954. piwco->Release();
  955. piwco = NULL;
  956. } // for:
  957. *pbstrNameOut = TraceSysAllocString( psz );
  958. if ( *pbstrNameOut == NULL )
  959. {
  960. goto OutOfMemory;
  961. } // if:
  962. goto Cleanup;
  963. OutOfMemory:
  964. hr = THR( E_OUTOFMEMORY );
  965. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_GetFriendlyName, IDS_ERROR_OUTOFMEMORY, hr );
  966. Cleanup:
  967. VariantClear( &var );
  968. if ( piwco != NULL )
  969. {
  970. piwco->Release();
  971. } // if:
  972. if ( psz != NULL )
  973. {
  974. TraceFree( psz );
  975. } // if:
  976. if ( pszTmp != NULL )
  977. {
  978. free( pszTmp );
  979. } // if:
  980. HRETURN( hr );
  981. } //*** CClusCfgPartitionInfo::GetFriendlyName()
  982. //*************************************************************************//
  983. /////////////////////////////////////////////////////////////////////////////
  984. // CClusCfgPartitionInfo class -- Private Methods.
  985. /////////////////////////////////////////////////////////////////////////////
  986. //////////////////////////////////////////////////////////////////////////////
  987. //++
  988. //
  989. // CClusCfgPartitionInfo::HrInit()
  990. //
  991. // Description:
  992. // Initialize this component.
  993. //
  994. // Arguments:
  995. // None.
  996. //
  997. // Return Value:
  998. //
  999. //
  1000. // Remarks:
  1001. // None.
  1002. //
  1003. //--
  1004. //////////////////////////////////////////////////////////////////////////////
  1005. HRESULT
  1006. CClusCfgPartitionInfo::HrInit( void )
  1007. {
  1008. TraceFunc( "" );
  1009. HRESULT hr = S_OK;
  1010. HRETURN( hr );
  1011. } //*** CClusCfgPartitionInfo::HrInit()
  1012. /////////////////////////////////////////////////////////////////////////////
  1013. //++
  1014. //
  1015. // CClusCfgPartitionInfo:HrAddLogicalDiskToArray()
  1016. //
  1017. // Description:
  1018. // Add the passed in logical disk to the array of punks that holds the
  1019. // logical disks.
  1020. //
  1021. // Arguments:
  1022. //
  1023. //
  1024. // Return Value:
  1025. // S_OK
  1026. // Success
  1027. //
  1028. // E_OUTOFMEMORY
  1029. // Couldn't allocate memeory.
  1030. //
  1031. // Remarks:
  1032. // None.
  1033. //
  1034. //--
  1035. //////////////////////////////////////////////////////////////////////////////
  1036. HRESULT
  1037. CClusCfgPartitionInfo::HrAddLogicalDiskToArray( IWbemClassObject * pLogicalDiskIn )
  1038. {
  1039. TraceFunc( "" );
  1040. HRESULT hr = S_OK;
  1041. IUnknown * punk;
  1042. IUnknown * ((*prgpunks)[]) = NULL;
  1043. prgpunks = (IUnknown *((*)[])) TraceReAlloc( m_prgLogicalDisks, sizeof( IUnknown * ) * ( m_idxNextLogicalDisk + 1 ), HEAP_ZERO_MEMORY );
  1044. if ( prgpunks == NULL )
  1045. {
  1046. hr = THR( E_OUTOFMEMORY );
  1047. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_HrAddLogicalDiskToArray, IDS_ERROR_OUTOFMEMORY, hr );
  1048. goto Cleanup;
  1049. } // else:
  1050. m_prgLogicalDisks = prgpunks;
  1051. hr = THR( pLogicalDiskIn->TypeSafeQI( IUnknown, &punk ) );
  1052. if ( SUCCEEDED( hr ) )
  1053. {
  1054. (*m_prgLogicalDisks)[ m_idxNextLogicalDisk++ ] = punk;
  1055. } // if:
  1056. Cleanup:
  1057. HRETURN( hr );
  1058. } //*** CClusCfgPartitionInfo::HrAddLogicalDiskToArray()
  1059. /////////////////////////////////////////////////////////////////////////////
  1060. //++
  1061. //
  1062. // CClusCfgPartitionInfo:HrGetLogicalDisks()
  1063. //
  1064. // Description:
  1065. // Get the logical disks for the passed in partition.
  1066. //
  1067. // Arguments:
  1068. //
  1069. //
  1070. // Return Value:
  1071. // S_OK
  1072. // Success
  1073. //
  1074. // S_FALSE
  1075. // The file system was not NTFS.
  1076. //
  1077. // E_OUTOFMEMORY
  1078. // Couldn't allocate memeory.
  1079. //
  1080. // Remarks:
  1081. // None.
  1082. //
  1083. //--
  1084. //////////////////////////////////////////////////////////////////////////////
  1085. HRESULT
  1086. CClusCfgPartitionInfo::HrGetLogicalDisks(
  1087. IWbemClassObject * pPartitionIn
  1088. )
  1089. {
  1090. TraceFunc( "" );
  1091. HRESULT hr;
  1092. VARIANT var;
  1093. WCHAR szBuf[ 256 ];
  1094. IEnumWbemClassObject * pLogicalDisks = NULL;
  1095. IWbemClassObject * pLogicalDisk = NULL;
  1096. ULONG ulReturned;
  1097. BSTR bstrQuery = NULL;
  1098. BSTR bstrWQL = NULL;
  1099. bstrWQL = TraceSysAllocString( L"WQL" );
  1100. if ( bstrWQL == NULL )
  1101. {
  1102. goto OutOfMemory;
  1103. } // if:
  1104. VariantInit( &var );
  1105. //
  1106. // Need to enum the logical disk(s) of this partition to determine if it is booted
  1107. // bootable.
  1108. //
  1109. hr = THR( HrGetWMIProperty( pPartitionIn, L"DeviceID", VT_BSTR, &var ) );
  1110. if ( FAILED( hr ) )
  1111. {
  1112. goto Cleanup;
  1113. } // if:
  1114. _snwprintf( szBuf, ARRAYSIZE( szBuf ), L"Associators of {Win32_DiskPartition.DeviceID='%s'} where AssocClass=Win32_LogicalDiskToPartition", var.bstrVal );
  1115. bstrQuery = TraceSysAllocString( szBuf );
  1116. if ( bstrQuery == NULL )
  1117. {
  1118. goto OutOfMemory;
  1119. } // if:
  1120. hr = THR( m_pIWbemServices->ExecQuery( bstrWQL, bstrQuery, WBEM_FLAG_FORWARD_ONLY, NULL, &pLogicalDisks ) );
  1121. if ( FAILED( hr ) )
  1122. {
  1123. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_WMI_Logical_Disks_Qry_Failed, IDS_ERROR_WMI_PHYS_DISKS_QRY_FAILED, hr );
  1124. goto Cleanup;
  1125. } // if:
  1126. for ( ; ; )
  1127. {
  1128. hr = pLogicalDisks->Next( WBEM_INFINITE, 1, &pLogicalDisk, &ulReturned );
  1129. if ( ( hr == S_OK ) && ( ulReturned == 1 ) )
  1130. {
  1131. hr = THR( HrAddLogicalDiskToArray( pLogicalDisk ) );
  1132. if ( FAILED( hr ) )
  1133. {
  1134. goto Cleanup;
  1135. } // if:
  1136. pLogicalDisk->Release();
  1137. pLogicalDisk = NULL;
  1138. } // if:
  1139. else if ( ( hr == S_FALSE ) && ( ulReturned == 0 ) )
  1140. {
  1141. hr = S_OK;
  1142. break;
  1143. } // else if:
  1144. else
  1145. {
  1146. STATUS_REPORT_STRING( TASKID_Major_Find_Devices, TASKID_Minor_HrGetLogicalDisks_Next, IDS_ERROR_WQL_QRY_NEXT_FAILED, bstrQuery, hr );
  1147. goto Cleanup;
  1148. } // else:
  1149. } // for:
  1150. goto Cleanup;
  1151. OutOfMemory:
  1152. hr = THR( E_OUTOFMEMORY );
  1153. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_HrGetLogicalDisks, IDS_ERROR_OUTOFMEMORY, hr );
  1154. Cleanup:
  1155. VariantClear( &var );
  1156. TraceSysFreeString( bstrQuery );
  1157. TraceSysFreeString( bstrWQL );
  1158. if ( pLogicalDisk != NULL )
  1159. {
  1160. pLogicalDisk->Release();
  1161. } // if:
  1162. if ( pLogicalDisks != NULL )
  1163. {
  1164. pLogicalDisks->Release();
  1165. } // if:
  1166. HRETURN( hr );
  1167. } //*** CClusCfgPartitionInfo::HrGetLogicalDisks()