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.

832 lines
21 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // EvictNotify.cpp
  7. //
  8. // Description:
  9. // This file contains the implementation of the CEvictNotify
  10. // class.
  11. //
  12. // Maintained By:
  13. // Galen Barbee (GalenB) 20-SEP-2001
  14. //
  15. //////////////////////////////////////////////////////////////////////////////
  16. //////////////////////////////////////////////////////////////////////////////
  17. // Include Files
  18. //////////////////////////////////////////////////////////////////////////////
  19. // The precompiled header for this library
  20. #include "Pch.h"
  21. // The header file for this class
  22. #include "EvictNotify.h"
  23. #include "clusrtl.h"
  24. // For IClusCfgNodeInfo and related interfaces
  25. #include <ClusCfgServer.h>
  26. // For IClusCfgServer and related interfaces
  27. #include <ClusCfgPrivate.h>
  28. // For CClCfgSrvLogger
  29. #include <Logger.h>
  30. //////////////////////////////////////////////////////////////////////////////
  31. // Macro Definitions
  32. //////////////////////////////////////////////////////////////////////////////
  33. DEFINE_THISCLASS( "CEvictNotify" );
  34. //////////////////////////////////////////////////////////////////////////////
  35. //++
  36. //
  37. // CEvictNotify::CEvictNotify
  38. //
  39. // Description:
  40. // Constructor of the CEvictNotify class. This initializes
  41. // the m_cRef variable to 1 instead of 0 to account of possible
  42. // QueryInterface failure in DllGetClassObject.
  43. //
  44. // Arguments:
  45. // None.
  46. //
  47. // Return Value:
  48. // None.
  49. //
  50. // Remarks:
  51. // None.
  52. //
  53. //--
  54. //////////////////////////////////////////////////////////////////////////////
  55. CEvictNotify::CEvictNotify( void )
  56. : m_cRef( 1 )
  57. {
  58. TraceFunc( "" );
  59. m_bstrNodeName = NULL;
  60. m_plLogger = NULL;
  61. // Increment the count of components in memory so the DLL hosting this
  62. // object cannot be unloaded.
  63. InterlockedIncrement( &g_cObjects );
  64. TraceFlow1( "Component count = %d.", g_cObjects );
  65. TraceFuncExit();
  66. } //*** CEvictNotify::CEvictNotify
  67. //////////////////////////////////////////////////////////////////////////////
  68. //++
  69. //
  70. // CEvictNotify::~CEvictNotify
  71. //
  72. // Description:
  73. // Destructor of the CEvictNotify class.
  74. //
  75. // Arguments:
  76. // None.
  77. //
  78. // Return Value:
  79. // None.
  80. //
  81. // Remarks:
  82. // None.
  83. //
  84. //--
  85. //////////////////////////////////////////////////////////////////////////////
  86. CEvictNotify::~CEvictNotify( void )
  87. {
  88. TraceFunc( "" );
  89. if ( m_plLogger != NULL )
  90. {
  91. m_plLogger->Release();
  92. } // if:
  93. TraceSysFreeString( m_bstrNodeName );
  94. // There's going to be one less component in memory. Decrement component count.
  95. InterlockedDecrement( &g_cObjects );
  96. TraceFlow1( "Component count = %d.", g_cObjects );
  97. TraceFuncExit();
  98. } //*** CEvictNotify::~CEvictNotify
  99. //////////////////////////////////////////////////////////////////////////////
  100. //++
  101. //
  102. // HRESULT
  103. // CEvictNotify::S_HrCreateInstance(
  104. // IUnknown ** ppunkOut
  105. // )
  106. //
  107. // Description:
  108. // Creates a CEvictNotify instance.
  109. //
  110. // Arguments:
  111. // ppunkOut
  112. // The IUnknown interface of the new object.
  113. //
  114. // Return Values:
  115. // S_OK
  116. // Success.
  117. //
  118. // E_OUTOFMEMORY
  119. // Not enough memory to create the object.
  120. //
  121. // other HRESULTs
  122. // Object initialization failed.
  123. //
  124. //--
  125. //////////////////////////////////////////////////////////////////////////////
  126. HRESULT
  127. CEvictNotify::S_HrCreateInstance( IUnknown ** ppunkOut )
  128. {
  129. TraceFunc( "" );
  130. Assert( ppunkOut != NULL );
  131. HRESULT hr = S_OK;
  132. CEvictNotify * pEvictNotify = NULL;
  133. if ( ppunkOut == NULL )
  134. {
  135. hr = THR( E_POINTER );
  136. goto Cleanup;
  137. }
  138. // Allocate memory for the new object.
  139. pEvictNotify = new CEvictNotify();
  140. if ( pEvictNotify == NULL )
  141. {
  142. hr = THR( E_OUTOFMEMORY );
  143. goto Cleanup;
  144. } // if: out of memory
  145. // Initialize the new object.
  146. hr = THR( pEvictNotify->HrInit() );
  147. if ( FAILED( hr ) )
  148. {
  149. goto Cleanup;
  150. } // if: the object could not be initialized.
  151. hr = THR( pEvictNotify->QueryInterface( IID_IUnknown, reinterpret_cast< void ** >( ppunkOut ) ) );
  152. if ( FAILED( hr ) )
  153. {
  154. goto Cleanup;
  155. }
  156. Cleanup:
  157. if ( pEvictNotify != NULL )
  158. {
  159. pEvictNotify->Release();
  160. } // if: the pointer to the notification object is not NULL
  161. HRETURN( hr );
  162. } //*** CEvictNotify::S_HrCreateInstance
  163. //////////////////////////////////////////////////////////////////////////////
  164. //++
  165. //
  166. // CEvictNotify::AddRef
  167. //
  168. // Description:
  169. // Increment the reference count of this object by one.
  170. //
  171. // Arguments:
  172. // None.
  173. //
  174. // Return Value:
  175. // The new reference count.
  176. //
  177. // Remarks:
  178. // None.
  179. //
  180. //--
  181. //////////////////////////////////////////////////////////////////////////////
  182. STDMETHODIMP_( ULONG )
  183. CEvictNotify::AddRef( void )
  184. {
  185. TraceFunc( "[IUnknown]" );
  186. InterlockedIncrement( &m_cRef );
  187. CRETURN( m_cRef );
  188. } //*** CEvictNotify::AddRef
  189. //////////////////////////////////////////////////////////////////////////////
  190. //++
  191. //
  192. // CEvictNotify::Release
  193. //
  194. // Description:
  195. // Decrement the reference count of this object by one.
  196. //
  197. // Arguments:
  198. // None.
  199. //
  200. // Return Value:
  201. // The new reference count.
  202. //
  203. // Remarks:
  204. // None.
  205. //
  206. //--
  207. //////////////////////////////////////////////////////////////////////////////
  208. STDMETHODIMP_( ULONG )
  209. CEvictNotify::Release( void )
  210. {
  211. TraceFunc( "[IUnknown]" );
  212. LONG cRef;
  213. cRef = InterlockedDecrement( &m_cRef );
  214. if ( cRef == 0 )
  215. {
  216. TraceDo( delete this );
  217. } // if: reference count decremented to zero
  218. CRETURN( cRef );
  219. } //*** CEvictNotify::Release
  220. //////////////////////////////////////////////////////////////////////////////
  221. //++
  222. //
  223. // CEvictNotify::QueryInterface
  224. //
  225. // Description:
  226. // Query this object for the passed in interface.
  227. //
  228. // Arguments:
  229. // riidIn
  230. // Id of interface requested.
  231. //
  232. // ppvOut
  233. // Pointer to the requested interface.
  234. //
  235. // Return Value:
  236. // S_OK
  237. // If the interface is available on this object.
  238. //
  239. // E_NOINTERFACE
  240. // If the interface is not available.
  241. //
  242. // E_POINTER
  243. // ppvOut was NULL.
  244. //
  245. // Remarks:
  246. // None.
  247. //
  248. //--
  249. //////////////////////////////////////////////////////////////////////////////
  250. STDMETHODIMP
  251. CEvictNotify::QueryInterface(
  252. REFIID riidIn
  253. , void ** ppvOut
  254. )
  255. {
  256. TraceQIFunc( riidIn, ppvOut );
  257. HRESULT hr = S_OK;
  258. //
  259. // Validate arguments.
  260. //
  261. Assert( ppvOut != NULL );
  262. if ( ppvOut == NULL )
  263. {
  264. hr = THR( E_POINTER );
  265. goto Cleanup;
  266. }
  267. //
  268. // Handle known interfaces.
  269. //
  270. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  271. {
  272. *ppvOut = static_cast< IClusCfgEvictNotify * >( this );
  273. } // if: IUnknown
  274. else if ( IsEqualIID( riidIn, IID_IClusCfgEvictNotify ) )
  275. {
  276. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgEvictNotify, this, 0 );
  277. } // else if: IClusCfgEvictNotify
  278. else if ( IsEqualIID( riidIn, IID_IClusCfgCallback ) )
  279. {
  280. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgCallback, this, 0 );
  281. } // else if: IClusCfgCallback
  282. else
  283. {
  284. *ppvOut = NULL;
  285. hr = E_NOINTERFACE;
  286. } // else
  287. //
  288. // Add a reference to the interface if successful.
  289. //
  290. if ( SUCCEEDED( hr ) )
  291. {
  292. ((IUnknown *) *ppvOut)->AddRef();
  293. } // if: success
  294. Cleanup:
  295. QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
  296. } //*** CEvictNotify::QueryInterface
  297. //////////////////////////////////////////////////////////////////////////////
  298. //++
  299. //
  300. // CEvictNotify::HrInit
  301. //
  302. // Description:
  303. // Second phase of a two phase constructor.
  304. //
  305. // Arguments:
  306. // None.
  307. //
  308. // Return Value:
  309. // S_OK
  310. // If the call succeeded
  311. //
  312. // Other HRESULTs
  313. // If the call failed.
  314. //
  315. //--
  316. //////////////////////////////////////////////////////////////////////////////
  317. HRESULT
  318. CEvictNotify::HrInit( void )
  319. {
  320. TraceFunc( "" );
  321. HRESULT hr = S_OK;
  322. IServiceProvider * psp = NULL;
  323. ILogManager * plm = NULL;
  324. // IUnknown
  325. Assert( m_cRef == 1 );
  326. //
  327. // Get a ClCfgSrv ILogger instance.
  328. //
  329. hr = THR( CoCreateInstance(
  330. CLSID_ServiceManager
  331. , NULL
  332. , CLSCTX_INPROC_SERVER
  333. , IID_IServiceProvider
  334. , reinterpret_cast< void ** >( &psp )
  335. ) );
  336. if ( FAILED( hr ) )
  337. {
  338. goto Cleanup;
  339. }
  340. hr = THR( psp->TypeSafeQS( CLSID_LogManager, ILogManager, &plm ) );
  341. if ( FAILED( hr ) )
  342. {
  343. goto Cleanup;
  344. }
  345. hr = THR( plm->GetLogger( &m_plLogger ) );
  346. if ( FAILED( hr ) )
  347. {
  348. goto Cleanup;
  349. }
  350. //
  351. // Save off the local computer name.
  352. // If we can't get the fully-qualified name, just get the NetBIOS name.
  353. //
  354. hr = THR( HrGetComputerName(
  355. ComputerNameDnsFullyQualified
  356. , &m_bstrNodeName
  357. , TRUE // fBestEffortIn
  358. ) );
  359. if ( FAILED( hr ) )
  360. {
  361. THR( hr );
  362. LogMsg( L"[EN] An error occurred trying to get the fully-qualified Dns name for the local machine during initialization. Status code is= %1!#08x!.", hr );
  363. goto Cleanup;
  364. } // if: error occurred getting computer name
  365. Cleanup:
  366. if ( psp != NULL )
  367. {
  368. psp->Release();
  369. }
  370. if ( plm != NULL )
  371. {
  372. plm->Release();
  373. }
  374. HRETURN( hr );
  375. } //*** CEvictNotify::HrInit
  376. //////////////////////////////////////////////////////////////////////////////
  377. //++
  378. //
  379. // CEvictNotify::SendNotifications
  380. //
  381. // Description:
  382. // This method is called by the Cluster Service to inform the implementor
  383. // of this interface to send out notification that a node has been evicted
  384. // from the cluster to interested listeners.
  385. //
  386. // Arguments:
  387. // pcszNodeNameIn
  388. // The name of the cluster node that was evicted.
  389. //
  390. // Return Values:
  391. // S_OK
  392. // Success.
  393. //
  394. // Other HRESULTs
  395. // The call failed.
  396. //
  397. //--
  398. //////////////////////////////////////////////////////////////////////////////
  399. STDMETHODIMP
  400. CEvictNotify::SendNotifications(
  401. LPCWSTR pcszNodeNameIn
  402. )
  403. {
  404. TraceFunc( "[IClusCfgEvictNotify]" );
  405. HRESULT hr = S_OK;
  406. //
  407. // Send out the notifications
  408. //
  409. hr = THR( HrNotifyListeners( pcszNodeNameIn ) );
  410. if ( FAILED( hr ) )
  411. {
  412. LogMsg( "[EN] Error %#08x occurred trying to notify cluster evict listeners.", hr );
  413. goto Cleanup;
  414. } // if: something went wrong while sending out notifications
  415. LogMsg( "[EN] Sending of cluster evict notifications complete for node %ws. (hr = %#08x)", pcszNodeNameIn, hr );
  416. Cleanup:
  417. HRETURN( hr );
  418. } //*** CEvictNotify::SendNotifications
  419. //////////////////////////////////////////////////////////////////////////////
  420. //++
  421. //
  422. // HRESULT
  423. // CEvictNotify::HrNotifyListeners
  424. //
  425. // Description:
  426. // Enumerate all components on the local computer registered for cluster
  427. // evict notification.
  428. //
  429. // Arguments:
  430. // None.
  431. //
  432. // Return Values:
  433. // S_OK
  434. // Success.
  435. //
  436. // other HRESULTs
  437. // Something went wrong during the enumeration.
  438. //
  439. //--
  440. //////////////////////////////////////////////////////////////////////////////
  441. HRESULT
  442. CEvictNotify::HrNotifyListeners(
  443. LPCWSTR pcszNodeNameIn
  444. )
  445. {
  446. TraceFunc( "" );
  447. const UINT uiCHUNK_SIZE = 16;
  448. HRESULT hr = S_OK;
  449. ICatInformation * pciCatInfo = NULL;
  450. IEnumCLSID * psleEvictListenerClsidEnum = NULL;
  451. ULONG cReturned = 0;
  452. CATID rgCatIdsImplemented[ 1 ];
  453. rgCatIdsImplemented[ 0 ] = CATID_ClusCfgEvictListeners;
  454. //
  455. // Enumerate all the enumerators registered in the
  456. // CATID_ClusCfgEvictListeners category
  457. //
  458. hr = THR(
  459. CoCreateInstance(
  460. CLSID_StdComponentCategoriesMgr
  461. , NULL
  462. , CLSCTX_SERVER
  463. , IID_ICatInformation
  464. , reinterpret_cast< void ** >( &pciCatInfo )
  465. )
  466. );
  467. if ( FAILED( hr ) )
  468. {
  469. LogMsg( "[EN] Error %#08x occurred trying to get a pointer to the enumerator of the CATID_ClusCfgEvictListeners category.", hr );
  470. goto Cleanup;
  471. } // if: we could not get a pointer to the ICatInformation interface
  472. //
  473. // Get a pointer to the enumerator of the CLSIDs that belong to the
  474. // CATID_ClusCfgEvictListeners category.
  475. //
  476. hr = THR(
  477. pciCatInfo->EnumClassesOfCategories(
  478. 1
  479. , rgCatIdsImplemented
  480. , 0
  481. , NULL
  482. , &psleEvictListenerClsidEnum
  483. )
  484. );
  485. if ( FAILED( hr ) )
  486. {
  487. LogMsg( "[EN] Error %#08x occurred trying to get a pointer to the enumerator of the CATID_ClusCfgEvictListeners category.", hr );
  488. goto Cleanup;
  489. } // if: we could not get a pointer to the IEnumCLSID interface
  490. //
  491. // Enumerate the CLSIDs of the registered evict listeners
  492. //
  493. do
  494. {
  495. CLSID rgEvictListenerClsids[ uiCHUNK_SIZE ];
  496. ULONG idxCLSID;
  497. cReturned = 0;
  498. hr = STHR( psleEvictListenerClsidEnum->Next( uiCHUNK_SIZE , rgEvictListenerClsids , &cReturned ) );
  499. if ( FAILED( hr ) )
  500. {
  501. LogMsg( "[EN] Error %#08x occurred trying enumerate evict listener components.", hr );
  502. goto Cleanup;
  503. } // if: we could not get the next set of CLSIDs
  504. //
  505. // hr may be S_FALSE here, so reset it.
  506. //
  507. hr = S_OK;
  508. for ( idxCLSID = 0; idxCLSID < cReturned; ++idxCLSID )
  509. {
  510. hr = THR( HrProcessListener( rgEvictListenerClsids[ idxCLSID ], pcszNodeNameIn ) );
  511. if ( FAILED( hr ) )
  512. {
  513. //
  514. // The processing of one of the listeners failed.
  515. // Log the error, but continue processing other listeners.
  516. //
  517. TraceMsgGUID( mtfALWAYS, "The CLSID of the failed listener is ", rgEvictListenerClsids[ idxCLSID ] );
  518. LogMsg( "[EN] Error %#08x occurred trying to process a cluster evict listener. Other listeners will be processed.", hr );
  519. hr = S_OK;
  520. } // if: this enumerator failed
  521. } // for: iterate through the returned CLSIDs
  522. }
  523. while( cReturned > 0 ); // while: there are still CLSIDs to be enumerated
  524. Cleanup:
  525. if ( pciCatInfo != NULL )
  526. {
  527. pciCatInfo->Release();
  528. } // if: we had obtained a pointer to the ICatInformation interface
  529. if ( psleEvictListenerClsidEnum != NULL )
  530. {
  531. psleEvictListenerClsidEnum->Release();
  532. } // if: we had obtained a pointer to the enumerator of evict listener CLSIDs
  533. HRETURN( hr );
  534. } //*** CEvictNotify::HrNotifyListeners
  535. //////////////////////////////////////////////////////////////////////////////
  536. //++
  537. //
  538. // HRESULT
  539. // CEvictNotify::HrProcessListener
  540. //
  541. // Description:
  542. // This function instantiates a cluster evict listener component
  543. // and calls the appropriate methods.
  544. //
  545. // Arguments:
  546. // rclsidListenerCLSIDIn
  547. // CLSID of the evict listener component
  548. //
  549. // pcszNodeNameIn
  550. // The name of the node that was evicted.
  551. //
  552. // Return Values:
  553. // S_OK
  554. // Success.
  555. //
  556. // other HRESULTs
  557. // Something went wrong during the processing of the listener.
  558. //
  559. //--
  560. //////////////////////////////////////////////////////////////////////////////
  561. HRESULT
  562. CEvictNotify::HrProcessListener(
  563. const CLSID & rclsidListenerCLSIDIn
  564. , LPCWSTR pcszNodeNameIn
  565. )
  566. {
  567. TraceFunc( "" );
  568. HRESULT hr = S_OK;
  569. IClusCfgInitialize * pciInitialize = NULL;
  570. IClusCfgEvictListener * pcslEvictListener = NULL;
  571. TraceMsgGUID( mtfALWAYS, "The CLSID of this evict listener is ", rclsidListenerCLSIDIn );
  572. //
  573. // Create the component represented by the CLSID passed in
  574. //
  575. hr = THR(
  576. CoCreateInstance(
  577. rclsidListenerCLSIDIn
  578. , NULL
  579. , CLSCTX_INPROC_SERVER
  580. , __uuidof( pcslEvictListener )
  581. , reinterpret_cast< void ** >( &pcslEvictListener )
  582. )
  583. );
  584. if ( FAILED( hr ) )
  585. {
  586. LogMsg( "[EN] Error %#08x occurred trying to create a cluster evict listener component.", hr );
  587. goto Cleanup;
  588. } // if: we could not create the cluster evict listener component
  589. // Initialize the listener if supported.
  590. hr = pcslEvictListener->TypeSafeQI( IClusCfgInitialize, &pciInitialize );
  591. if ( FAILED( hr ) && ( hr != E_NOINTERFACE ) )
  592. {
  593. LogMsg( "[EN] Error %#08x occurred trying to query for IClusCfgInitialize on the listener component.", THR( hr ) );
  594. goto Cleanup;
  595. } // if: we could not create the cluster startup listener component
  596. // Initialize the listener if supported.
  597. if ( pciInitialize != NULL )
  598. {
  599. hr = THR( pciInitialize->Initialize( static_cast< IClusCfgCallback * >( this ), GetUserDefaultLCID() ) );
  600. if ( FAILED( hr ) )
  601. {
  602. LogMsg( "[EN] Error %#08x occurred trying to initialize the listener component.", hr );
  603. goto Cleanup;
  604. } // if:
  605. pciInitialize->Release();
  606. pciInitialize = NULL;
  607. } // if: pciInitialize != NULL
  608. // Notify this listener.
  609. hr = THR( pcslEvictListener->EvictNotify( pcszNodeNameIn ) );
  610. if ( FAILED( hr ) )
  611. {
  612. LogMsg( "[EN] Error %#08x occurred trying to notify a cluster evict listener.", hr );
  613. goto Cleanup;
  614. } // if: this notification
  615. Cleanup:
  616. if ( pcslEvictListener != NULL )
  617. {
  618. pcslEvictListener->Release();
  619. } // if: we had obtained a pointer to the evict listener interface
  620. if ( pciInitialize != NULL )
  621. {
  622. pciInitialize->Release();
  623. } // if: we obtained a pointer to the initialize interface
  624. HRETURN( hr );
  625. } //*** CEvictNotify::HrProcessListener
  626. //****************************************************************************
  627. //
  628. // IClusCfgCallback
  629. //
  630. //****************************************************************************
  631. //////////////////////////////////////////////////////////////////////////////
  632. //++
  633. //
  634. // CEvictNotify::SendStatusReport(
  635. // LPCWSTR pcszNodeNameIn
  636. // , CLSID clsidTaskMajorIn
  637. // , CLSID clsidTaskMinorIn
  638. // , ULONG ulMinIn
  639. // , ULONG ulMaxIn
  640. // , ULONG ulCurrentIn
  641. // , HRESULT hrStatusIn
  642. // , LPCWSTR pcszDescriptionIn
  643. // , FILETIME * pftTimeIn
  644. // , LPCWSTR pcszReferenceIn
  645. // )
  646. //
  647. // Description:
  648. //
  649. // Arguments:
  650. //
  651. // Return Value:
  652. //
  653. // Remarks:
  654. // None.
  655. //
  656. //--
  657. //////////////////////////////////////////////////////////////////////////////
  658. STDMETHODIMP
  659. CEvictNotify::SendStatusReport(
  660. LPCWSTR pcszNodeNameIn
  661. , CLSID clsidTaskMajorIn
  662. , CLSID clsidTaskMinorIn
  663. , ULONG ulMinIn
  664. , ULONG ulMaxIn
  665. , ULONG ulCurrentIn
  666. , HRESULT hrStatusIn
  667. , LPCWSTR pcszDescriptionIn
  668. , FILETIME * pftTimeIn
  669. , LPCWSTR pcszReferenceIn
  670. )
  671. {
  672. TraceFunc1( "[IClusCfgCallback] pcszDescriptionIn = '%s'", pcszDescriptionIn == NULL ? TEXT("<null>") : pcszDescriptionIn );
  673. HRESULT hr = S_OK;
  674. if ( pcszNodeNameIn == NULL )
  675. {
  676. pcszNodeNameIn = m_bstrNodeName;
  677. } // if:
  678. TraceMsg( mtfFUNC, L"pcszNodeNameIn = %s", pcszNodeNameIn );
  679. TraceMsgGUID( mtfFUNC, "clsidTaskMajorIn ", clsidTaskMajorIn );
  680. TraceMsgGUID( mtfFUNC, "clsidTaskMinorIn ", clsidTaskMinorIn );
  681. TraceMsg( mtfFUNC, L"ulMinIn = %u", ulMinIn );
  682. TraceMsg( mtfFUNC, L"ulMaxIn = %u", ulMaxIn );
  683. TraceMsg( mtfFUNC, L"ulCurrentIn = %u", ulCurrentIn );
  684. TraceMsg( mtfFUNC, L"hrStatusIn = %#08x", hrStatusIn );
  685. TraceMsg( mtfFUNC, L"pcszDescriptionIn = '%ws'", ( pcszDescriptionIn ? pcszDescriptionIn : L"<null>" ) );
  686. //
  687. // TODO: 21 NOV 2000 GalenB
  688. //
  689. // How do we log pftTimeIn?
  690. //
  691. TraceMsg( mtfFUNC, L"pcszReferenceIn = '%ws'", ( pcszReferenceIn ? pcszReferenceIn : L"<null>" ) );
  692. hr = THR( CClCfgSrvLogger::S_HrLogStatusReport(
  693. m_plLogger
  694. , pcszNodeNameIn
  695. , clsidTaskMajorIn
  696. , clsidTaskMinorIn
  697. , ulMinIn
  698. , ulMaxIn
  699. , ulCurrentIn
  700. , hrStatusIn
  701. , pcszDescriptionIn
  702. , pftTimeIn
  703. , pcszReferenceIn
  704. ) );
  705. HRETURN( hr );
  706. } //*** CEvictNotify::SendStatusReport