mirror of https://github.com/tongzx/nt5src
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.
178 lines
5.1 KiB
178 lines
5.1 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997-1999.
|
|
//
|
|
// File: usnmgr.hxx
|
|
//
|
|
// Contents: Usn manager
|
|
//
|
|
// History: 07-May-97 SitaramR Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include <waitmult.hxx>
|
|
|
|
#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<CCiScanInfo> & xScanInfo,
|
|
BOOL fRefiled );
|
|
|
|
BOOL LokIsScanScheduled( const XPtr<CCiScanInfo> & 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<CCiScanInfo> & xScanInfo );
|
|
|
|
void LokRemoveScopeFromUsnMonitoring( XPtr<CCiScanInfo> & 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;
|
|
};
|
|
|