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.

635 lines
15 KiB

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // Partition.cpp
  7. //
  8. // Description:
  9. // Implementation of the cluster disk partition class for the MSCLUS
  10. // automation classes.
  11. //
  12. // Author:
  13. // Galen Barbee (galenb) 10-Feb-1999
  14. //
  15. // Revision History:
  16. //
  17. // Notes:
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Partition.h"
  22. /////////////////////////////////////////////////////////////////////////////
  23. // Global variables
  24. /////////////////////////////////////////////////////////////////////////////
  25. static const IID * iidCClusPartition[] =
  26. {
  27. &IID_ISClusPartition
  28. };
  29. static const IID * iidCClusPartitions[] =
  30. {
  31. &IID_ISClusPartitions
  32. };
  33. //*************************************************************************//
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CClusPartition class
  36. /////////////////////////////////////////////////////////////////////////////
  37. /////////////////////////////////////////////////////////////////////////////
  38. //++
  39. //
  40. // CClusPartition::CClusPartition
  41. //
  42. // Description:
  43. // Constructor.
  44. //
  45. // Arguments:
  46. // None.
  47. //
  48. // Return Value:
  49. // None.
  50. //
  51. //--
  52. /////////////////////////////////////////////////////////////////////////////
  53. CClusPartition::CClusPartition( void )
  54. {
  55. m_piids = (const IID *) iidCClusPartition;
  56. m_piidsSize = ARRAYSIZE( iidCClusPartition );
  57. ZeroMemory( &m_cpi, sizeof( CLUS_PARTITION_INFO ) );
  58. } //*** CClusPartition::CClusPartition()
  59. /////////////////////////////////////////////////////////////////////////////
  60. //++
  61. //
  62. // CClusPartition::Create
  63. //
  64. // Description:
  65. // Finish creating this object.
  66. //
  67. // Arguments:
  68. // pcpi [IN] - points to the CLUS_PARTITION_INFO struct.
  69. //
  70. // Return Value:
  71. // S_OK if successful, or E_POINTER
  72. //
  73. //--
  74. /////////////////////////////////////////////////////////////////////////////
  75. HRESULT CClusPartition::Create( IN CLUS_PARTITION_INFO * pcpi )
  76. {
  77. ASSERT( pcpi != NULL );
  78. HRESULT _hr = E_POINTER;
  79. if ( pcpi != NULL )
  80. {
  81. m_cpi = *pcpi;
  82. _hr = S_OK;
  83. } // if: pcpi != NULL
  84. return _hr;
  85. } //*** CClusPartition::Create()
  86. /////////////////////////////////////////////////////////////////////////////
  87. //++
  88. //
  89. // CClusPartition::get_Flags
  90. //
  91. // Description:
  92. // Get the dwFlags field from the CLUS_PARTITION_INFO struct.
  93. //
  94. // Arguments:
  95. // plFlags [OUT] - catches the dwFlags field.
  96. //
  97. // Return Value:
  98. // S_OK if successful, or E_POINTER
  99. //
  100. //--
  101. /////////////////////////////////////////////////////////////////////////////
  102. STDMETHODIMP CClusPartition::get_Flags( OUT long * plFlags )
  103. {
  104. //ASSERT( plFlags != NULL );
  105. HRESULT _hr = E_POINTER;
  106. if ( plFlags != NULL )
  107. {
  108. *plFlags = m_cpi.dwFlags;
  109. _hr = S_OK;
  110. }
  111. return _hr;
  112. } //*** CClusPartition::get_Flags()
  113. /////////////////////////////////////////////////////////////////////////////
  114. //++
  115. //
  116. // CClusPartition::get_DeviceName
  117. //
  118. // Description:
  119. // Get the szDeviceName field from the CLUS_PARTITION_INFO struct.
  120. //
  121. // Arguments:
  122. // pbstrDeviceName [OUT] - catches the szDeviceName field.
  123. //
  124. // Return Value:
  125. // S_OK if successful, or E_POINTER
  126. //
  127. //--
  128. /////////////////////////////////////////////////////////////////////////////
  129. STDMETHODIMP CClusPartition::get_DeviceName( OUT BSTR * pbstrDeviceName )
  130. {
  131. //ASSERT( pbstrDeviceName != NULL );
  132. HRESULT _hr = E_POINTER;
  133. if ( pbstrDeviceName != NULL )
  134. {
  135. *pbstrDeviceName = SysAllocString( m_cpi.szDeviceName );
  136. if ( *pbstrDeviceName == NULL )
  137. {
  138. _hr = E_OUTOFMEMORY;
  139. }
  140. else
  141. {
  142. _hr = S_OK;
  143. }
  144. }
  145. return _hr;
  146. } //*** CClusPartition::get_DeviceName()
  147. /////////////////////////////////////////////////////////////////////////////
  148. //++
  149. //
  150. // CClusPartition::get_VolumeLabel
  151. //
  152. // Description:
  153. // Get the szVolumeLabel field from the CLUS_PARTITION_INFO struct.
  154. //
  155. // Arguments:
  156. // pbstrVolumeLabel [OUT] - catches the szVolumeLabel field.
  157. //
  158. // Return Value:
  159. // S_OK if successful, or E_POINTER
  160. //
  161. //--
  162. /////////////////////////////////////////////////////////////////////////////
  163. STDMETHODIMP CClusPartition::get_VolumeLabel(
  164. OUT BSTR * pbstrVolumeLabel
  165. )
  166. {
  167. //ASSERT( pbstrVolumeLabel != NULL );
  168. HRESULT _hr = E_POINTER;
  169. if ( pbstrVolumeLabel != NULL )
  170. {
  171. *pbstrVolumeLabel = SysAllocString( m_cpi.szVolumeLabel );
  172. if ( *pbstrVolumeLabel == NULL )
  173. {
  174. _hr = E_OUTOFMEMORY;
  175. }
  176. else
  177. {
  178. _hr = S_OK;
  179. }
  180. }
  181. return _hr;
  182. } //*** CClusPartition::get_VolumeLabel()
  183. /////////////////////////////////////////////////////////////////////////////
  184. //++
  185. //
  186. // CClusPartition::get_SerialNumber
  187. //
  188. // Description:
  189. // Get the dwSerialNumber field from the CLUS_PARTITION_INFO struct.
  190. //
  191. // Arguments:
  192. // plSerialNumber [OUT] - catches the dwSerialNumber field.
  193. //
  194. // Return Value:
  195. // S_OK if successful, or E_POINTER
  196. //
  197. //--
  198. /////////////////////////////////////////////////////////////////////////////
  199. STDMETHODIMP CClusPartition::get_SerialNumber(
  200. OUT long * plSerialNumber
  201. )
  202. {
  203. //ASSERT( plSerialNumber != NULL );
  204. HRESULT _hr = E_POINTER;
  205. if ( plSerialNumber != NULL )
  206. {
  207. *plSerialNumber = m_cpi.dwSerialNumber;
  208. _hr = S_OK;
  209. }
  210. return _hr;
  211. } //*** CClusPartition::get_SerialNumber()
  212. /////////////////////////////////////////////////////////////////////////////
  213. //++
  214. //
  215. // CClusPartition::get_MaximumComponentLength
  216. //
  217. // Description:
  218. // Get the dwMaximumComponentLength field from the CLUS_PARTITION_INFO
  219. // struct.
  220. //
  221. // Arguments:
  222. // plMaximumComponentLength [OUT] - catches the dwMaximumComponentLength
  223. // field.
  224. //
  225. // Return Value:
  226. // S_OK if successful, or E_POINTER
  227. //
  228. //--
  229. /////////////////////////////////////////////////////////////////////////////
  230. STDMETHODIMP CClusPartition::get_MaximumComponentLength(
  231. OUT long * plMaximumComponentLength
  232. )
  233. {
  234. //ASSERT( plMaximumComponentLength != NULL );
  235. HRESULT _hr = E_POINTER;
  236. if ( plMaximumComponentLength != NULL )
  237. {
  238. *plMaximumComponentLength = m_cpi.rgdwMaximumComponentLength;
  239. _hr = S_OK;
  240. }
  241. return _hr;
  242. } //*** CClusPartition::get_MaximumComponentLength()
  243. /////////////////////////////////////////////////////////////////////////////
  244. //++
  245. //
  246. // CClusPartition::get_FileSystemFlags
  247. //
  248. // Description:
  249. // Get the dwFileSystemFlags field from the CLUS_PARTITION_INFO struct.
  250. //
  251. // Arguments:
  252. // plFileSystemFlags [OUT] - catches the dwFileSystemFlags field.
  253. //
  254. // Return Value:
  255. // S_OK if successful, or E_POINTER
  256. //
  257. //--
  258. /////////////////////////////////////////////////////////////////////////////
  259. STDMETHODIMP CClusPartition::get_FileSystemFlags(
  260. OUT long * plFileSystemFlags
  261. )
  262. {
  263. //ASSERT( plFileSystemFlags != NULL );
  264. HRESULT _hr = E_POINTER;
  265. if ( plFileSystemFlags != NULL )
  266. {
  267. *plFileSystemFlags = m_cpi.dwFileSystemFlags;
  268. _hr = S_OK;
  269. }
  270. return _hr;
  271. } //*** CClusPartition::get_FileSystemFlags()
  272. /////////////////////////////////////////////////////////////////////////////
  273. //++
  274. //
  275. // CClusPartition::get_FileSystem
  276. //
  277. // Description:
  278. // Get the szFileSystem field from the CLUS_PARTITION_INFO struct.
  279. //
  280. // Arguments:
  281. // pbstrFileSystem [OUT] - catches the szFileSystem field.
  282. //
  283. // Return Value:
  284. // S_OK if successful, or E_POINTER
  285. //
  286. //--
  287. /////////////////////////////////////////////////////////////////////////////
  288. STDMETHODIMP CClusPartition::get_FileSystem( OUT BSTR * pbstrFileSystem )
  289. {
  290. //ASSERT( pbstrFileSystem != NULL );
  291. HRESULT _hr = E_POINTER;
  292. if ( pbstrFileSystem != NULL )
  293. {
  294. *pbstrFileSystem = SysAllocString( m_cpi.szFileSystem );
  295. if ( *pbstrFileSystem == NULL )
  296. {
  297. _hr = E_OUTOFMEMORY;
  298. }
  299. else
  300. {
  301. _hr = S_OK;
  302. }
  303. }
  304. return _hr;
  305. } //*** CClusPartition::get_FileSystem()
  306. //*************************************************************************//
  307. /////////////////////////////////////////////////////////////////////////////
  308. // CClusPartitions class
  309. /////////////////////////////////////////////////////////////////////////////
  310. /////////////////////////////////////////////////////////////////////////////
  311. //++
  312. //
  313. // CClusPartitions::CClusPartitions
  314. //
  315. // Description:
  316. // Constructor
  317. //
  318. // Arguments:
  319. // None.
  320. //
  321. // Return Value:
  322. // None.
  323. //
  324. //--
  325. /////////////////////////////////////////////////////////////////////////////
  326. CClusPartitions::CClusPartitions( void )
  327. {
  328. m_piids = (const IID *) iidCClusPartitions;
  329. m_piidsSize = ARRAYSIZE( iidCClusPartitions );
  330. } //*** CClusPartitions::CClusPartitions()
  331. /////////////////////////////////////////////////////////////////////////////
  332. //++
  333. //
  334. // CClusPartitions::~CClusPartitions
  335. //
  336. // Description:
  337. // Destructor
  338. //
  339. // Arguments:
  340. // None.
  341. //
  342. // Return Value:
  343. // None.
  344. //
  345. //--
  346. /////////////////////////////////////////////////////////////////////////////
  347. CClusPartitions::~CClusPartitions( void )
  348. {
  349. Clear();
  350. } //*** CClusPartitions::~CClusPartitions()
  351. /////////////////////////////////////////////////////////////////////////////
  352. //++
  353. //
  354. // CClusPartitions::HrCreateItem
  355. //
  356. // Description:
  357. // Create and add a partition to the collection.
  358. //
  359. // Arguments:
  360. // rcpvl [IN] - value list of partition(s).
  361. //
  362. // Return Value:
  363. // S_OK if successful, or HRESULT error.
  364. //
  365. //--
  366. /////////////////////////////////////////////////////////////////////////////
  367. HRESULT CClusPartitions::HrCreateItem( IN CLUS_PARTITION_INFO * pcpi )
  368. {
  369. ASSERT( pcpi != NULL );
  370. HRESULT _hr = E_POINTER;
  371. if ( pcpi != NULL )
  372. {
  373. CComObject< CClusPartition > * _pPartition = NULL;
  374. _hr = CComObject< CClusPartition >::CreateInstance( &_pPartition );
  375. if ( SUCCEEDED( _hr ) )
  376. {
  377. CSmartPtr< CComObject< CClusPartition > > _ptrPartition( _pPartition );
  378. _hr = _ptrPartition->Create( pcpi );
  379. if ( SUCCEEDED( _hr ) )
  380. {
  381. m_pvPartitions.insert( m_pvPartitions.end(), _pPartition );
  382. _ptrPartition->AddRef();
  383. } // if:
  384. } // if:
  385. } // if:
  386. return _hr;
  387. } //*** CClusPartitions::HrCreateItem()
  388. /////////////////////////////////////////////////////////////////////////////
  389. //++
  390. //
  391. // CClusPartitions::GetIndex
  392. //
  393. // Description:
  394. // Convert the passed in 1 based index into a 0 based index.
  395. //
  396. // Arguments:
  397. // varIndex [IN] - the 1 based index.
  398. // pnIndex [OUT] - the 0 based index
  399. //
  400. // Return Value:
  401. // S_OK if successful, or E_INVALIDARG if the index is out of range.
  402. //
  403. //--
  404. /////////////////////////////////////////////////////////////////////////////
  405. HRESULT CClusPartitions::GetIndex( VARIANT varIndex, UINT * pnIndex )
  406. {
  407. //ASSERT( pnIndex != NULL );
  408. HRESULT _hr = E_POINTER;
  409. if ( pnIndex != NULL )
  410. {
  411. CComVariant v;
  412. UINT nIndex = 0;
  413. *pnIndex = 0;
  414. v.Copy( &varIndex );
  415. // Check to see if the index is a number.
  416. _hr = v.ChangeType( VT_I4 );
  417. if ( SUCCEEDED( _hr ) )
  418. {
  419. nIndex = v.lVal;
  420. nIndex--; // Adjust index to be 0 relative instead of 1 relative
  421. if ( nIndex < m_pvPartitions.size() )
  422. {
  423. *pnIndex = nIndex;
  424. }
  425. else
  426. {
  427. _hr = E_INVALIDARG;
  428. }
  429. }
  430. }
  431. return _hr;
  432. } //*** CClusPartitions::GetIndex()
  433. /////////////////////////////////////////////////////////////////////////////
  434. //++
  435. //
  436. // CClusPartitions::get_Count
  437. //
  438. // Description:
  439. // Returns the count of elements (Partitions) in the collection.
  440. //
  441. // Arguments:
  442. // plCount [OUT] - Catches the count.
  443. //
  444. // Return Value:
  445. // S_OK if successful, or E_POINTER if not.
  446. //
  447. //--
  448. /////////////////////////////////////////////////////////////////////////////
  449. STDMETHODIMP CClusPartitions::get_Count(
  450. long * plCount
  451. )
  452. {
  453. //ASSERT( plCount != NULL );
  454. HRESULT _hr = E_POINTER;
  455. if ( plCount != NULL )
  456. {
  457. *plCount = m_pvPartitions.size();
  458. _hr = S_OK;
  459. }
  460. return _hr;
  461. } //*** CClusPartitions::get_Count()
  462. /////////////////////////////////////////////////////////////////////////////
  463. //++
  464. //
  465. // CClusPartitions::Clear
  466. //
  467. // Description:
  468. // Clean out the vector of ClusPartition objects.
  469. //
  470. // Arguments:
  471. // None.
  472. //
  473. // Return Value:
  474. // None.
  475. //
  476. //--
  477. /////////////////////////////////////////////////////////////////////////////
  478. void CClusPartitions::Clear( void )
  479. {
  480. ::ReleaseAndEmptyCollection< PartitionVector, CComObject< CClusPartition > >( m_pvPartitions );
  481. } //*** CClusPartitions::Clear()
  482. /////////////////////////////////////////////////////////////////////////////
  483. //++
  484. //
  485. // CClusPartitions::get_Item
  486. //
  487. // Description:
  488. // Returns the object (Partition) at the passed in index.
  489. //
  490. // Arguments:
  491. // varIndex [IN] - Hold the index. This is a one based number, or
  492. // a string that is the name of the group to get.
  493. // ppPartition [OUT] - Catches the partition
  494. //
  495. // Return Value:
  496. // S_OK if successful, E_POINTER, or E_INVALIDARG if the index is out
  497. // of range, or other HRESULT error.
  498. //
  499. //--
  500. /////////////////////////////////////////////////////////////////////////////
  501. STDMETHODIMP CClusPartitions::get_Item(
  502. IN VARIANT varIndex,
  503. OUT ISClusPartition ** ppPartition
  504. )
  505. {
  506. //ASSERT( ppPartition != NULL );
  507. HRESULT _hr = E_POINTER;
  508. if ( ppPartition != NULL )
  509. {
  510. CComObject< CClusPartition > * pPartition = NULL;
  511. // Zero the out param
  512. *ppPartition = NULL;
  513. UINT nIndex = 0;
  514. _hr = GetIndex( varIndex, &nIndex );
  515. if ( SUCCEEDED( _hr ) )
  516. {
  517. pPartition = m_pvPartitions[ nIndex ];
  518. _hr = pPartition->QueryInterface( IID_ISClusPartition, (void **) ppPartition );
  519. }
  520. }
  521. return _hr;
  522. } //*** CClusPartitions::get_Item()
  523. /////////////////////////////////////////////////////////////////////////////
  524. //++
  525. //
  526. // CClusPartitions::get__NewEnum
  527. //
  528. // Description:
  529. // Create and return a new enumeration for this collection.
  530. //
  531. // Arguments:
  532. // ppunk [OUT] - Catches the new enumeration.
  533. //
  534. // Return Value:
  535. // S_OK if successful, E_POINTER, or other HRESULT error.
  536. //
  537. //--
  538. /////////////////////////////////////////////////////////////////////////////
  539. STDMETHODIMP CClusPartitions::get__NewEnum(
  540. IUnknown ** ppunk
  541. )
  542. {
  543. return ::HrNewIDispatchEnum< PartitionVector, CComObject< CClusPartition > >( ppunk, m_pvPartitions );
  544. } //*** CClusPartitions::get__NewEnum()