Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

275 lines
12 KiB

#ifndef _FSARSC_
#define _FSARSC_
/*++
© 1998 Seagate Software, Inc. All rights reserved.
Module Name:
fsarsc.h
Abstract:
This module represents a file system resource (i.e. volume)
for NTFS 5.0.
Author:
Chuck Bardeen [cbardeen] 1-Dec-1996
Revision History:
--*/
#include "resource.h" // main symbols
#include "fsa.h"
#include "task.h"
#define FSA_VALIDATE_LOG_KEY_NAME OLESTR("SYSTEM\\CurrentControlSet\\Services\\Remote_Storage_File_System_Agent\\Validate")
// Usn journal Registry parameters
#define FSA_USN_MIN_SIZE OLESTR("UsnMinSize")
#define FSA_USN_MAX_SIZE OLESTR("UsnMaxSize")
#define FSA_USN_FREE_SPACE_FRACTION OLESTR("UsnSizeFreeSpaceFraction")
#define FSA_USN_TOTAL_SPACE_FRACTION OLESTR("UsnSizeTotalSpaceFraction")
// Usn journal defaults
#define FSA_USN_MIN_SIZE_DEFAULT 100 // in MB
#define FSA_USN_MAX_SIZE_DEFAULT 4096 // in MB (4 GB)
#define FSA_USN_FREE_SPACE_FRACTION_DEFAULT 64 // 1/64 out of current free space
#define FSA_USN_TOTAL_SPACE_FRACTION_DEFAULT 64 // 1/64 out of total volume space
#define UNMANAGE_DB_PREFIX OLESTR("Unmanage_")
/*++
Class Name:
CFsaResource
Class Description:
This class represents a file system resource (i.e. volume)
for NTFS 5.0.
--*/
class CFsaResource :
public CWsbCollectable,
public IFsaResource,
public IFsaResourcePriv,
public IConnectionPointContainerImpl<CFsaResource>,
public IConnectionPointImpl<CFsaResource, &IID_IHsmEvent, CComDynamicUnkArray>,
public CComCoClass<CFsaResource,&CLSID_CFsaResourceNTFS>
{
public:
CFsaResource() {}
BEGIN_COM_MAP(CFsaResource)
COM_INTERFACE_ENTRY(IFsaResource)
COM_INTERFACE_ENTRY(IFsaResourcePriv)
COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
COM_INTERFACE_ENTRY(IPersistStream)
COM_INTERFACE_ENTRY(IWsbCollectable)
COM_INTERFACE_ENTRY(IWsbTestable)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
DECLARE_REGISTRY_RESOURCEID(IDR_FsaResource)
// Connection Point
BEGIN_CONNECTION_POINT_MAP(CFsaResource)
CONNECTION_POINT_ENTRY(IID_IHsmEvent)
END_CONNECTION_POINT_MAP()
// CComObjectRoot
public:
STDMETHOD(FinalConstruct)(void);
STDMETHOD(FinalRelease)(void);
// IWsbCollectable
public:
STDMETHOD(CompareTo)(IUnknown* pUnknown, SHORT* pResult);
// IPersist
public:
STDMETHOD(GetClassID)(LPCLSID pClsid);
// IPersistStream
public:
STDMETHOD(GetSizeMax)(ULARGE_INTEGER* pSize);
STDMETHOD(Load)(IStream* pStream);
STDMETHOD(Save)(IStream* pStream, BOOL clearDirty);
// IWsbTestable
STDMETHOD(Test)(USHORT *passed, USHORT* failed);
// IHsmSystemState
STDMETHOD( ChangeSysState )( HSM_SYSTEM_STATE* pSysState );
// IFsaResourcePriv
public:
STDMETHOD(AddPremigratedSize)(LONGLONG size);
STDMETHOD(AddTruncatedSize)(LONGLONG size);
STDMETHOD(DoRecovery)(void);
STDMETHOD(FilterSawOpen)(IHsmSession* pSession, IFsaFilterRecall* pRecall,
OLECHAR* path, LONGLONG fileId,
LONGLONG requestOffset, LONGLONG requestSize,
FSA_PLACEHOLDER* pPlaceholder, ULONG mode,
FSA_RESULT_ACTION resultAction, DWORD threadId);
STDMETHOD(FilterSawDelete)(GUID filterId, OLECHAR* path, LONGLONG size,
FSA_PLACEHOLDER* pPlaceholder);
STDMETHOD(GetPremigrated)(REFIID riid, void** ppDb);
STDMETHOD(GetUnmanageDb)(REFIID riid, void** ppDb);
STDMETHOD(Init)(IFsaServer* pFsaServer, OLECHAR* path, OLECHAR *dosName);
STDMETHOD(RemovePremigratedSize)(LONGLONG size);
STDMETHOD(RemoveTruncatedSize)(LONGLONG size);
STDMETHOD(SetAlternatePath)(OLECHAR* name);
STDMETHOD(SetIdentifier)(GUID id);
STDMETHOD(SetName)(OLECHAR* name);
STDMETHOD(SetOldPath)(OLECHAR* oldPath);
STDMETHOD(SetPath)(OLECHAR* name);
STDMETHOD(SetUserFriendlyName)(OLECHAR* name);
STDMETHOD(SetStickyName)(OLECHAR* name);
STDMETHOD(UpdateFrom)(IFsaServer* pServer, IFsaResource* pResource);
STDMETHOD(InitializeUnmanageDb)(void);
STDMETHOD(TerminateUnmanageDb)(void);
// IFsaResource
public:
STDMETHOD(AddPremigrated)(IFsaScanItem* pScanItem, LONGLONG offset, LONGLONG size,
BOOL isWaitingForClose, LONGLONG usn);
STDMETHOD(AddTruncated)(IFsaScanItem* pScanItem, LONGLONG offset, LONGLONG size);
STDMETHOD(BeginSession)(OLECHAR* name, ULONG logControl, ULONG runId, ULONG subRunId,
IHsmSession** ppSession);
STDMETHOD(BeginValidate)(void);
STDMETHOD(CompareBy)(FSA_RESOURCE_COMPARE by);
STDMETHOD(CompareToAlternatePath)(OLECHAR* name, SHORT* pResult);
STDMETHOD(CompareToIdentifier)(GUID id, SHORT* pResult);
STDMETHOD(CompareToIResource)(IFsaResource* pResource, SHORT* pResult);
STDMETHOD(CompareToName)(OLECHAR* name, SHORT* pResult);
STDMETHOD(CompareToUserName)(OLECHAR* userName, SHORT* pResult);
STDMETHOD(CompareToPath)(OLECHAR* name, SHORT* pResult);
STDMETHOD(CompareToSerial)(ULONG serial, SHORT* pResult);
STDMETHOD(CompareToStickyName)(OLECHAR* name, SHORT* pResult);
STDMETHOD(CreateDefaultRules)(void);
STDMETHOD(EndSession)(IHsmSession* pSession);
STDMETHOD(EndValidate)(HSM_JOB_STATE state);
STDMETHOD(EnumDefaultRules)(IWsbEnum** ppEnum);
STDMETHOD(FindFirst)(OLECHAR* path, IHsmSession* pSession, IFsaScanItem** ppScanItem);
STDMETHOD(FindFirstInRPIndex)(IHsmSession* pSession, IFsaScanItem** ppScanItem);
STDMETHOD(FindFirstInDbIndex)(IHsmSession* pSession, IFsaScanItem** ppScanItem);
STDMETHOD(FindNext)(IFsaScanItem* pScanItem);
STDMETHOD(FindNextInRPIndex)(IFsaScanItem* pScanItem);
STDMETHOD(FindNextInDbIndex)(IFsaScanItem* pScanItem);
STDMETHOD(FindFileId)(LONGLONG fileId, IHsmSession* pSession,
IFsaScanItem** ppScanItem);
STDMETHOD(FindObjectId)(LONGLONG objIdHi, LONGLONG objIdLo, IHsmSession* pSession,
IFsaScanItem** ppScanItem);
STDMETHOD(GetAlternatePath)(OLECHAR** pPath, ULONG bufferSize);
STDMETHOD(GetDefaultRules)(IWsbCollection** ppCollection);
STDMETHOD(GetDbPath)(OLECHAR** pPath, ULONG bufferSize);
STDMETHOD(GetUnmanageDbPath)(OLECHAR** pPath, ULONG bufferSize);
STDMETHOD(GetFreeLevel)(ULONG* pLevel);
STDMETHOD(GetFsName)(OLECHAR** pName, ULONG bufferSize);
STDMETHOD(GetHsmEngine)(IHsmFsaTskMgr** ppEngine);
STDMETHOD(GetHsmLevel)(ULONG* pLevel);
STDMETHOD(GetIdentifier)(GUID* pId);
STDMETHOD(GetLogicalName)(OLECHAR** pName, ULONG bufferSize);
STDMETHOD(GetManageableItemLogicalSize)(LONGLONG* pSize);
STDMETHOD(GetManageableItemAccessTime)(BOOL* isRelative, FILETIME* pTime);
STDMETHOD(GetManagingHsm)(GUID* pId);
STDMETHOD(GetName)(OLECHAR** pName, ULONG bufferSize);
STDMETHOD(GetOldPath)(OLECHAR** pPath, ULONG bufferSize);
STDMETHOD(GetPath)(OLECHAR** pPath, ULONG bufferSize);
STDMETHOD(GetSerial)(ULONG *serial);
STDMETHOD(GetSizes)(LONGLONG* pTotal, LONGLONG* pFree, LONGLONG* pPremigrated,
LONGLONG* pTruncated);
STDMETHOD(GetTruncator)(IFsaTruncator** ppTruncator);
STDMETHOD(GetUncPath)(OLECHAR** pPath, ULONG bufferSize);
STDMETHOD(GetUserFriendlyName)(OLECHAR** pName, ULONG bufferSize);
STDMETHOD(GetStickyName)(OLECHAR** pName, ULONG bufferSize);
STDMETHOD(IsActive)(void);
STDMETHOD(IsAvailable)(void);
STDMETHOD(IsDeletePending)(void);
STDMETHOD(IsManaged)(void);
STDMETHOD(Manage)(IFsaScanItem* pScanItem, LONGLONG offset, LONGLONG size,
GUID storagePoolId, BOOL truncate);
STDMETHOD(ManagedBy)(GUID hsmId, ULONG hsmLevel, BOOL release);
STDMETHOD(NeedsRepair)(void);
STDMETHOD(ProcessResult)(IFsaPostIt* pResult);
STDMETHOD(Recall)(IFsaScanItem* pScanItem, LONGLONG offset, LONGLONG size,
BOOL deletePlaceholder);
STDMETHOD(RemovePremigrated)(IFsaScanItem* pScanItem, LONGLONG offset, LONGLONG size);
STDMETHOD(RemoveTruncated)(IFsaScanItem* pScanItem, LONGLONG offset, LONGLONG size);
STDMETHOD(SetHsmLevel)(ULONG level);
STDMETHOD(SetIsActive)(BOOL isActive);
STDMETHOD(SetIsAvailable)(BOOL isAvailable);
STDMETHOD(SetIsDeletePending)(BOOL isDeletePending);
STDMETHOD(SetManageableItemLogicalSize)(LONGLONG pSize);
STDMETHOD(SetManageableItemAccessTime)(BOOL isRelative, FILETIME pTime);
STDMETHOD(SetSerial)(ULONG serial);
STDMETHOD(StartJob)(OLECHAR* startingPath, IHsmSession* pSession);
STDMETHOD(StartJobSession)(IHsmJob* pJob, ULONG subRunId, IHsmSession** ppSession);
STDMETHOD(Validate)(IFsaScanItem* pScanItem, LONGLONG offset, LONGLONG size,
LONGLONG usn);
STDMETHOD(SetupValidateJob)(SYSTEMTIME runtime);
STDMETHOD(CheckForValidate)(BOOL bForceValidate);
STDMETHOD(GetUsnId)(ULONGLONG *usnId);
STDMETHOD(ValidateForTruncate)(IFsaScanItem* pScanItem, LONGLONG offset, LONGLONG size,
LONGLONG usn);
// Local Methods
void OnStateChange( void );
protected:
STDMETHOD(CheckForJournal)(BOOL *pValidateNeeded);
STDMETHOD(InitializePremigrationList)(BOOL bStartValidateJob);
HRESULT ReadIdentifier(void);
HRESULT WriteIdentifier(void);
protected:
GUID m_id;
CWsbStringPtr m_oldPath; // Previous value for 'm_path'.
CWsbStringPtr m_path; // Drive letter (with backslash) if named
// volume, otherwise same as m_stickyName.
CWsbStringPtr m_alternatePath;
CWsbStringPtr m_name; // Volume name.
CWsbStringPtr m_userName; // Drive letter (with backslash) if named
// volume, otherwise NULL.
CWsbStringPtr m_stickyName; // Long ugly PNP name (without \\?\ prefix)
CWsbStringPtr m_fsName; // File system type (e.g., NTFS).
BOOL m_isActive;
BOOL m_isAvailable; // If volume is manageable.
BOOL m_isDeletePending;
BOOL m_isRecovered;
BOOL m_isDbInitialized;
ULONG m_maxComponentLength;
ULONG m_fsFlags;
FSA_RESOURCE_COMPARE m_compareBy;
GUID m_managingHsm;
ULONG m_hsmLevel;
LONGLONG m_premigratedSize;
LONGLONG m_truncatedSize;
LONGLONG m_oldPremigratedSize;
LONGLONG m_oldTruncatedSize;
BOOL m_isDoingValidate;
LONGLONG m_manageableItemLogicalSize;
BOOL m_manageableItemAccessTimeIsRelative;
FILETIME m_manageableItemAccessTime;
ULONGLONG m_usnJournalId;
LONGLONG m_lastUsnId;
IFsaServer* m_pFsaServer; // Parent Pointer, Weak Reference
// (do not AddRef() it)
unsigned long m_serial; // Serial number of volume
CComPtr<IFsaPremigratedDb> m_pPremigrated;
CComPtr<IHsmFsaTskMgr> m_pHsmEngine;
CComPtr<IFsaTruncator> m_pTruncator;
CComPtr<IWsbCollection> m_pDefaultRules;
CComPtr<IFsaUnmanageDb> m_pUnmanageDb;
BOOL m_isUnmanageDbInitialized;
};
#endif // _FSARSC_