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.

461 lines
11 KiB

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1998-2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // Version.cpp
  7. //
  8. // Description:
  9. // Implementation of the cluster version classes for the MSCLUS
  10. // automation classes.
  11. //
  12. // Author:
  13. // Galen Barbee (galenb) 26-Oct-1998
  14. //
  15. // Revision History:
  16. //
  17. // Notes:
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "version.h"
  22. /////////////////////////////////////////////////////////////////////////////
  23. // Global variables
  24. /////////////////////////////////////////////////////////////////////////////
  25. static const IID * iidCClusVersion[] =
  26. {
  27. &IID_ISClusVersion
  28. };
  29. //*************************************************************************//
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CClusVersion class
  32. /////////////////////////////////////////////////////////////////////////////
  33. /////////////////////////////////////////////////////////////////////////////
  34. //++
  35. //
  36. // CClusVersion::CClusVersion
  37. //
  38. // Description:
  39. // Constructor
  40. //
  41. // Arguments:
  42. // None.
  43. //
  44. // Return Value:
  45. // None.
  46. //
  47. //--
  48. /////////////////////////////////////////////////////////////////////////////
  49. CClusVersion::CClusVersion( void )
  50. {
  51. m_piids = (const IID *) iidCClusVersion;
  52. m_piidsSize = ARRAYSIZE( iidCClusVersion );
  53. ZeroMemory( &m_clusinfo, sizeof( m_clusinfo ) );
  54. m_clusinfo.dwVersionInfoSize = sizeof( m_clusinfo );
  55. } //*** CClusVersion::CClusVersion()
  56. /////////////////////////////////////////////////////////////////////////////
  57. //++
  58. //
  59. // CClusVersion::Create
  60. //
  61. // Description:
  62. // Finish creating this object from the data in the cluster.
  63. //
  64. // Arguments:
  65. // pClusRefObject [IN] - Wraps the cluster handle.
  66. //
  67. // Return Value:
  68. // S_OK if successful, other HRESULT error, or other Win32 error.
  69. //
  70. //--
  71. /////////////////////////////////////////////////////////////////////////////
  72. HRESULT CClusVersion::Create( IN ISClusRefObject * pClusRefObject )
  73. {
  74. ASSERT( pClusRefObject != NULL );
  75. HRESULT _hr = E_POINTER;
  76. if ( pClusRefObject != NULL )
  77. {
  78. HCLUSTER _hCluster = NULL;
  79. m_ptrClusRefObject = pClusRefObject;
  80. _hr = m_ptrClusRefObject->get_Handle( (ULONG_PTR *) &_hCluster );
  81. if ( SUCCEEDED( _hr ) )
  82. {
  83. LPWSTR _pwszName = NULL;
  84. DWORD _sc;
  85. _sc = ::WrapGetClusterInformation( _hCluster, &_pwszName, &m_clusinfo );
  86. if ( _sc == ERROR_SUCCESS )
  87. {
  88. m_bstrClusterName = _pwszName;
  89. ::LocalFree( _pwszName );
  90. _pwszName = NULL;
  91. } // if: WrapGetClusterInformation OK
  92. _hr = HRESULT_FROM_WIN32( _sc );
  93. } //if: get cluster handle
  94. } // if: pClusRefObject != NULL
  95. return _hr;
  96. } //*** CClusVersion::Create()
  97. /////////////////////////////////////////////////////////////////////////////
  98. //++
  99. //
  100. // CClusVersion::get_Name
  101. //
  102. // Description:
  103. // Return the name of the cluster.
  104. //
  105. // Arguments:
  106. // pbstrClusterName [OUT] - Catches the name of this cluster.
  107. //
  108. // Return Value:
  109. // S_OK if successful, or E_POINTER.
  110. //
  111. //--
  112. /////////////////////////////////////////////////////////////////////////////
  113. STDMETHODIMP CClusVersion::get_Name( OUT BSTR * pbstrClusterName )
  114. {
  115. //ASSERT( pbstrClusterName != NULL );
  116. HRESULT _hr = E_POINTER;
  117. if ( pbstrClusterName != NULL )
  118. {
  119. *pbstrClusterName = m_bstrClusterName.Copy();
  120. _hr = S_OK;
  121. }
  122. return _hr;
  123. } //*** CClusVersion::get_Name()
  124. /////////////////////////////////////////////////////////////////////////////
  125. //++
  126. //
  127. // CClusVersion::get_VendorId
  128. //
  129. // Description:
  130. // Return the vendor ID from the CLUSTERVERSIONINFO struct.
  131. //
  132. // Arguments:
  133. // pbstrVendorId [OUT] - Catches the value of the vendo id.
  134. //
  135. // Return Value:
  136. // S_OK if successful, or E_POINTER.
  137. //
  138. //--
  139. /////////////////////////////////////////////////////////////////////////////
  140. STDMETHODIMP CClusVersion::get_VendorId( OUT BSTR * pbstrVendorId )
  141. {
  142. //ASSERT( pbstrVendorId != NULL );
  143. HRESULT _hr = E_POINTER;
  144. if ( pbstrVendorId != NULL )
  145. {
  146. *pbstrVendorId = ::SysAllocString( m_clusinfo.szVendorId );
  147. if ( *pbstrVendorId == NULL )
  148. {
  149. _hr = E_OUTOFMEMORY;
  150. }
  151. else
  152. {
  153. _hr = S_OK;
  154. }
  155. }
  156. return _hr;
  157. } //*** CClusVersion::get_VendorId()
  158. /////////////////////////////////////////////////////////////////////////////
  159. //++
  160. //
  161. // CClusVersion::get_CSDVersion
  162. //
  163. // Description:
  164. // Return the value the CSDVersion from the CLUSTERVERSIONINFO struct.
  165. //
  166. // Arguments:
  167. // pbstrCSDVersion [OUT] - Catches the value of CSDVersion.
  168. //
  169. // Return Value:
  170. // S_OK if successful, or E_POINTER.
  171. //
  172. //--
  173. /////////////////////////////////////////////////////////////////////////////
  174. STDMETHODIMP CClusVersion::get_CSDVersion( OUT BSTR * pbstrCSDVersion )
  175. {
  176. //ASSERT( pbstrCSDVersion != NULL );
  177. HRESULT _hr = E_POINTER;
  178. if ( pbstrCSDVersion != NULL )
  179. {
  180. *pbstrCSDVersion = ::SysAllocString( m_clusinfo.szCSDVersion );
  181. if ( *pbstrCSDVersion == NULL )
  182. {
  183. _hr = E_OUTOFMEMORY;
  184. }
  185. else
  186. {
  187. _hr = S_OK;
  188. }
  189. }
  190. return _hr;
  191. } //*** CClusVersion::get_CSDVersion()
  192. /////////////////////////////////////////////////////////////////////////////
  193. //++
  194. //
  195. // CClusVersion::get_MajorVersion
  196. //
  197. // Description:
  198. // Returns the cluster major version.
  199. //
  200. // Arguments:
  201. // pnMajorVersion [OUT] - Catches the cluster major version value.
  202. //
  203. // Return Value:
  204. // S_OK if successful, or E_POINTER.
  205. //
  206. //--
  207. /////////////////////////////////////////////////////////////////////////////
  208. STDMETHODIMP CClusVersion::get_MajorVersion( OUT long * pnMajorVersion )
  209. {
  210. //ASSERT( pnMajorVersion != NULL );
  211. HRESULT _hr = E_POINTER;
  212. if ( pnMajorVersion != NULL )
  213. {
  214. *pnMajorVersion = m_clusinfo.MajorVersion;
  215. _hr = S_OK;
  216. }
  217. return _hr;
  218. } //*** CClusVersion::get_MajorVersion()
  219. /////////////////////////////////////////////////////////////////////////////
  220. //++
  221. //
  222. // CClusVersion::get_MinorVersion
  223. //
  224. // Description:
  225. // Returns the cluster minor version.
  226. //
  227. // Arguments:
  228. // pnMinorVersion [OUT] - Catches the cluster minor version value.
  229. //
  230. // Return Value:
  231. // S_OK if successful, or E_POINTER.
  232. //
  233. //--
  234. /////////////////////////////////////////////////////////////////////////////
  235. STDMETHODIMP CClusVersion::get_MinorVersion( OUT long * pnMinorVersion )
  236. {
  237. //ASSERT( pnMinorVersion != NULL );
  238. HRESULT _hr = E_POINTER;
  239. if ( pnMinorVersion != NULL )
  240. {
  241. *pnMinorVersion = m_clusinfo.MinorVersion;
  242. _hr = S_OK;
  243. }
  244. return _hr;
  245. } //*** CClusVersion::get_MinorVersion()
  246. /////////////////////////////////////////////////////////////////////////////
  247. //++
  248. //
  249. // CClusVersion::get_BuildNumber
  250. //
  251. // Description:
  252. // Returns the value of the cluster build number.
  253. //
  254. // Arguments:
  255. // pnBuildNumber [OUT] - Catches the build number.
  256. //
  257. // Return Value:
  258. // S_OK if successful, or E_POINTER.
  259. //
  260. //--
  261. /////////////////////////////////////////////////////////////////////////////
  262. STDMETHODIMP CClusVersion::get_BuildNumber( OUT short * pnBuildNumber )
  263. {
  264. //ASSERT( pnBuildNumber != NULL );
  265. HRESULT _hr = E_POINTER;
  266. if ( pnBuildNumber != NULL )
  267. {
  268. *pnBuildNumber = m_clusinfo.BuildNumber;
  269. _hr = S_OK;
  270. }
  271. return _hr;
  272. } //*** CClusVersion::get_BuildNumber()
  273. /////////////////////////////////////////////////////////////////////////////
  274. //++
  275. //
  276. // CClusVersion::get_ClusterHighestVersion
  277. //
  278. // Description:
  279. // Returns the value of the highest cluster version.
  280. //
  281. // Arguments:
  282. // pnClusterHighestVersion [OUT] - Catches the value.
  283. //
  284. // Return Value:
  285. // S_OK if successful, or E_POINTER.
  286. //
  287. //--
  288. /////////////////////////////////////////////////////////////////////////////
  289. STDMETHODIMP CClusVersion::get_ClusterHighestVersion(
  290. OUT long * pnClusterHighestVersion
  291. )
  292. {
  293. //ASSERT( pnClusterHighestVersion != NULL );
  294. HRESULT _hr = E_POINTER;
  295. if ( pnClusterHighestVersion != NULL )
  296. {
  297. *pnClusterHighestVersion = m_clusinfo.dwClusterHighestVersion;
  298. _hr = S_OK;
  299. }
  300. return _hr;
  301. } //*** CClusVersion::get_ClusterHighestVersion()
  302. /////////////////////////////////////////////////////////////////////////////
  303. //++
  304. //
  305. // CClusVersion::get_ClusterLowestVersion
  306. //
  307. // Description:
  308. // Returns the value of the lowest cluster version.
  309. //
  310. // Arguments:
  311. // pnClusterLowestVersion [OUT] - Catches the value.
  312. //
  313. // Return Value:
  314. // S_OK if successful, or E_POINTER.
  315. //
  316. //--
  317. /////////////////////////////////////////////////////////////////////////////
  318. STDMETHODIMP CClusVersion::get_ClusterLowestVersion(
  319. OUT long * pnClusterLowestVersion
  320. )
  321. {
  322. //ASSERT( pnClusterLowestVersion != NULL );
  323. HRESULT _hr = E_POINTER;
  324. if ( pnClusterLowestVersion != NULL )
  325. {
  326. *pnClusterLowestVersion = m_clusinfo.dwClusterLowestVersion;
  327. _hr = S_OK;
  328. }
  329. return _hr;
  330. } //*** CClusVersion::get_ClusterLowestVersion()
  331. /////////////////////////////////////////////////////////////////////////////
  332. //++
  333. //
  334. // CClusVersion::get_Flags
  335. //
  336. // Description:
  337. // Get the CLUSTERINFO.dwFlags value.
  338. //
  339. // Arguments:
  340. // pnFlags [OUT] - Catches the flags value.
  341. //
  342. // Return Value:
  343. // S_OK if successful, or E_POINTER.
  344. //
  345. //--
  346. /////////////////////////////////////////////////////////////////////////////
  347. STDMETHODIMP CClusVersion::get_Flags( OUT long * pnFlags )
  348. {
  349. //ASSERT( pnFlags != NULL );
  350. HRESULT _hr = E_POINTER;
  351. if ( pnFlags != NULL )
  352. {
  353. *pnFlags = m_clusinfo.dwFlags;
  354. _hr = S_OK;
  355. }
  356. return _hr;
  357. } //*** CClusVersion::get_Flags()
  358. /////////////////////////////////////////////////////////////////////////////
  359. //++
  360. //
  361. // CClusVersion::get_MixedVersion
  362. //
  363. // Description:
  364. // Is this cluster composed of mixed version nodes?
  365. //
  366. // Arguments:
  367. // pvarMixedVersion [OUT] - Catches the mixed version state.
  368. //
  369. // Return Value:
  370. // S_OK if successful, or E_POINTER.
  371. //
  372. //--
  373. /////////////////////////////////////////////////////////////////////////////
  374. STDMETHODIMP CClusVersion::get_MixedVersion( OUT VARIANT * pvarMixedVersion )
  375. {
  376. //ASSERT( pvarMixedVersion != NULL );
  377. HRESULT _hr = E_POINTER;
  378. if ( pvarMixedVersion != NULL )
  379. {
  380. pvarMixedVersion->vt = VT_BOOL;
  381. if ( m_clusinfo.dwFlags & CLUSTER_VERSION_FLAG_MIXED_MODE )
  382. {
  383. pvarMixedVersion->boolVal = VARIANT_TRUE;
  384. } // if: the mixed version bit is set...
  385. else
  386. {
  387. pvarMixedVersion->boolVal = VARIANT_FALSE;
  388. } // else: the mixed version bit is not set...
  389. _hr = S_OK;
  390. }
  391. return _hr;
  392. } //*** CClusVersion::get_MixedVersion()