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.

1485 lines
36 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // WmiHelpers.cpp
  7. //
  8. // Description:
  9. // This file contains the implementation of WMI help functions.
  10. //
  11. // Documentation:
  12. //
  13. // Header File:
  14. // WmiHelpers.h
  15. //
  16. // Maintained By:
  17. // Galen Barbee (GalenB) 27-Apr-2000
  18. //
  19. //////////////////////////////////////////////////////////////////////////////
  20. //////////////////////////////////////////////////////////////////////////////
  21. // Include Files
  22. //////////////////////////////////////////////////////////////////////////////
  23. #include "pch.h"
  24. #include "PrivateInterfaces.h"
  25. #include "CEnumClusCfgNetworks.h"
  26. #include <ClusRtl.h>
  27. //////////////////////////////////////////////////////////////////////////////
  28. //++
  29. //
  30. // HrGetWMIProperty
  31. //
  32. // Description:
  33. // Get a named property from a WMI object.
  34. //
  35. // Arguments:
  36. //
  37. // Return Value:
  38. // S_OK
  39. // Success
  40. //
  41. // E_POINTER
  42. // The IWbemClassObject param is NULL.
  43. //
  44. // Remarks:
  45. // None.
  46. //
  47. //--
  48. //////////////////////////////////////////////////////////////////////////////
  49. HRESULT
  50. HrGetWMIProperty(
  51. IWbemClassObject * pWMIObjectIn,
  52. LPCWSTR pcszPropertyNameIn,
  53. ULONG ulPropertyTypeIn,
  54. VARIANT * pVariantOut
  55. )
  56. {
  57. TraceFunc1( "pcszPropertyNameIn = '%ws'", pcszPropertyNameIn );
  58. Assert( pWMIObjectIn != NULL );
  59. Assert( pcszPropertyNameIn != NULL );
  60. Assert( pVariantOut != NULL );
  61. HRESULT hr;
  62. BSTR bstrProp = NULL;
  63. VariantClear( pVariantOut );
  64. bstrProp = TraceSysAllocString( pcszPropertyNameIn );
  65. if ( bstrProp == NULL )
  66. {
  67. hr = THR( E_OUTOFMEMORY );
  68. goto Cleanup;
  69. } // if:
  70. hr = THR( pWMIObjectIn->Get( bstrProp, 0L, pVariantOut, NULL, NULL ) );
  71. if ( FAILED( hr ) )
  72. {
  73. LogMsg( L"[SRV] Could not get the value for WMI property '%ws'. (hr = %#08x)", bstrProp, hr );
  74. goto Cleanup;
  75. } // if:
  76. //
  77. // KB: 28-JUN-2000 GalenB
  78. //
  79. // For reasons only known to WMI boolean properties are of type VT_NULL instead of
  80. // VT_BOOL when they are not set or false...
  81. //
  82. // KB: 27-JUL-2000 GalenB
  83. //
  84. // Added the special case check for signature. We know that signature will be NULL
  85. // when the spindle is under ClusDisk control...
  86. //
  87. if ( ( ulPropertyTypeIn != VT_BOOL ) && ( NStringCchCompareNoCase( bstrProp, SysStringLen( bstrProp ) + 1, L"Signature", RTL_NUMBER_OF( L"Signature" ) ) != 0 ) )
  88. {
  89. if ( pVariantOut->vt != ulPropertyTypeIn )
  90. {
  91. LogMsg( L"[SRV] Variant type for WMI Property '%ws' was supposed to be '%d', but was '%d' instead.", pcszPropertyNameIn, ulPropertyTypeIn, pVariantOut->vt );
  92. hr = THR( E_PROPTYPEMISMATCH );
  93. } // if:
  94. } // if:
  95. Cleanup:
  96. TraceSysFreeString( bstrProp );
  97. HRETURN( hr );
  98. } //*** HrGetWMIProperty
  99. //////////////////////////////////////////////////////////////////////////////
  100. //++
  101. //
  102. // HrSetWbemServices
  103. //
  104. // Description:
  105. // Set the WBemServices object into the passed in punk.
  106. //
  107. // Arguments:
  108. //
  109. // Return Value:
  110. // S_OK
  111. // Success
  112. //
  113. // E_POINTER
  114. // The IUnknown param is NULL.
  115. //
  116. // Remarks:
  117. // None.
  118. //
  119. //--
  120. //////////////////////////////////////////////////////////////////////////////
  121. HRESULT
  122. HrSetWbemServices( IUnknown * punkIn, IWbemServices * pIWbemServicesIn )
  123. {
  124. TraceFunc( "" );
  125. Assert( punkIn != NULL );
  126. HRESULT hr;
  127. IClusCfgWbemServices * pWbemProvider;
  128. if ( punkIn == NULL )
  129. {
  130. hr = THR( E_POINTER );
  131. goto Exit;
  132. } // if:
  133. hr = punkIn->TypeSafeQI( IClusCfgWbemServices, &pWbemProvider );
  134. if ( SUCCEEDED( hr ) )
  135. {
  136. hr = THR( pWbemProvider->SetWbemServices( pIWbemServicesIn ) );
  137. pWbemProvider->Release();
  138. } // if:
  139. else if ( hr == E_NOINTERFACE )
  140. {
  141. hr = S_OK;
  142. } // else if:
  143. else
  144. {
  145. THR( hr );
  146. }
  147. Exit:
  148. HRETURN( hr );
  149. } //*** HrSetWbemServices
  150. //////////////////////////////////////////////////////////////////////////////
  151. //++
  152. //
  153. // HrSetInitialize
  154. //
  155. // Description:
  156. // Initialize the passed in punk.
  157. //
  158. // Arguments:
  159. //
  160. // Return Value:
  161. // S_OK
  162. // Success
  163. //
  164. // E_POINTER
  165. // The IUnknown param is NULL.
  166. //
  167. // Remarks:
  168. // None.
  169. //
  170. //--
  171. //////////////////////////////////////////////////////////////////////////////
  172. HRESULT
  173. HrSetInitialize(
  174. IUnknown * punkIn,
  175. IClusCfgCallback * picccIn,
  176. LCID lcidIn
  177. )
  178. {
  179. TraceFunc( "" );
  180. Assert( punkIn != NULL );
  181. HRESULT hr;
  182. IClusCfgInitialize * pcci;
  183. IUnknown * punkCallback = NULL;
  184. if ( punkIn == NULL )
  185. {
  186. hr = THR( E_POINTER );
  187. goto Cleanup;
  188. } // if:
  189. if ( picccIn != NULL )
  190. {
  191. hr = THR( picccIn->TypeSafeQI( IUnknown, &punkCallback ) );
  192. if ( FAILED( hr ) )
  193. {
  194. goto Cleanup;
  195. } // if:
  196. } // if:
  197. hr = THR( punkIn->TypeSafeQI( IClusCfgInitialize, &pcci ) );
  198. if ( SUCCEEDED( hr ) )
  199. {
  200. hr = STHR( pcci->Initialize( punkCallback, lcidIn ) );
  201. pcci->Release();
  202. } // if:
  203. else if ( hr == E_NOINTERFACE )
  204. {
  205. hr = S_OK;
  206. } // else if:
  207. Cleanup:
  208. if ( punkCallback != NULL )
  209. {
  210. punkCallback->Release();
  211. } // if:
  212. HRETURN( hr );
  213. } //*** HrSetInitialize
  214. //////////////////////////////////////////////////////////////////////////////
  215. //++
  216. //
  217. // HrCreateNetworksEnum
  218. //
  219. // Description:
  220. // Create a network enumerator.
  221. //
  222. // Arguments:
  223. //
  224. // Return Value:
  225. // S_OK
  226. // Success
  227. //
  228. // E_POINTER
  229. // The IUnknown param is NULL.
  230. //
  231. // Remarks:
  232. // None.
  233. //
  234. //--
  235. //////////////////////////////////////////////////////////////////////////////
  236. HRESULT
  237. HrCreateNetworksEnum(
  238. IClusCfgCallback * picccIn,
  239. LCID lcidIn,
  240. IWbemServices * pIWbemServicesIn,
  241. IUnknown ** ppunkOut
  242. )
  243. {
  244. TraceFunc( "" );
  245. HRESULT hr;
  246. if ( ppunkOut == NULL )
  247. {
  248. hr = THR( E_POINTER );
  249. LogMsg( L"[SRV] HrCreateNetworksEnum() was given a NULL pointer argument." );
  250. goto Exit;
  251. } // if:
  252. hr = THR( CEnumClusCfgNetworks::S_HrCreateInstance( ppunkOut ) );
  253. if ( FAILED( hr ) )
  254. {
  255. goto Exit;
  256. } // if:
  257. *ppunkOut = TraceInterface( L"CEnumClusCfgNetworks", IUnknown, *ppunkOut, 1 );
  258. hr = THR( HrSetInitialize( *ppunkOut, picccIn, lcidIn ) );
  259. if ( FAILED( hr ) )
  260. {
  261. goto Exit;
  262. } // if:
  263. hr = THR( HrSetWbemServices( *ppunkOut, pIWbemServicesIn ) );
  264. if ( FAILED( hr ) )
  265. {
  266. goto Exit;
  267. } // if:
  268. Exit:
  269. HRETURN( hr );
  270. } //*** HrCreateNetworksEnum
  271. /*
  272. /////////////////////////////////////////////////////////////////////////////
  273. //++
  274. //
  275. // HrLoadOperatingSystemInfo
  276. //
  277. // Description:
  278. // Load the Win32_OperatingSystem object and determine which partition
  279. // were booted and have the OS installed on them.
  280. //
  281. // Arguments:
  282. // None.
  283. //
  284. // Return Value:
  285. // S_OK
  286. // Success.
  287. //
  288. // Win32 Error
  289. // something failed.
  290. //
  291. // Remarks:
  292. // None.
  293. //
  294. //--
  295. //////////////////////////////////////////////////////////////////////////////
  296. HRESULT
  297. HrLoadOperatingSystemInfo(
  298. IClusCfgCallback * picccIn,
  299. IWbemServices * pIWbemServicesIn,
  300. BSTR * pbstrBootDeviceOut,
  301. BSTR * pbstrSystemDeviceOut
  302. )
  303. {
  304. TraceFunc( "" );
  305. Assert( picccIn != NULL );
  306. Assert( pIWbemServicesIn != NULL );
  307. Assert( pbstrBootDeviceOut != NULL );
  308. Assert( pbstrSystemDeviceOut != NULL );
  309. HRESULT hr = S_OK;
  310. BSTR bstrClass;
  311. IEnumWbemClassObject * pOperatingSystems = NULL;
  312. ULONG ulReturned;
  313. IWbemClassObject * pOperatingSystem = NULL;
  314. int c;
  315. VARIANT var;
  316. HRESULT hrTemp;
  317. VariantInit( &var );
  318. bstrClass = TraceSysAllocString( L"Win32_OperatingSystem" );
  319. if ( bstrClass == NULL )
  320. {
  321. goto OutOfMemory;
  322. } // if:
  323. hr = THR( pIWbemServicesIn->CreateInstanceEnum( bstrClass, WBEM_FLAG_SHALLOW, NULL, &pOperatingSystems ) );
  324. if ( FAILED( hr ) )
  325. {
  326. hrTemp = THR( HrSendStatusReport(
  327. picccIn
  328. , TASKID_Major_Find_Devices
  329. , TASKID_Minor_WMI_OS_Qry_Failed
  330. , 0
  331. , 1
  332. , 1
  333. , hr
  334. , IDS_ERROR_WMI_OS_QRY_FAILED
  335. , IDS_ERROR_WMI_OS_QRY_FAILED_REF
  336. ) );
  337. if ( FAILED( hrTemp ) )
  338. {
  339. hr = hrTemp;
  340. } // if:
  341. goto Cleanup;
  342. } // if:
  343. for ( c = 1; ; c++ )
  344. {
  345. hr = pOperatingSystems->Next( WBEM_INFINITE, 1, &pOperatingSystem, &ulReturned );
  346. if ( ( hr == S_OK ) && ( ulReturned == 1 ) )
  347. {
  348. Assert( c < 2 ); // only expect one of these!
  349. hr = THR( HrGetWMIProperty( pOperatingSystem, L"BootDevice", VT_BSTR, &var ) );
  350. if ( FAILED( hr ) )
  351. {
  352. goto Cleanup;
  353. } // if:
  354. *pbstrBootDeviceOut = TraceSysAllocString( var.bstrVal );
  355. if ( *pbstrBootDeviceOut == NULL )
  356. {
  357. goto OutOfMemory;
  358. } // if:
  359. VariantClear( &var );
  360. hr = THR( HrGetWMIProperty( pOperatingSystem, L"SystemDevice", VT_BSTR, &var ) );
  361. if ( FAILED( hr ) )
  362. {
  363. goto Cleanup;
  364. } // if:
  365. *pbstrSystemDeviceOut = TraceSysAllocString( var.bstrVal );
  366. if ( *pbstrSystemDeviceOut == NULL )
  367. {
  368. goto OutOfMemory;
  369. } // if:
  370. pOperatingSystem->Release();
  371. pOperatingSystem = NULL;
  372. } // if:
  373. else if ( ( hr == S_FALSE ) && ( ulReturned == 0 ) )
  374. {
  375. hr = S_OK;
  376. break;
  377. } // else if:
  378. else
  379. {
  380. hrTemp = THR( HrSendStatusReport(
  381. picccIn
  382. , TASKID_Major_Find_Devices
  383. , TASKID_Minor_WMI_OS_Qry_Next_Failed
  384. , 0
  385. , 1
  386. , 1
  387. , hr
  388. , IDS_ERROR_WMI_OS_QRY_FAILED
  389. , IDS_ERROR_WMI_OS_QRY_FAILED_REF
  390. ) );
  391. if ( FAILED( hrTemp ) )
  392. {
  393. hr = hrTemp;
  394. } // if:
  395. goto Cleanup;
  396. } // else:
  397. } // for:
  398. goto Cleanup;
  399. OutOfMemory:
  400. hr = THR( E_OUTOFMEMORY );
  401. Cleanup:
  402. VariantClear( &var );
  403. if ( pOperatingSystem != NULL )
  404. {
  405. pOperatingSystem->Release();
  406. } // if:
  407. if ( pOperatingSystems != NULL )
  408. {
  409. pOperatingSystems->Release();
  410. } // if:
  411. TraceSysFreeString( bstrClass );
  412. HRETURN( hr );
  413. } //*** HrLoadOperatingSystemInfo
  414. */
  415. /////////////////////////////////////////////////////////////////////////////
  416. //++
  417. //
  418. // HrConvertDeviceVolumeToLogicalDisk
  419. //
  420. // Description:
  421. // Convert a device volume to a logical disk.
  422. //
  423. // Arguments:
  424. //
  425. //
  426. // Return Value:
  427. // S_OK
  428. // Success.
  429. //
  430. // Win32 Error
  431. // something failed.
  432. //
  433. // Remarks:
  434. // None.
  435. //
  436. //--
  437. //////////////////////////////////////////////////////////////////////////////
  438. HRESULT
  439. HrConvertDeviceVolumeToLogicalDisk(
  440. BSTR bstrDeviceVolumeIn,
  441. BSTR * pbstrLogicalDiskOut
  442. )
  443. {
  444. TraceFunc( "" );
  445. Assert( pbstrLogicalDiskOut != NULL );
  446. HRESULT hr = S_OK;
  447. BOOL fRet;
  448. size_t cchMountPoint;
  449. WCHAR * pszMountPoint = NULL;
  450. WCHAR szVolume[ MAX_PATH ];
  451. DWORD sc;
  452. DWORD cchPaths = 16;
  453. WCHAR * pszPaths = NULL;
  454. int c;
  455. DWORD cch;
  456. WCHAR * pszEOS = NULL;
  457. cchMountPoint = wcslen( g_szNameSpaceRoot ) + wcslen( bstrDeviceVolumeIn ) + 2;
  458. pszMountPoint = new WCHAR[ cchMountPoint ];
  459. if ( pszMountPoint == NULL )
  460. {
  461. goto OutOfMemory;
  462. } // if:
  463. hr = THR( StringCchCopyW( pszMountPoint, cchMountPoint, g_szNameSpaceRoot ) );
  464. if ( FAILED( hr ) )
  465. {
  466. goto Cleanup;
  467. } // if:
  468. hr = THR( StringCchCatExW( pszMountPoint, cchMountPoint, bstrDeviceVolumeIn, &pszEOS, NULL, 0 ) );
  469. if ( FAILED( hr ) )
  470. {
  471. goto Cleanup;
  472. } // if:
  473. //
  474. // Append a trailing \ and re-terminate the string.
  475. //
  476. *pszEOS = L'\\';
  477. *( pszEOS + 1 ) = L'\0';
  478. fRet = GetVolumeNameForVolumeMountPoint( pszMountPoint, szVolume, ARRAYSIZE( szVolume ) );
  479. if ( !fRet )
  480. {
  481. sc = TW32( GetLastError() );
  482. hr = HRESULT_FROM_WIN32( sc );
  483. LogMsg( L"[SRV] GetVolumeNameForVolumeMountPoint() failed. Mount point is '%ws'. (hr = %#08x)", pszMountPoint, hr );
  484. //
  485. // GetVolumeNameForVolumeMountPoint() is no longer supported for IA64 EFI partitions. If the error is
  486. // ERROR_INVALID_FUNCTION then we should try to get the device number using an IOCTL.
  487. //
  488. if ( HRESULT_CODE( hr ) == ERROR_INVALID_FUNCTION )
  489. {
  490. LogMsg( L"[SRV] Device volume '%ws' must be an IA64 EFI volume.", bstrDeviceVolumeIn );
  491. } // if:
  492. goto Cleanup;
  493. } // if:
  494. pszPaths = new WCHAR[ cchPaths ];
  495. if ( pszPaths == NULL )
  496. {
  497. goto OutOfMemory;
  498. } // if:
  499. //
  500. // KB: 16 JAN 2001 GalenB
  501. //
  502. // Since the device name that is passed in is for a volume there will never be more than
  503. // one logical disk in the multisz pszPaths.
  504. //
  505. for ( c = 0; ; c++ )
  506. {
  507. Assert( c < 2 ); // expect to go through here no more than twice.
  508. fRet = GetVolumePathNamesForVolumeName( szVolume, pszPaths, cchPaths, &cch );
  509. if ( fRet )
  510. {
  511. break;
  512. } // if:
  513. else
  514. {
  515. sc = GetLastError();
  516. if ( sc == ERROR_MORE_DATA )
  517. {
  518. cchPaths = cch;
  519. delete [] pszPaths;
  520. pszPaths = new WCHAR[ cchPaths ];
  521. if ( pszPaths == NULL )
  522. {
  523. goto OutOfMemory;
  524. } // if:
  525. continue;
  526. } // if:
  527. hr = THR( HRESULT_FROM_WIN32( sc ) );
  528. LogMsg( L"[SRV] GetVolumePathNamesForVolumeName() failed. Volume is is '%ws'. (hr = %#08x)", szVolume, hr );
  529. goto Cleanup;
  530. } // else:
  531. } // for:
  532. *pbstrLogicalDiskOut = TraceSysAllocString( pszPaths );
  533. if ( *pbstrLogicalDiskOut == NULL )
  534. {
  535. goto OutOfMemory;
  536. } // if:
  537. goto Cleanup;
  538. OutOfMemory:
  539. hr = THR( E_OUTOFMEMORY );
  540. Cleanup:
  541. delete [] pszPaths;
  542. delete [] pszMountPoint;
  543. HRETURN( hr );
  544. } //*** HrConvertDeviceVolumeToLogicalDisk
  545. /////////////////////////////////////////////////////////////////////////////
  546. //++
  547. //
  548. // HrConvertDeviceVolumeToWMIDeviceID
  549. //
  550. // Description:
  551. // Since IA64 EFI partitions no longer support the call to
  552. // GetVolumeNameForVolumeMountPoint() to convert the device name
  553. // into a logical disk, since there will not longer be logical disks
  554. // for these partitions.
  555. //
  556. // Arguments:
  557. //
  558. //
  559. // Return Value:
  560. // S_OK
  561. // Success
  562. //
  563. // Remarks:
  564. // None.
  565. //
  566. //--
  567. //////////////////////////////////////////////////////////////////////////////
  568. HRESULT
  569. HrConvertDeviceVolumeToWMIDeviceID(
  570. BSTR bstrDeviceVolumeIn,
  571. BSTR * pbstrWMIDeviceIDOut
  572. )
  573. {
  574. TraceFunc( "" );
  575. HRESULT hr = S_OK;
  576. HANDLE hVolume = NULL;
  577. DWORD dwSize;
  578. DWORD sc;
  579. STORAGE_DEVICE_NUMBER sdnDevNumber;
  580. BOOL fRet;
  581. size_t cchDevice;
  582. WCHAR * pszDevice = NULL;
  583. WCHAR sz[ 64 ];
  584. cchDevice = wcslen( g_szNameSpaceRoot ) + wcslen( bstrDeviceVolumeIn ) + 2;
  585. pszDevice = new WCHAR[ cchDevice ];
  586. if ( pszDevice == NULL )
  587. {
  588. goto OutOfMemory;
  589. } // if:
  590. hr = THR( StringCchCopyW( pszDevice, cchDevice, g_szNameSpaceRoot ) );
  591. if ( FAILED( hr ) )
  592. {
  593. goto Cleanup;
  594. } // if:
  595. hr = THR( StringCchCatW( pszDevice, cchDevice, bstrDeviceVolumeIn ) );
  596. if ( FAILED( hr ) )
  597. {
  598. goto Cleanup;
  599. } // if:
  600. //
  601. // get handle to partition
  602. //
  603. hVolume = CreateFileW(
  604. pszDevice
  605. , GENERIC_READ
  606. , FILE_SHARE_READ
  607. , NULL
  608. , OPEN_EXISTING
  609. , FILE_ATTRIBUTE_NORMAL
  610. , NULL
  611. );
  612. if ( hVolume == INVALID_HANDLE_VALUE )
  613. {
  614. sc = TW32( GetLastError() );
  615. hr = HRESULT_FROM_WIN32( sc );
  616. goto Cleanup;
  617. } // if:
  618. //
  619. // issue storage class ioctl to get drive and partition numbers
  620. // for this device
  621. //
  622. fRet = DeviceIoControl(
  623. hVolume
  624. , IOCTL_STORAGE_GET_DEVICE_NUMBER
  625. , NULL
  626. , 0
  627. , &sdnDevNumber
  628. , sizeof( sdnDevNumber )
  629. , &dwSize
  630. , NULL
  631. );
  632. if ( !fRet )
  633. {
  634. sc = TW32( GetLastError() );
  635. hr = HRESULT_FROM_WIN32( sc );
  636. goto Cleanup;
  637. } // if:
  638. hr = THR( StringCchPrintfW( sz, ARRAYSIZE( sz ), g_szPhysicalDriveFormat, sdnDevNumber.DeviceNumber ) );
  639. if ( FAILED( hr ) )
  640. {
  641. goto Cleanup;
  642. } // if:
  643. *pbstrWMIDeviceIDOut = SysAllocString( sz );
  644. if ( *pbstrWMIDeviceIDOut == NULL )
  645. {
  646. goto OutOfMemory;
  647. } // if:
  648. goto Cleanup;
  649. OutOfMemory:
  650. hr = THR( E_OUTOFMEMORY );
  651. LogMsg( L"[SRV] HrConvertDeviceVolumeToWMIDeviceID() is out of memory. (hr = %#08x)", hr );
  652. Cleanup:
  653. if ( hVolume != NULL )
  654. {
  655. CloseHandle( hVolume );
  656. } // if:
  657. delete [] pszDevice;
  658. HRETURN( hr );
  659. } //*** HrConvertDeviceVolumeToWMIDeviceID
  660. /////////////////////////////////////////////////////////////////////////////
  661. //++
  662. //
  663. // HrGetPageFileLogicalDisks
  664. //
  665. // Description:
  666. // Mark the drives that have paging files on them.
  667. //
  668. // Arguments:
  669. //
  670. //
  671. // Return Value:
  672. // S_OK
  673. // Success.
  674. //
  675. // Remarks:
  676. // None.
  677. //
  678. //--
  679. //////////////////////////////////////////////////////////////////////////////
  680. HRESULT
  681. HrGetPageFileLogicalDisks(
  682. IClusCfgCallback * picccIn,
  683. IWbemServices * pIWbemServicesIn,
  684. WCHAR szLogicalDisksOut[ 26 ],
  685. int * pcLogicalDisksOut
  686. )
  687. {
  688. TraceFunc( "" );
  689. HRESULT hr = S_FALSE;
  690. IEnumWbemClassObject * pPagingFiles = NULL;
  691. BSTR bstrClass;
  692. ULONG ulReturned;
  693. IWbemClassObject * pPagingFile = NULL;
  694. VARIANT var;
  695. int idx;
  696. HRESULT hrTemp;
  697. bstrClass = TraceSysAllocString( L"Win32_PageFile" );
  698. if ( bstrClass == NULL )
  699. {
  700. hr = THR( E_OUTOFMEMORY );
  701. goto Cleanup;
  702. } // if:
  703. hr = THR( pIWbemServicesIn->CreateInstanceEnum( bstrClass, WBEM_FLAG_SHALLOW, NULL, &pPagingFiles ) );
  704. if ( FAILED( hr ) )
  705. {
  706. hrTemp = THR( HrSendStatusReport(
  707. picccIn
  708. , TASKID_Major_Find_Devices
  709. , TASKID_Minor_WMI_PageFile_Qry_Failed
  710. , 0
  711. , 1
  712. , 1
  713. , hr
  714. , IDS_ERROR_WMI_PAGEFILE_QRY_FAILED
  715. , IDS_ERROR_WMI_PAGEFILE_QRY_FAILED_REF
  716. ) );
  717. if ( FAILED( hrTemp ) )
  718. {
  719. hr = hrTemp;
  720. } // if:
  721. goto Cleanup;
  722. } // if:
  723. VariantInit( &var );
  724. for ( idx = 0; idx < sizeof( szLogicalDisksOut ); idx++ )
  725. {
  726. hr = pPagingFiles->Next( WBEM_INFINITE, 1, &pPagingFile, &ulReturned );
  727. if ( ( hr == S_OK ) && ( ulReturned == 1 ) )
  728. {
  729. VariantClear( &var );
  730. hr = THR( HrGetWMIProperty( pPagingFile, L"Drive", VT_BSTR, &var ) );
  731. if ( FAILED( hr ) )
  732. {
  733. goto Cleanup;
  734. } // if:
  735. CharUpper( var.bstrVal );
  736. szLogicalDisksOut[ idx ] = var.bstrVal[ 0 ];
  737. pPagingFile->Release();
  738. pPagingFile = NULL;
  739. } // if:
  740. else if ( ( hr == S_FALSE ) && ( ulReturned == 0 ) )
  741. {
  742. hr = S_OK;
  743. break;
  744. } // else if:
  745. else
  746. {
  747. hrTemp = THR( HrSendStatusReport(
  748. picccIn
  749. , TASKID_Major_Find_Devices
  750. , TASKID_Minor_WMI_PageFile_Qry_Next_Failed
  751. , 0
  752. , 1
  753. , 1
  754. , hr
  755. , IDS_ERROR_WMI_PAGEFILE_QRY_FAILED
  756. , IDS_ERROR_WMI_PAGEFILE_QRY_FAILED_REF
  757. ) );
  758. if ( FAILED( hrTemp ) )
  759. {
  760. hr = hrTemp;
  761. } // if:
  762. goto Cleanup;
  763. } // else:
  764. } // for:
  765. if ( pcLogicalDisksOut != NULL )
  766. {
  767. *pcLogicalDisksOut = idx;
  768. } // if:
  769. Cleanup:
  770. VariantClear( &var );
  771. TraceSysFreeString( bstrClass );
  772. if ( pPagingFile != NULL )
  773. {
  774. pPagingFile->Release();
  775. } // if:
  776. if ( pPagingFiles != NULL )
  777. {
  778. pPagingFiles->Release();
  779. } // if:
  780. HRETURN( hr );
  781. } //*** HrGetPageFileLogicalDisks
  782. /////////////////////////////////////////////////////////////////////////////
  783. //++
  784. //
  785. // HrGetSystemDevice
  786. //
  787. // Description:
  788. // Returns the system (booted) device.
  789. //
  790. // Arguments:
  791. //
  792. //
  793. // Return Value:
  794. // None.
  795. //
  796. // Remarks:
  797. // None.
  798. //
  799. //--
  800. //////////////////////////////////////////////////////////////////////////////
  801. HRESULT
  802. HrGetSystemDevice( BSTR * pbstrSystemDeviceOut )
  803. {
  804. TraceFunc( "" );
  805. Assert( pbstrSystemDeviceOut != NULL );
  806. HRESULT hr = S_OK;
  807. DWORD sc;
  808. HKEY hKey = NULL;
  809. WCHAR * pszSystemDevice = NULL;
  810. DWORD cbSystemDevice = 0; // no need to but prefix complains #318170
  811. DWORD dwType;
  812. sc = TW32( RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"System\\Setup", 0, KEY_READ, &hKey ) );
  813. if ( sc != ERROR_SUCCESS )
  814. {
  815. hr = HRESULT_FROM_WIN32( sc );
  816. LogMsg( L"[SRV] RegOpenKeyEx() failed. (hr = %#08x)", hr );
  817. goto Cleanup;
  818. } // if:
  819. sc = TW32( RegQueryValueEx( hKey, L"SystemPartition", NULL, NULL, NULL, &cbSystemDevice ) );
  820. if ( sc != ERROR_SUCCESS )
  821. {
  822. hr = HRESULT_FROM_WIN32( sc );
  823. LogMsg( L"[SRV] RegQueryValueEx() failed. (hr = %#08x)", hr );
  824. goto Cleanup;
  825. } // if:
  826. pszSystemDevice = new WCHAR[ cbSystemDevice / sizeof( WCHAR ) ];
  827. if ( pszSystemDevice == NULL )
  828. {
  829. goto OutOfMemory;
  830. } // if:
  831. sc = TW32( RegQueryValueEx( hKey, L"SystemPartition", NULL, &dwType, (BYTE *) pszSystemDevice, &cbSystemDevice ) );
  832. if ( sc != ERROR_SUCCESS )
  833. {
  834. hr = HRESULT_FROM_WIN32( sc );
  835. LogMsg( L"[SRV] RegQueryValueEx() failed. (hr = %#08x)", hr );
  836. goto Cleanup;
  837. } // if:
  838. if (dwType != REG_SZ)
  839. {
  840. hr = ERROR_DATATYPE_MISMATCH;
  841. LogMsg( L"[SRV] RegQueryValueEx() invalid type %d", dwType);
  842. goto Cleanup;
  843. } // if:
  844. *pbstrSystemDeviceOut = TraceSysAllocString( pszSystemDevice );
  845. if ( *pbstrSystemDeviceOut == NULL )
  846. {
  847. goto OutOfMemory;
  848. } // if:
  849. goto Cleanup;
  850. OutOfMemory:
  851. hr = THR( E_OUTOFMEMORY );
  852. LogMsg( L"[SRV] HrGetSystemDevice() is out of memory. (hr = %#08x)", hr );
  853. Cleanup:
  854. delete [] pszSystemDevice;
  855. if ( hKey != NULL )
  856. {
  857. RegCloseKey( hKey );
  858. } // if:
  859. HRETURN( hr );
  860. } //*** HrGetSystemDevice
  861. /////////////////////////////////////////////////////////////////////////////
  862. //++
  863. //
  864. // HrGetBootLogicalDisk
  865. //
  866. // Description:
  867. // Returns the boot (system) logical disk.
  868. //
  869. // Arguments:
  870. //
  871. //
  872. // Return Value:
  873. // None.
  874. //
  875. // Remarks:
  876. // None.
  877. //
  878. //--
  879. //////////////////////////////////////////////////////////////////////////////
  880. HRESULT
  881. HrGetBootLogicalDisk( BSTR * pbstrBootLogicalDiskOut )
  882. {
  883. TraceFunc( "" );
  884. Assert( pbstrBootLogicalDiskOut != NULL );
  885. HRESULT hr = S_OK;
  886. DWORD sc;
  887. WCHAR szWindowsDir[ MAX_PATH ];
  888. WCHAR szVolume[ MAX_PATH ];
  889. BOOL fRet;
  890. sc = GetWindowsDirectoryW( szWindowsDir, ARRAYSIZE( szWindowsDir ) );
  891. if ( sc == 0 )
  892. {
  893. sc = TW32( GetLastError() );
  894. hr = HRESULT_FROM_WIN32( sc );
  895. LogMsg( L"[SRV] GetWindowsDirectory() failed. (hr = %#08x)", hr );
  896. goto Exit;
  897. } // if:
  898. fRet = GetVolumePathName( szWindowsDir, szVolume, ARRAYSIZE( szVolume ) );
  899. if ( !fRet )
  900. {
  901. sc = TW32( GetLastError() );
  902. hr = HRESULT_FROM_WIN32( sc );
  903. LogMsg( L"[SRV] GetVolumePathName() failed. (hr = %#08x)", hr );
  904. goto Exit;
  905. } // if:
  906. *pbstrBootLogicalDiskOut = TraceSysAllocString( szVolume );
  907. if ( *pbstrBootLogicalDiskOut == NULL )
  908. {
  909. hr = THR( E_OUTOFMEMORY );
  910. } // if:
  911. Exit:
  912. HRETURN( hr );
  913. } //*** HrGetBootLogicalDisk
  914. /////////////////////////////////////////////////////////////////////////////
  915. //++
  916. //
  917. // HrCheckSecurity
  918. //
  919. // Description:
  920. // Checks the server security level.
  921. //
  922. // Arguments:
  923. //
  924. //
  925. // Return Value:
  926. // S_OK
  927. // Secutity is high enough.
  928. //
  929. // E_ACCESSDENIED
  930. // Security is not high enough.
  931. //
  932. // Remarks:
  933. // None.
  934. //
  935. //--
  936. //////////////////////////////////////////////////////////////////////////////
  937. HRESULT
  938. HrCheckSecurity( void )
  939. {
  940. TraceFunc( "" );
  941. HRESULT hr = S_OK;
  942. IServerSecurity * piss = NULL;
  943. DWORD dwAuthnSvc;
  944. DWORD dwAuthzSvc;
  945. BSTR bstrServerPrincName = NULL;
  946. DWORD dwAuthnLevel;
  947. DWORD dwImpersonationLevel;
  948. void * pvPrivs = NULL;
  949. DWORD dwCapabilities;
  950. hr = THR( CoGetCallContext( IID_IServerSecurity, reinterpret_cast< void ** >( &piss ) ) );
  951. if ( FAILED( hr ) )
  952. {
  953. goto Cleanup;
  954. } // if:
  955. hr = THR( piss->QueryBlanket(
  956. &dwAuthnSvc,
  957. &dwAuthzSvc,
  958. &bstrServerPrincName,
  959. &dwAuthnLevel,
  960. &dwImpersonationLevel,
  961. &pvPrivs,
  962. &dwCapabilities ) );
  963. Cleanup:
  964. SysFreeString( bstrServerPrincName );
  965. if ( piss != NULL )
  966. {
  967. piss->Release();
  968. } // if:
  969. HRETURN( hr );
  970. } //*** HrCheckSecurity
  971. /////////////////////////////////////////////////////////////////////////////
  972. //++
  973. //
  974. // HrGetCrashDumpLogicalDisk
  975. //
  976. // Description:
  977. // Returns the logical disk of the system crash dump file.
  978. //
  979. // Arguments:
  980. // pbstrCrashDumpLogicalDiskOut
  981. //
  982. // Return Value:
  983. // S_OK
  984. // Success.
  985. //
  986. // Other HRESULTs as errors.
  987. //
  988. // Remarks:
  989. // None.
  990. //
  991. //--
  992. //////////////////////////////////////////////////////////////////////////////
  993. HRESULT
  994. HrGetCrashDumpLogicalDisk(
  995. BSTR * pbstrCrashDumpLogicalDiskOut
  996. )
  997. {
  998. TraceFunc( "" );
  999. Assert( pbstrCrashDumpLogicalDiskOut != NULL );
  1000. HRESULT hr = S_OK;
  1001. DWORD sc;
  1002. HKEY hKey = NULL;
  1003. WCHAR * pszDumpFile = NULL;
  1004. WCHAR * pszExpandedDumpFile = NULL;
  1005. DWORD cbDumpFile = 0; // no need to but prefix complains #318170
  1006. BSTR bstr = NULL;
  1007. DWORD dwType;
  1008. sc = TW32( RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\CrashControl", 0, KEY_READ, &hKey ) );
  1009. if ( sc != ERROR_SUCCESS )
  1010. {
  1011. hr = HRESULT_FROM_WIN32( sc );
  1012. LogMsg( L"[SRV] [HrGetCrashDumpLogicalDisk] RegOpenKeyEx() failed. (hr = %#08x)", hr );
  1013. goto Cleanup;
  1014. } // if:
  1015. sc = TW32( RegQueryValueEx( hKey, L"DumpFile", NULL, NULL, NULL, &cbDumpFile ) );
  1016. if ( sc != ERROR_SUCCESS )
  1017. {
  1018. hr = HRESULT_FROM_WIN32( sc );
  1019. LogMsg( L"[SRV] [HrGetCrashDumpLogicalDisk] RegQueryValueEx() failed. (hr = %#08x)", hr );
  1020. goto Cleanup;
  1021. } // if:
  1022. pszDumpFile = new WCHAR[ cbDumpFile / sizeof( WCHAR ) ];
  1023. if ( pszDumpFile == NULL )
  1024. {
  1025. goto OutOfMemory;
  1026. } // if:
  1027. sc = TW32( RegQueryValueEx( hKey, L"DumpFile", NULL, &dwType, (BYTE *) pszDumpFile, &cbDumpFile ) );
  1028. if ( sc != ERROR_SUCCESS )
  1029. {
  1030. hr = HRESULT_FROM_WIN32( sc );
  1031. LogMsg( L"[SRV] [HrGetCrashDumpLogicalDisk] RegQueryValueEx() failed. (hr = %#08x)", hr );
  1032. goto Cleanup;
  1033. } // if:
  1034. if (dwType != REG_SZ && dwType != REG_EXPAND_SZ)
  1035. {
  1036. hr = ERROR_DATATYPE_MISMATCH;
  1037. LogMsg( L"[SRV] RegQueryValueEx() invalid type %d", dwType);
  1038. goto Cleanup;
  1039. } // if:
  1040. pszExpandedDumpFile = ClRtlExpandEnvironmentStrings( pszDumpFile ); // must use LocalFree()
  1041. if ( pszExpandedDumpFile == NULL )
  1042. {
  1043. hr = HRESULT_FROM_WIN32( TW32( GetLastError() ) );
  1044. goto Cleanup;
  1045. } // if:
  1046. bstr = TraceSysAllocString( pszExpandedDumpFile );
  1047. if ( bstr == NULL )
  1048. {
  1049. goto OutOfMemory;
  1050. } // if:
  1051. *pbstrCrashDumpLogicalDiskOut = bstr;
  1052. bstr = NULL;
  1053. goto Cleanup;
  1054. OutOfMemory:
  1055. hr = THR( E_OUTOFMEMORY );
  1056. LogMsg( L"[SRV] [HrGetCrashDumpLogicalDisk] is out of memory. (hr = %#08x)", hr );
  1057. Cleanup:
  1058. LocalFree( pszExpandedDumpFile );
  1059. TraceSysFreeString( bstr );
  1060. delete [] pszDumpFile;
  1061. if ( hKey != NULL )
  1062. {
  1063. RegCloseKey( hKey );
  1064. } // if:
  1065. HRETURN( hr );
  1066. } //*** HrGetCrashDumpLogicalDisk
  1067. /*
  1068. /////////////////////////////////////////////////////////////////////////////
  1069. //++
  1070. //
  1071. // HrGetVolumeInformation
  1072. //
  1073. // Description:
  1074. // Wrapper for the Win32 API GetVolumeInformation.
  1075. //
  1076. // Arguments:
  1077. // pcszRootPathIn
  1078. // The path to the volume to get the information about.
  1079. //
  1080. // pdwFlagsOut
  1081. // The flags returned.
  1082. //
  1083. // pbstrFileSystemOut
  1084. // The filesystem on the volume.
  1085. //
  1086. // Return Value:
  1087. // S_OK
  1088. // Success.
  1089. //
  1090. // HRESULT errors.
  1091. //
  1092. // Remarks:
  1093. //
  1094. //--
  1095. //////////////////////////////////////////////////////////////////////////////
  1096. HRESULT
  1097. HrGetVolumeInformation(
  1098. const WCHAR * pcszRootPathIn
  1099. , DWORD * pdwFlagsOut
  1100. , BSTR * pbstrFileSystemOut
  1101. )
  1102. {
  1103. TraceFunc( "" );
  1104. Assert( pcszRootPathIn != NULL );
  1105. HRESULT hr = S_OK;
  1106. int cTemp;
  1107. BOOL fRet;
  1108. WCHAR * psz = NULL;
  1109. DWORD cch = 32;
  1110. DWORD sc = ERROR_SUCCESS;
  1111. DWORD dwFlags = 0;
  1112. psz = new WCHAR[ cch ];
  1113. if ( psz == NULL )
  1114. {
  1115. hr = THR( E_OUTOFMEMORY );
  1116. goto Cleanup;
  1117. } // if:
  1118. for ( cTemp = 0 ; cTemp < 3; cTemp++ )
  1119. {
  1120. fRet = GetVolumeInformationW(
  1121. pcszRootPathIn
  1122. , NULL
  1123. , 0
  1124. , NULL
  1125. , NULL
  1126. , &dwFlags
  1127. , psz
  1128. , cch
  1129. );
  1130. if ( fRet == FALSE )
  1131. {
  1132. sc = GetLastError();
  1133. if ( sc == ERROR_BAD_LENGTH )
  1134. {
  1135. //
  1136. // Grow the buffer and try again.
  1137. //
  1138. cch += 32;
  1139. delete [] psz;
  1140. psz = new WCHAR[ cch ];
  1141. if ( psz == NULL )
  1142. {
  1143. hr = THR( E_OUTOFMEMORY );
  1144. goto Cleanup;
  1145. } // if:
  1146. continue;
  1147. } // if:
  1148. else
  1149. {
  1150. TW32( sc );
  1151. hr = HRESULT_FROM_WIN32( sc );
  1152. goto Cleanup;
  1153. } // else:
  1154. } // if:
  1155. else
  1156. {
  1157. sc = ERROR_SUCCESS;
  1158. break;
  1159. } // else:
  1160. } // for:
  1161. if ( sc != ERROR_SUCCESS )
  1162. {
  1163. TW32( sc );
  1164. hr = HRESULT_FROM_WIN32( sc );
  1165. goto Cleanup;
  1166. } // if:
  1167. if ( pdwFlagsOut != NULL )
  1168. {
  1169. *pdwFlagsOut = dwFlags;
  1170. } // if:
  1171. if ( pbstrFileSystemOut != NULL )
  1172. {
  1173. *pbstrFileSystemOut = TraceSysAllocString( psz );
  1174. if ( *pbstrFileSystemOut == NULL )
  1175. {
  1176. hr = THR( E_OUTOFMEMORY );
  1177. goto Cleanup;
  1178. } // if:
  1179. } // if:
  1180. Cleanup:
  1181. delete [] psz;
  1182. HRETURN( hr );
  1183. } //*** HrGetVolumeInformation
  1184. */
  1185. /////////////////////////////////////////////////////////////////////////////
  1186. //++
  1187. //
  1188. // TraceWMIProperties
  1189. //
  1190. // Description:
  1191. // Trace the properties to the debugger.
  1192. //
  1193. // Arguments:
  1194. //
  1195. //
  1196. // Return Value:
  1197. // None.
  1198. //
  1199. // Remarks:
  1200. // None.
  1201. //
  1202. //--
  1203. //////////////////////////////////////////////////////////////////////////////
  1204. #ifdef DEBUG
  1205. void
  1206. TraceProperties( IWbemClassObject * pDiskIn )
  1207. {
  1208. TraceFunc( "" );
  1209. HRESULT hr = S_FALSE;
  1210. VARIANT var;
  1211. BSTR bstrPropName;
  1212. CIMTYPE cimType;
  1213. LONG lFlags;
  1214. VariantInit( &var );
  1215. hr = THR( pDiskIn->BeginEnumeration( 0 ) );
  1216. if ( FAILED( hr ) )
  1217. {
  1218. goto Exit;
  1219. } // if:
  1220. for ( ; ; )
  1221. {
  1222. VariantClear( &var );
  1223. hr = pDiskIn->Next( 0, &bstrPropName, &var, &cimType, &lFlags );
  1224. if ( FAILED( hr ) )
  1225. {
  1226. break;
  1227. } // if:
  1228. else if ( hr == S_OK )
  1229. {
  1230. if ( var.vt == VT_BSTR )
  1231. {
  1232. DebugMsg( L"Property %ws = %ws", bstrPropName, var.bstrVal );
  1233. } // if:
  1234. if ( var.vt == VT_I4 )
  1235. {
  1236. DebugMsg( L"Property %ws = %d", bstrPropName, var.iVal );
  1237. } // if:
  1238. if ( var.vt == VT_BOOL )
  1239. {
  1240. if ( var.boolVal == VARIANT_TRUE )
  1241. {
  1242. DebugMsg( L"Property %ws = True", bstrPropName );
  1243. } // if:
  1244. else
  1245. {
  1246. DebugMsg( L"Property %ws = False", bstrPropName );
  1247. } // else:
  1248. } // if:
  1249. if ( var.vt == VT_NULL )
  1250. {
  1251. DebugMsg( L"Property %ws = NULL", bstrPropName );
  1252. } // if:
  1253. TraceSysFreeString( bstrPropName );
  1254. VariantClear( &var );
  1255. } // else if:
  1256. else
  1257. {
  1258. break;
  1259. } // else:
  1260. } // for:
  1261. Exit:
  1262. VariantClear( &var );
  1263. TraceFuncExit( );
  1264. } //*** TraceWMIProperties
  1265. #endif