898 lines
29 KiB
C++
898 lines
29 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1991 - 2000.
|
||
|
//
|
||
|
// File: CICAT.HXX
|
||
|
//
|
||
|
// Contents: File catalog
|
||
|
//
|
||
|
// History: 09-Mar-92 BartoszM Created
|
||
|
// 15-Mar-93 BartoszM Converted to memory mapped streams
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <dynstrm.hxx>
|
||
|
#include <catalog.hxx>
|
||
|
#include <spropmap.hxx>
|
||
|
#include <secstore.hxx>
|
||
|
#include <doclist.hxx>
|
||
|
#include <imprsnat.hxx>
|
||
|
#include <ciintf.h>
|
||
|
#include <workman.hxx>
|
||
|
#include <cistore.hxx>
|
||
|
#include <pidtable.hxx>
|
||
|
#include <prpstmgr.hxx>
|
||
|
#include <ntopen.hxx>
|
||
|
#include <notifary.hxx>
|
||
|
|
||
|
#include "statmon.hxx"
|
||
|
#include "chash.hxx"
|
||
|
#include "notifmgr.hxx"
|
||
|
#include "scopetbl.hxx"
|
||
|
#include "scanmgr.hxx"
|
||
|
#include "scpfixup.hxx"
|
||
|
#include "signore.hxx"
|
||
|
#include "usnlist.hxx"
|
||
|
#include "usnmgr.hxx"
|
||
|
#include "filidmap.hxx"
|
||
|
#include "volinfo.hxx"
|
||
|
|
||
|
class CClientDocStore;
|
||
|
class CCompositePropRecord;
|
||
|
class CPrimaryPropRecord;
|
||
|
class CDynLoadNetApi32;
|
||
|
|
||
|
#include "strings.hxx"
|
||
|
|
||
|
WCHAR const CAT_DIR[] = L"\\catalog.wci";
|
||
|
WCHAR const SETUP_DIR_PREFIX[] = L"\\$WIN_NT$.~";
|
||
|
|
||
|
//
|
||
|
// The path given for the catalog should leave room for \Catalog.Wci\8.3
|
||
|
// Leave room for 2 8.3 names with a backslash.
|
||
|
//
|
||
|
const MAX_CAT_PATH = MAX_PATH - 13*2;
|
||
|
|
||
|
void UpdateDuringRecovery( WORKID wid, BOOL fDelete, void const *pUserData );
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CScopeEntry
|
||
|
//
|
||
|
// Purpose: Maintains a scope entry to rescan
|
||
|
//
|
||
|
// History: 4/3/98 mohamedn created
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CScopeEntry
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
CScopeEntry(WCHAR const * pwszScope);
|
||
|
|
||
|
BOOL SetToParentDirectory(void);
|
||
|
|
||
|
BOOL ContainsSpecialChar(void) { return _fContainsSpecialChar; }
|
||
|
|
||
|
WCHAR const * Get(void) { return _xwcsPath.Get(); }
|
||
|
|
||
|
private:
|
||
|
|
||
|
WCHAR * GetSpecialCharLocation(void);
|
||
|
BOOL IsSpecialChar(WCHAR c);
|
||
|
BOOL IsRoot(void);
|
||
|
|
||
|
BOOL _fContainsSpecialChar;
|
||
|
XGrowable<WCHAR> _xwcsPath;
|
||
|
unsigned _cclen;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CiCat
|
||
|
//
|
||
|
// Purpose: Catalog for downlevel media used by content index
|
||
|
//
|
||
|
// History: 10-Mar-92 BartoszM Created
|
||
|
// 17-Feb-98 KitmanH Added public function
|
||
|
// IsReadOnly()
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CiCat: public PCatalog
|
||
|
{
|
||
|
friend class CUpdate;
|
||
|
friend class CRegistryScopesCallBackAdd;
|
||
|
friend class CRegistryScopesCallBackFixups;
|
||
|
friend class CRegistryScopesCallBackRemoveAlias;
|
||
|
friend class CUserPropCallback;
|
||
|
|
||
|
friend class CClientDocStore;
|
||
|
friend class CGibCallBack;
|
||
|
|
||
|
public:
|
||
|
|
||
|
CiCat ( CClientDocStore & docStore,
|
||
|
CWorkManager & workMan,
|
||
|
const WCHAR* wcsCatPath,
|
||
|
BOOL &fVersionChange,
|
||
|
BOOL fOpenForReadOnly,
|
||
|
CDrvNotifArray & DrvNotifArray,
|
||
|
const WCHAR * pwcName,
|
||
|
BOOL fLeaveCorruptCatalog );
|
||
|
|
||
|
~CiCat ();
|
||
|
|
||
|
const WCHAR * GetName() { return _xName.Get(); }
|
||
|
const WCHAR * GetCatalogName() { return _xName.Get(); }
|
||
|
const WCHAR * GetScopesKey() { return _xScopesKey.Get(); }
|
||
|
|
||
|
PROPID PropertyToPropId ( CFullPropSpec const & ps, BOOL fCreate = FALSE );
|
||
|
|
||
|
unsigned WorkIdToPath ( WORKID wid, CFunnyPath & funnyPath );
|
||
|
|
||
|
unsigned WorkIdToAccuratePath ( WORKID wid, CLowerFunnyPath & funnyPath );
|
||
|
|
||
|
BOOL PropertyRecordToFileId( CCompositePropRecord & PropRec,
|
||
|
FILEID & fileId,
|
||
|
VOLUMEID & volumeId );
|
||
|
|
||
|
|
||
|
WORKID PathToWorkId ( const CLowerFunnyPath & lcaseFunnyPath,
|
||
|
BOOL fCreate,
|
||
|
BOOL & fNew,
|
||
|
FILETIME * pftLastSeen,
|
||
|
ESeenArrayType eType,
|
||
|
FILEID fileId,
|
||
|
WORKID widParent = widInvalid,
|
||
|
BOOL fGuaranteedNew = FALSE );
|
||
|
|
||
|
WORKID PathToWorkId( const CLowerFunnyPath & lcaseFunnyPath,
|
||
|
const BOOL fCreate )
|
||
|
{
|
||
|
BOOL fNew;
|
||
|
return PathToWorkId( lcaseFunnyPath, fCreate, fNew, 0, eScansArray, fileIdInvalid );
|
||
|
}
|
||
|
|
||
|
WORKID PathToWorkId ( const CLowerFunnyPath & lcaseFunnyPath,
|
||
|
ESeenArrayType eType,
|
||
|
FILEID fileId = fileIdInvalid )
|
||
|
{
|
||
|
BOOL fNew;
|
||
|
return PathToWorkId( lcaseFunnyPath, TRUE, fNew, 0, eType, fileId );
|
||
|
}
|
||
|
|
||
|
void RenameFile( const CLowerFunnyPath & lcaseFunnyOldName,
|
||
|
const CLowerFunnyPath & lcaseFunnyNewName,
|
||
|
ULONG ulFileAttrib,
|
||
|
VOLUMEID volumeId,
|
||
|
FILEID fileId,
|
||
|
WORKID widParent = widInvalid );
|
||
|
|
||
|
void WriteFileAttributes( WORKID wid, ULONG ulFileAttrib )
|
||
|
{
|
||
|
PROPVARIANT propVar;
|
||
|
|
||
|
propVar.vt = VT_UI4;
|
||
|
propVar.ulVal = ulFileAttrib;
|
||
|
_propstoremgr.WriteProperty( wid,
|
||
|
pidAttrib,
|
||
|
*(CStorageVariant const *)(ULONG_PTR)&propVar );
|
||
|
}
|
||
|
|
||
|
PStorage& GetStorage ();
|
||
|
|
||
|
void FlushPropertyStore()
|
||
|
{
|
||
|
if ( _propstoremgr.IsBackedUpMode() )
|
||
|
_propstoremgr.Flush();
|
||
|
}
|
||
|
|
||
|
void Update( const CLowerFunnyPath & lowerFunnyPath,
|
||
|
BOOL fDeleted,
|
||
|
FILETIME const & ftLastSeen,
|
||
|
ULONG ulFileAttrib );
|
||
|
void Update( const CLowerFunnyPath & lowerFunnyPath,
|
||
|
FILEID fileId,
|
||
|
WORKID widParent,
|
||
|
USN usn,
|
||
|
CUsnVolume *pUsnVolume,
|
||
|
BOOL fDeleted,
|
||
|
CReleasableLock * pLock = 0 );
|
||
|
|
||
|
void LokMarkForDeletion( FILEID fileId,
|
||
|
WORKID wid );
|
||
|
|
||
|
void AddDocuments( CDocList const & docList );
|
||
|
|
||
|
void ReScanPath( WCHAR const * wcsPath, BOOL fDelayed );
|
||
|
|
||
|
BOOL EnumerateProperty( CFullPropSpec & ps, unsigned & cbInCache,
|
||
|
ULONG & type, DWORD & dwStoreLevel,
|
||
|
BOOL & fIsModifiable, unsigned & iBmk );
|
||
|
|
||
|
void ClearNonStoragePropertiesForWid( WORKID wid );
|
||
|
|
||
|
//
|
||
|
// Cache metadata changes
|
||
|
//
|
||
|
|
||
|
ULONG_PTR BeginCacheTransaction();
|
||
|
|
||
|
void SetupCache( CFullPropSpec const & ps,
|
||
|
ULONG vt,
|
||
|
ULONG cbMaxLen,
|
||
|
ULONG_PTR ulToken,
|
||
|
BOOL fCanBeModified,
|
||
|
DWORD dwStoreLevel );
|
||
|
|
||
|
void EndCacheTransaction( ULONG_PTR ulToken, BOOL fCommit );
|
||
|
|
||
|
BOOL IsPropertyCached( CFullPropSpec const & ps )
|
||
|
{
|
||
|
Win4Assert( !"Not Yet Implemented" );
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL StoreValue( WORKID wid,
|
||
|
CFullPropSpec const & ps,
|
||
|
CStorageVariant const & var );
|
||
|
|
||
|
BOOL FetchValue( WORKID wid,
|
||
|
PROPID pid,
|
||
|
PROPVARIANT * pbData,
|
||
|
unsigned * pcb );
|
||
|
|
||
|
BOOL FetchValue( CCompositePropRecord & Rec,
|
||
|
PROPID pid,
|
||
|
PROPVARIANT * pbData,
|
||
|
BYTE * pbExtra,
|
||
|
unsigned * pcb );
|
||
|
|
||
|
BOOL FetchValue( WORKID wid,
|
||
|
CFullPropSpec const & ps,
|
||
|
PROPVARIANT & var );
|
||
|
|
||
|
BOOL FetchValue( CCompositePropRecord * pRec,
|
||
|
PROPID pid,
|
||
|
PROPVARIANT * pbData,
|
||
|
unsigned * pcb );
|
||
|
|
||
|
BOOL FetchValue( CCompositePropRecord * pRec,
|
||
|
PROPID pid,
|
||
|
PROPVARIANT & var );
|
||
|
|
||
|
CCompositePropRecord * OpenValueRecord( WORKID wid, BYTE * pb );
|
||
|
void CloseValueRecord( CCompositePropRecord * pRec );
|
||
|
|
||
|
BOOL StoreSecurity( WORKID wid,
|
||
|
PSECURITY_DESCRIPTOR pSD,
|
||
|
ULONG cbSD );
|
||
|
|
||
|
SDID FetchSDID( CCompositePropRecord * pRec,
|
||
|
WORKID wid );
|
||
|
|
||
|
void MarkUnReachable( WORKID wid ); // virtual
|
||
|
|
||
|
BOOL AccessCheck( SDID sdid,
|
||
|
HANDLE hToken,
|
||
|
ACCESS_MASK am,
|
||
|
BOOL & fGranted );
|
||
|
|
||
|
void Delete( WORKID wid, USN usn ) {}
|
||
|
void UpdateDocuments ( WCHAR const* rootPath=0, ULONG flag=UPD_FULL );
|
||
|
|
||
|
void CatalogState( ULONG & cDocuments, ULONG & cPendingScans, ULONG & fState );
|
||
|
|
||
|
void AddScopeToCI( WCHAR const * rootPath, BOOL fFromVirtual = FALSE )
|
||
|
{
|
||
|
ScanOrAddScope( rootPath, TRUE, UPD_FULL, FALSE, TRUE, fFromVirtual );
|
||
|
}
|
||
|
|
||
|
DWORD ReScanCIScope( WCHAR const * rootPath, BOOL fFull );
|
||
|
|
||
|
void ScanOrAddScope( WCHAR const * rootPath,
|
||
|
BOOL fAdd,
|
||
|
ULONG flag,
|
||
|
BOOL fDoDeletions,
|
||
|
BOOL fScanIfNotNew,
|
||
|
BOOL fCreateShadow = FALSE );
|
||
|
|
||
|
void RemoveScopeFromCI( WCHAR const * rootPath, BOOL fForceRemovalScan );
|
||
|
|
||
|
void RemovePathsFromCiCat( WCHAR const * rootPath, ESeenArrayType eType );
|
||
|
|
||
|
BOOL IsScopeInCI( WCHAR const * wcsScope );
|
||
|
|
||
|
BOOL AddVirtualScope( WCHAR const * vroot,
|
||
|
WCHAR const * root,
|
||
|
BOOL fAutomatic,
|
||
|
CiVRootTypeEnum eType,
|
||
|
BOOL fIsVRoot,
|
||
|
BOOL fIsIndexed );
|
||
|
|
||
|
BOOL RemoveVirtualScope( WCHAR const * vroot,
|
||
|
BOOL fOnlyIfAutomatic,
|
||
|
CiVRootTypeEnum eType,
|
||
|
BOOL fIsVRoot,
|
||
|
BOOL fForceVPathFixing = FALSE );
|
||
|
|
||
|
unsigned WorkIdToVirtualPath( WORKID wid,
|
||
|
unsigned cSkip,
|
||
|
XGrowable<WCHAR> & xBuf );
|
||
|
|
||
|
unsigned WorkIdToVirtualPath( CCompositePropRecord & propRec,
|
||
|
unsigned cSkip,
|
||
|
XGrowable<WCHAR> & xBuf );
|
||
|
|
||
|
BOOL VirtualToPhysicalRoot( WCHAR const * pwcVPath,
|
||
|
unsigned ccVPath,
|
||
|
XGrowable<WCHAR> & xwcsVRoot,
|
||
|
unsigned & ccVRoot,
|
||
|
CLowerFunnyPath & lcaseFunnyPRoot,
|
||
|
unsigned & ccPRoot,
|
||
|
unsigned & iBmk );
|
||
|
|
||
|
inline BOOL VirtualToAllPhysicalRoots( WCHAR const * pwcVPath,
|
||
|
unsigned ccVPath,
|
||
|
XGrowable<WCHAR> & xwcsVRoot,
|
||
|
unsigned & ccVRoot,
|
||
|
CLowerFunnyPath & lcaseFunnyPRoot,
|
||
|
unsigned & ccPRoot,
|
||
|
ULONG & ulType,
|
||
|
unsigned & iBmk );
|
||
|
|
||
|
ULONG EnumerateVRoot( XGrowable<WCHAR> & xwcVRoot,
|
||
|
unsigned & ccVRoot,
|
||
|
CLowerFunnyPath & lcaseFunnyPRoot,
|
||
|
unsigned & ccPRoot,
|
||
|
unsigned & iBmk );
|
||
|
|
||
|
virtual SCODE CreateContentIndex();
|
||
|
virtual void EmptyContentIndex();
|
||
|
virtual void ShutdownPhase1();
|
||
|
virtual void ShutdownPhase2();
|
||
|
|
||
|
NTSTATUS ForceMerge( PARTITIONID partID );
|
||
|
NTSTATUS AbortMerge( PARTITIONID partID );
|
||
|
|
||
|
void DumpWorkId( WORKID wid, ULONG iid, BYTE * pb, ULONG cb );
|
||
|
|
||
|
void StartUpdate ( FILETIME* time,
|
||
|
WCHAR const * pwcsScope,
|
||
|
BOOL fDoDeletions,
|
||
|
ESeenArrayType eType );
|
||
|
|
||
|
void Touch ( WORKID wid, ESeenArrayType eType );
|
||
|
|
||
|
void EndUpdate ( BOOL doDeletions, ESeenArrayType eType );
|
||
|
|
||
|
WCHAR * GetDriveName();
|
||
|
|
||
|
CRWStore * ComputeRelevantWords(ULONG cRows,ULONG cRW,
|
||
|
WORKID *pwid,PARTITIONID partid);
|
||
|
|
||
|
CRWStore * RetrieveRelevantWords(BOOL fAcquire,PARTITIONID partid);
|
||
|
|
||
|
void SetPartition( PARTITIONID PartId ) { _PartId = PartId; }
|
||
|
PARTITIONID GetPartition() const { return _PartId; }
|
||
|
|
||
|
void PidMapToPidRemap( const CPidMapper & pidMap,
|
||
|
CPidRemapper & pidRemap );
|
||
|
|
||
|
SCODE CiState( CI_STATE & state );
|
||
|
|
||
|
void DoUpdate( WCHAR const* rootPath,
|
||
|
ULONG flag,
|
||
|
BOOL fDoDeletions,
|
||
|
BOOL & fAbort,
|
||
|
BOOL fProcessRoot );
|
||
|
|
||
|
void DoUpdate( CScanInfoList & scopes, CCiScanMgr & scanMgr, BOOL & fAbort );
|
||
|
|
||
|
void ProcessScansComplete( BOOL fForce, BOOL & fShortWait );
|
||
|
|
||
|
void IncrementUpdateCount( ULONG nUpdates )
|
||
|
{
|
||
|
_notify.IncrementUpdateCount( nUpdates );
|
||
|
}
|
||
|
|
||
|
BOOL IsEligibleForFiltering( WCHAR const* wcsDirPath );
|
||
|
BOOL IsEligibleForFiltering( const CLowcaseBuf & LcaseDirPath );
|
||
|
BOOL IsEligibleForFiltering( const CLowerFunnyPath & lowerFunnyPath );
|
||
|
|
||
|
void SynchWithIIS( BOOL fRescanTC = TRUE, BOOL fSleep = TRUE );
|
||
|
void SynchWithRegistryScopes( BOOL fRescanTC = TRUE );
|
||
|
void SetupScopeFixups();
|
||
|
void SynchShares();
|
||
|
|
||
|
void DoRecovery();
|
||
|
|
||
|
void SetRecoveryCompleted();
|
||
|
BOOL IsRecoveryCompleted() { return _fRecoveryCompleted; }
|
||
|
|
||
|
void SignalPhase2Completion() { _evtPh2Init.Set(); };
|
||
|
|
||
|
void StartScansAndNotifies();
|
||
|
|
||
|
void HandleError( NTSTATUS status ); // virtual
|
||
|
|
||
|
BOOL IsDirectory( const CLowerFunnyPath * pOldFunnyPath, const CLowerFunnyPath * pNewFunnyPath );
|
||
|
|
||
|
|
||
|
static BOOL IsUNCName( WCHAR const * pwszPath );
|
||
|
|
||
|
BOOL IsReadOnly() { return _fIsReadOnly; }
|
||
|
|
||
|
void SetEvtInitialized() { _evtInitialized.Set(); }
|
||
|
|
||
|
void SetEvtPh2Init() { _evtPh2Init.Set(); }
|
||
|
|
||
|
// Disk full processing
|
||
|
void NoLokProcessDiskFull();
|
||
|
void NoLokClearDiskFull();
|
||
|
|
||
|
BOOL IsLowOnDisk() const { return _statusMonitor.IsLowOnDisk(); }
|
||
|
|
||
|
BOOL IsCorrupt( ) const
|
||
|
{
|
||
|
return _statusMonitor.IsCorrupt();
|
||
|
}
|
||
|
|
||
|
// Scan support
|
||
|
void MarkFullScanNeeded();
|
||
|
void MarkIncrScanNeeded();
|
||
|
|
||
|
// Changes Flush Support
|
||
|
void ProcessChangesFlush( FILETIME const & ftFlushed,
|
||
|
ULONG cEntries,
|
||
|
USN_FLUSH_INFO const * const * ppUsnEntries );
|
||
|
void ScheduleSerializeChanges();
|
||
|
void SerializeChangesInfo();
|
||
|
|
||
|
static BOOL IsDiskLowError( DWORD status );
|
||
|
|
||
|
static void FillMaxTime( FILETIME & ft );
|
||
|
static BOOL IsMaxTime( const FILETIME & ft );
|
||
|
|
||
|
//
|
||
|
// Support for CiFramework.
|
||
|
//
|
||
|
void StartupCiFrameWork( ICiManager * pCiManager );
|
||
|
|
||
|
unsigned FixupPath( WCHAR const * pwcOriginal,
|
||
|
WCHAR * pwcResult,
|
||
|
unsigned cwcResult,
|
||
|
unsigned cSkip )
|
||
|
{
|
||
|
return _scopeFixup.Fixup( pwcOriginal, pwcResult, cwcResult, cSkip );
|
||
|
}
|
||
|
|
||
|
void InverseFixupPath( CLowerFunnyPath & lcaseFunnyPath )
|
||
|
{
|
||
|
_scopeFixup.InverseFixup( lcaseFunnyPath );
|
||
|
}
|
||
|
|
||
|
CCiScopeTable * GetScopeTable() { return & _scopeTable; }
|
||
|
|
||
|
CScopeFixup * GetScopeFixup()
|
||
|
{
|
||
|
return &_scopeFixup;
|
||
|
}
|
||
|
|
||
|
CImpersonationTokenCache * GetImpersonationTokenCache()
|
||
|
{ return & _impersonationTokenCache; }
|
||
|
|
||
|
void RefreshRegistryParams();
|
||
|
|
||
|
WCHAR const * GetCatDir() const { return _wcsCatDir; }
|
||
|
|
||
|
CWorkManager & GetWorkMan() { return _workMan; }
|
||
|
|
||
|
void MakeBackupOfPropStore( WCHAR const * pwszDir,
|
||
|
IProgressNotify * pIProgressNotify,
|
||
|
BOOL & fAbort,
|
||
|
ICiEnumWorkids * pIWorkIds );
|
||
|
|
||
|
BOOL ProcessFile( const CLowerFunnyPath & lcaseFunnyPath,
|
||
|
FILEID fileId,
|
||
|
VOLUMEID volumeId,
|
||
|
WORKID widParent,
|
||
|
DWORD dwFileAttributes,
|
||
|
WORKID & wid );
|
||
|
|
||
|
WORKID FileIdToWorkId( FILEID fileId, VOLUMEID volumeId )
|
||
|
{
|
||
|
CLock lock( _mutex );
|
||
|
|
||
|
return _fileIdMap.LokFind( fileId, volumeId );
|
||
|
}
|
||
|
|
||
|
void FileIdToPath( FILEID fileId,
|
||
|
CUsnVolume *pUsnVolume,
|
||
|
CLowerFunnyPath & lcaseFunnyPath,
|
||
|
BOOL & fPathInScope );
|
||
|
|
||
|
unsigned FileIdToPath( FILEID & fileId,
|
||
|
VOLUMEID volumeId,
|
||
|
CLowerFunnyPath & funnyPath );
|
||
|
|
||
|
void UsnRecordToPathUsingParentId( USN_RECORD *pUsnRec,
|
||
|
CUsnVolume *pUsnVolume,
|
||
|
CLowerFunnyPath & lowerFunnyPath,
|
||
|
BOOL &fPathInScope,
|
||
|
WORKID & widParent,
|
||
|
BOOL fParentMayNotBeIndexed );
|
||
|
|
||
|
BOOL VolumeSupportsUsns( WCHAR wcVolume );
|
||
|
BOOL IsOnUsnVolume( WCHAR const *pwszPath );
|
||
|
|
||
|
VOLUMEID MapPathToVolumeId( const WCHAR *pwszPath );
|
||
|
|
||
|
ULONGLONG const & GetJournalId( const WCHAR *pwszPath );
|
||
|
ULONGLONG const & GetVolumeCreationTime( const WCHAR *pwszPath );
|
||
|
ULONG GetVolumeSerialNumber( const WCHAR *pwszPath );
|
||
|
|
||
|
void InitUsnTreeScan( WCHAR const *pwszPath );
|
||
|
void SetUsnTreeScanComplete( WCHAR const *pwszPath,
|
||
|
USN usnMax );
|
||
|
|
||
|
void SetTreeScanComplete( WCHAR const *pwszPath );
|
||
|
#if CIDBG==1
|
||
|
void CheckUsnTreeScan( WCHAR const *pwszPath );
|
||
|
#endif
|
||
|
|
||
|
ICiManager *CiManager()
|
||
|
{
|
||
|
Win4Assert( _xCiManager.GetPointer() );
|
||
|
return _xCiManager.GetPointer();
|
||
|
}
|
||
|
|
||
|
BOOL HasChanged( WORKID wid, FILETIME const & ft );
|
||
|
|
||
|
CCiRegParams * GetRegParams() { return & _regParams; }
|
||
|
|
||
|
PROPID StandardPropertyToPropId ( CFullPropSpec const & ps )
|
||
|
{
|
||
|
return _propMapper.StandardPropertyToPropId( ps );
|
||
|
}
|
||
|
|
||
|
unsigned ReserveUpdate( WORKID wid ) { Win4Assert( FALSE ); return 0; }
|
||
|
void Update( unsigned iHint, WORKID wid, PARTITIONID partid, USN usn, ULONG flags )
|
||
|
{ Win4Assert( FALSE ); }
|
||
|
void FlushScanStatus() {}
|
||
|
BOOL IsNullCatalog() { return FALSE; }
|
||
|
|
||
|
CMutexSem & GetMutex() { return _mutex; }
|
||
|
|
||
|
private:
|
||
|
|
||
|
friend void UpdateDuringRecovery( WORKID wid, BOOL fDelete, void const *pUserData );
|
||
|
|
||
|
BOOL _IsEligibleForFiltering( const WCHAR * pwcsPath, unsigned ccPath );
|
||
|
|
||
|
void ScanThisScope(WCHAR const * pwszPath);
|
||
|
|
||
|
void RemoveThisScope(WCHAR const * pwszPath, BOOL fForceRemovalScan );
|
||
|
|
||
|
void OnIgnoredScopeDelete(WCHAR const * pwcRoot, unsigned & iBmk, CRegAccess & regScopes);
|
||
|
|
||
|
void OnIndexedScopeDelete(WCHAR const * pwcRoot, unsigned & iBmk, CRegAccess & regScopes);
|
||
|
|
||
|
BOOL RemoveMatchingScopeTableEntries( WCHAR const * pwszRegXScope );
|
||
|
|
||
|
void ScanScopeTableEntry (WCHAR const * pwszScopeToRescan);
|
||
|
|
||
|
SCODE Update( WORKID wid, PARTITIONID partid, VOLUMEID volumeId, USN usn, ULONG flags );
|
||
|
|
||
|
void SignalDaemonRescanTC() { _evtRescanTC->Set(); }
|
||
|
|
||
|
void EvtLogIISAdminNotAvailable();
|
||
|
|
||
|
void SetName( const WCHAR *pwc )
|
||
|
{
|
||
|
_xName.Init( wcslen( pwc ) + 1 );
|
||
|
RtlCopyMemory( _xName.Get(), pwc, _xName.SizeOf() );
|
||
|
}
|
||
|
|
||
|
void EnableUpdateNotifies();
|
||
|
|
||
|
CPidLookupTable & GetPidLookupTable() { return _PidTable; }
|
||
|
|
||
|
void LokWriteFileUsnInfo( WORKID wid,
|
||
|
FILEID fileId,
|
||
|
BOOL fWriteToPropStore,
|
||
|
VOLUMEID volumeId,
|
||
|
WORKID widParent,
|
||
|
DWORD dwFileAttributes );
|
||
|
|
||
|
void PersistMaxUSNs( void );
|
||
|
|
||
|
void RenameFileInternal( const CLowerFunnyPath & lcaseFunnyOldName,
|
||
|
const CLowerFunnyPath & lcaseFunnyNewName,
|
||
|
ULONG ulFileAttrib,
|
||
|
VOLUMEID volumeId,
|
||
|
FILEID fileId,
|
||
|
WORKID widParent);
|
||
|
|
||
|
WORKID PathToWorkIdInternal
|
||
|
( const CLowerFunnyPath & lcaseFunnyPath,
|
||
|
BOOL fCreate,
|
||
|
BOOL & fNew,
|
||
|
FILETIME * pftLastSeen,
|
||
|
ESeenArrayType eType,
|
||
|
FILEID fileId,
|
||
|
WORKID widParent,
|
||
|
BOOL fGuaranteedNew);
|
||
|
|
||
|
#if CIDBG==1
|
||
|
void DebugPrintWidInfo( WORKID wid );
|
||
|
#endif
|
||
|
|
||
|
BOOL IsInit() { return eStarting != _state; }
|
||
|
|
||
|
BOOL LokExists();
|
||
|
void LokCreate();
|
||
|
void LokInit();
|
||
|
|
||
|
void InitOrCreate();
|
||
|
|
||
|
void InitIf( BOOL fLeaveCorruptCatalog = FALSE );
|
||
|
void CreateIf();
|
||
|
|
||
|
void AbortWorkItems();
|
||
|
|
||
|
void LogCiFailure( NTSTATUS status );
|
||
|
|
||
|
BOOL IsIgnoreNotification( WORKID wid,
|
||
|
const CFunnyPath & funnyPath,
|
||
|
ULONG ulFileAttrib );
|
||
|
|
||
|
void AddShadowScopes();
|
||
|
|
||
|
BOOL IsStarting() const { return (eStarting == _state || eQueryOnly == _state); }
|
||
|
|
||
|
BOOL IsStarted() const { return (eStarted == _state || eQueryOnly == _state); }
|
||
|
|
||
|
BOOL IsShuttingDown() const { return (eShutdownPhase1 == _state); }
|
||
|
|
||
|
BOOL IsShutdown() const { return (eShutdown == _state); }
|
||
|
|
||
|
BOOL IsCiDataCorrupt() const
|
||
|
{
|
||
|
return _scopeTable.IsCiDataCorrupt();
|
||
|
}
|
||
|
|
||
|
void ClearCiDataCorrupt()
|
||
|
{
|
||
|
_scopeTable.ClearCiDataCorrupt();
|
||
|
}
|
||
|
|
||
|
BOOL IsFsCiDataCorrupt() const
|
||
|
{
|
||
|
return _scopeTable.IsFsCiDataCorrupt();
|
||
|
}
|
||
|
|
||
|
void LogEvent( CCiStatusMonitor::EMessageType eType,
|
||
|
DWORD status = STATUS_SUCCESS,
|
||
|
ULONG val = 0 )
|
||
|
{
|
||
|
_statusMonitor.LogEvent( eType, status, val );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Helper routines for properties
|
||
|
//
|
||
|
|
||
|
void RecoverUserProperties( ULONG_PTR ulToken, DWORD dwStoreLevel );
|
||
|
|
||
|
void DeleteUserProperty( CFullPropSpec const & fps );
|
||
|
|
||
|
FILEID PathToFileId( const CFunnyPath & pwcPath );
|
||
|
|
||
|
WORKID LokLookupWid( const CLowerFunnyPath & lcaseFunnyPath, FILEID & fileId );
|
||
|
|
||
|
void AddShares( CDynLoadNetApi32 & dlNetApi32 );
|
||
|
|
||
|
void RefreshIfShadowAlias( WCHAR const * pwcsScope,
|
||
|
WCHAR const * pwcsAlias,
|
||
|
HKEY hkey );
|
||
|
|
||
|
void AddShadowAlias( WCHAR const * pwcsScope,
|
||
|
WCHAR const * pwcsAlias,
|
||
|
unsigned iSlot,
|
||
|
HKEY hkey );
|
||
|
|
||
|
void DeleteIfShadowAlias( WCHAR const * pwcsScope, WCHAR const * pwcsAlias );
|
||
|
|
||
|
|
||
|
enum EState
|
||
|
{
|
||
|
eStarting,
|
||
|
eQueryOnly,
|
||
|
eStarted,
|
||
|
eShutdownPhase1,
|
||
|
eShutdown
|
||
|
};
|
||
|
|
||
|
|
||
|
ULONG _ulSignature; // Signature of start of privates
|
||
|
|
||
|
CCiRegParams _regParams;
|
||
|
CStandardPropMapper _propMapper;
|
||
|
|
||
|
CScopeMatch _CatDir; // skip indexing catalog directory
|
||
|
|
||
|
BOOL _fIsReadOnly; // TRUE if catalog is read-only
|
||
|
BOOL _fDiskPerfEnabled; // TRUE if DiskPerf.sys is loaded
|
||
|
|
||
|
CiStorage* _pStorage; // Allocates storage
|
||
|
|
||
|
EState _state;
|
||
|
|
||
|
CImpersonationTokenCache _impersonationTokenCache;
|
||
|
|
||
|
CScopeFixup _scopeFixup; // path fixup for remote clients
|
||
|
CScopesIgnored _scopesIgnored; // paths that shouldn't be filtered
|
||
|
|
||
|
CClientDocStore & _docStore; // Document store interface
|
||
|
|
||
|
XGrowable<WCHAR> _xwcsDriveName; // Large buffer for UNC drive
|
||
|
|
||
|
WCHAR _wcsCatDir[MAX_PATH]; // path to catalog directory
|
||
|
|
||
|
CCiStatusMonitor _statusMonitor; // CI Status monitoring
|
||
|
|
||
|
BOOL _fInitialized; // Set to true when fully initilaized.
|
||
|
// Optimization - test before doing a wait.
|
||
|
|
||
|
CEventSem _evtInitialized; // Event set when initialization is
|
||
|
// completed.
|
||
|
|
||
|
CEventSem _evtPh2Init; // Phase2 initialization
|
||
|
|
||
|
CPropStoreManager _propstoremgr; // Property values cached through this.
|
||
|
CStrings _strings; // pointers to strings and hash table
|
||
|
CFileIdMap _fileIdMap; // File id to wid map
|
||
|
CPidLookupTable _PidTable; // PROPID mapping table
|
||
|
CSdidLookupTable _SecStore; // SDID mapping table
|
||
|
|
||
|
CMutexSem _mutex;
|
||
|
CMutexSem _mtxAdmin; // Lock for admin operations.
|
||
|
|
||
|
PARTITIONID _PartId; // partitions are not supported
|
||
|
|
||
|
CWorkManager & _workMan; // Asynchronous work item manager
|
||
|
|
||
|
CMutexSem _mtxIISSynch; // IIS Synch protection
|
||
|
long _cIISSynchThreads;
|
||
|
|
||
|
CCiScanMgr _scanMgr; // Scanning thread manager
|
||
|
CUsnMgr _usnMgr; // Usn thread manager
|
||
|
CCiNotifyMgr _notify; // Change notifications.
|
||
|
CCiScopeTable _scopeTable; // Table of all scopes in CI
|
||
|
BOOL _fRecovering; // TRUE if in midst of dirty shutdown recovery
|
||
|
BOOL _fRecoveryCompleted; // TRUE AFTER recovery has successfully completed
|
||
|
|
||
|
BOOL _fAutoAlias; // TRUE if all net shares should be added as fixups
|
||
|
|
||
|
BOOL _fIndexW3Roots; // TRUE if should grovel W3 roots
|
||
|
BOOL _fIndexNNTPRoots; // TRUE if should grovel NNTP roots
|
||
|
BOOL _fIndexIMAPRoots; // TRUE if should grovel IMAP roots
|
||
|
|
||
|
ULONG _W3SvcInstance; // instance # of w3svc
|
||
|
ULONG _NNTPSvcInstance; // instance # of nntpsvc
|
||
|
ULONG _IMAPSvcInstance; // instance # of imapsvc
|
||
|
|
||
|
BOOL _fIsIISAdminAlive; // TRUE if the iisadmin svc is up
|
||
|
|
||
|
FILETIME _ftLastCLFlush; // Last ChangeLog Flush time
|
||
|
|
||
|
CUsnFlushInfoList _usnFlushInfoList; // List of usn info
|
||
|
CVolumeInfo _aUsnVolumes[ RTL_MAX_DRIVE_LETTERS ]; // Info about each usn volume
|
||
|
unsigned _cUsnVolumes;
|
||
|
CDrvNotifArray & _DrvNotifArray;
|
||
|
|
||
|
//
|
||
|
// CI Framework support.
|
||
|
//
|
||
|
XInterface<ICiManager> _xCiManager; // ContentIndex manager
|
||
|
XInterface<ICiCAdviseStatus> _xAdviseStatus;
|
||
|
|
||
|
XPtr<CEventSem> _evtRescanTC; // Rescan token cache
|
||
|
|
||
|
XArray<WCHAR> _xName; // friendly name of catalog
|
||
|
XArray<WCHAR> _xScopesKey; // handy registry key
|
||
|
};
|
||
|
|
||
|
inline BOOL CiCat::IsDiskLowError( DWORD status )
|
||
|
{
|
||
|
return STATUS_DISK_FULL == status ||
|
||
|
ERROR_DISK_FULL == status ||
|
||
|
HRESULT_FROM_WIN32(ERROR_DISK_FULL) == status ||
|
||
|
FILTER_S_DISK_FULL == status ||
|
||
|
CI_E_CONFIG_DISK_FULL == status;
|
||
|
}
|
||
|
|
||
|
inline void CiCat::FillMaxTime( FILETIME & ft )
|
||
|
{
|
||
|
ft.dwLowDateTime = 0xFFFFFFFF;
|
||
|
ft.dwHighDateTime = 0xFFFFFFFF;
|
||
|
}
|
||
|
|
||
|
inline BOOL CiCat::IsMaxTime( const FILETIME & ft )
|
||
|
{
|
||
|
return 0xFFFFFFFF == ft.dwLowDateTime &&
|
||
|
0xFFFFFFFF == ft.dwHighDateTime;
|
||
|
}
|
||
|
|
||
|
inline BOOL CiCat::VirtualToAllPhysicalRoots( WCHAR const * pwcVPath,
|
||
|
unsigned ccVPath,
|
||
|
XGrowable<WCHAR> & xwcsVRoot,
|
||
|
unsigned & ccVRoot,
|
||
|
CLowerFunnyPath & lcaseFunnyPRoot,
|
||
|
unsigned & ccPRoot,
|
||
|
ULONG & ulType,
|
||
|
unsigned & iBmk )
|
||
|
{
|
||
|
return _strings.VirtualToAllPhysicalRoots( pwcVPath,
|
||
|
ccVPath,
|
||
|
xwcsVRoot,
|
||
|
ccVRoot,
|
||
|
lcaseFunnyPRoot,
|
||
|
ccPRoot,
|
||
|
ulType,
|
||
|
iBmk );
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CReferenceCount
|
||
|
//
|
||
|
// Purpose: Counts references
|
||
|
//
|
||
|
// History: 23-Sep-97 dlee Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CReferenceCount
|
||
|
{
|
||
|
public:
|
||
|
CReferenceCount( long & lCount, BOOL fInc = TRUE ) :
|
||
|
_lCount( lCount ), _fInc( fInc )
|
||
|
{
|
||
|
if ( fInc )
|
||
|
InterlockedIncrement( &_lCount );
|
||
|
}
|
||
|
|
||
|
long Increment()
|
||
|
{
|
||
|
Win4Assert( !_fInc );
|
||
|
_fInc = TRUE;
|
||
|
return InterlockedIncrement( &_lCount );
|
||
|
}
|
||
|
|
||
|
long Decrement()
|
||
|
{
|
||
|
Win4Assert( _fInc );
|
||
|
_fInc = FALSE;
|
||
|
return InterlockedDecrement( &_lCount );
|
||
|
}
|
||
|
|
||
|
~CReferenceCount()
|
||
|
{
|
||
|
if ( _fInc )
|
||
|
InterlockedDecrement( &_lCount );
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
long & _lCount;
|
||
|
BOOL _fInc;
|
||
|
};
|
||
|
|
||
|
|