//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997-1999. // // File: usnmgr.hxx // // Contents: Usn manager // // History: 07-May-97 SitaramR Created // //---------------------------------------------------------------------------- #pragma once #include #include "usnvol.hxx" #include "scaninfo.hxx" class CiCat; class CScopeInfo; //+------------------------------------------------------------------------- // // Class: CUsnMgr // // Purpose: Usn manager // // History: 07-May-97 SitaramR Created // //-------------------------------------------------------------------------- class CUsnMgr { public: CUsnMgr( CiCat & cicat ); ~CUsnMgr(); void Resume() { _thrUsn.Resume(); } void AddScope( WCHAR const *pwcsScope, VOLUMEID volumeId, BOOL fDoDeletions, USN const & usnStart = 0, BOOL fFullScan = FALSE, BOOL fUserInitiatedScan = FALSE, BOOL fNewScope = FALSE ); void MonitorScope( WCHAR const *pwcsScope, VOLUMEID volumeId, USN usnStart ); void RemoveScope( WCHAR const *pwcsScope, VOLUMEID volumeId ); void EnableUpdates(); void DisableUpdates(); void InitiateShutdown(); void WaitForShutdown(); void Count( ULONG & ulInProgress, ULONG & ulPending ) { CLock lock( _mutex ); ulInProgress = _usnScansInProgress.Count(); ulPending = _usnScansToDo.Count(); } BOOL AnyInitialScans(); void SetBatch(); void ClearBatch(); void ProcessUsnLog( BOOL & fAbort, VOLUMEID volScan, USN & usnScan ); BOOL IsPathIndexed( CUsnVolume * pUsnVolume, CLowerFunnyPath & lcaseFunnyPath ); void GetMaxUSNs( CUsnFlushInfoList & flushInfoList ); BOOL IsWaitingForUpdates() const { return _fWaitingForUpdates; } private: static DWORD WINAPI UsnThread( void * self ); void DoUsnProcessing(); void ScanScope( XPtr & xScanInfo, BOOL fRefiled ); BOOL LokIsScanScheduled( const XPtr & xScanInfo ); static CCiScanInfo * QueryScanInfo( WCHAR const * pwcsScope, VOLUMEID volumeId, USN usnStart, BOOL fDoDeletions, BOOL fUserInitiated = FALSE, BOOL fNewScope = FALSE ); void LokEmptyInProgressScans(); void LokScheduleRemove( WCHAR const * pwcsScope, VOLUMEID volumeId ); void DoUsnScans(); void LokAddScopeForUsnMonitoring( XPtr & xScanInfo ); void LokRemoveScopeFromUsnMonitoring( XPtr & xScanInfo ); void ProcessUsnNotifications(); void ProcessUsnLogRecords( CUsnVolume *pUsnVolume ); NTSTATUS ProcessUsnNotificationsFromVolume( CUsnVolume *pUsnVolume, BOOL fImmediate = FALSE, BOOL fWait = TRUE ); USN FindCurrentMaxUsn( WCHAR const * pwcsScope ); void HandleError( WCHAR wcDrive, NTSTATUS Status ); void HandleError( CUsnVolume * pUsnVolume, NTSTATUS Status ); BOOL IsLowResource(); void CheckTopLevelChange( CUsnVolume * pUsnVolume, ULONGLONG & FileReferenceNumber ); CiCat & _cicat; // Catalog CMutexSem _mutex; // For mutual exclusion CEventSem _evtUsn; // Event semaphore BOOL _fAbort; // To abort processing BOOL _fUpdatesDisabled; // Are updates disabled ? BOOL _fBatch; // Are usn scans being batched ? BOOL _fDoingRenameTraverse; // Usn Tree Traversal due to rename? BOOL _fWaitingForUpdates; // TRUE if waiting on NTFS CWaitForMultipleObjects _waitForMultObj; // For waiting for usn notifications // from multiple volumes CScanInfoList _usnScansToDo; // Usn scopes that were added/removed CScanInfoList _usnScansInProgress; // Usn scopes being scanned by tree walk CUsnVolumeList _usnVolumesToMonitor; // Usn volumes being monitored by fsctls CThread _thrUsn; // Separate threads for usns }; //+------------------------------------------------------------------------- // // Class: XBatchUsnProcessing // // Purpose: To batch processing of usn scans // // History: 27-Jun-97 SitaramR Created // //-------------------------------------------------------------------------- class XBatchUsnProcessing { public: XBatchUsnProcessing( CUsnMgr & usnMgr ) : _usnMgr(usnMgr) { _usnMgr.SetBatch(); } ~XBatchUsnProcessing() { _usnMgr.ClearBatch(); } private: CUsnMgr & _usnMgr; };