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.
192 lines
7.2 KiB
192 lines
7.2 KiB
#ifndef _FSAITEM_
|
|
#define _FSAITEM_
|
|
|
|
/*++
|
|
|
|
© 1998 Seagate Software, Inc. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
fsaitem.cpp
|
|
|
|
Abstract:
|
|
|
|
This class contains represents a scan item (i.e. file or directory) for NTFS 5.0.
|
|
|
|
Author:
|
|
|
|
Chuck Bardeen [cbardeen] 1-Dec-1996
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "resource.h" // main symbols
|
|
|
|
#include "wsb.h"
|
|
#include "job.h"
|
|
#include "mover.h"
|
|
#include "fsa.h"
|
|
#include "fsaprv.h"
|
|
|
|
// Registry parameters
|
|
#define FSA_MAX_SIZE_DISK_FULL OLESTR("MaxSizeDiskFullKB")
|
|
|
|
// Usn journal defaults
|
|
#define FSA_MAX_SIZE_DISK_FULL_DEFAULT (10 * 1024) // in KB (i.e. 10 MB)
|
|
|
|
/*++
|
|
|
|
Class Name:
|
|
|
|
CFsaScanItem
|
|
|
|
Class Description:
|
|
|
|
|
|
--*/
|
|
|
|
|
|
class CFsaScanItem :
|
|
public CComObjectRoot,
|
|
public IFsaScanItem,
|
|
public IFsaScanItemPriv,
|
|
public CComCoClass<CFsaScanItem,&CLSID_CFsaScanItemNTFS>
|
|
{
|
|
public:
|
|
CFsaScanItem() {}
|
|
BEGIN_COM_MAP(CFsaScanItem)
|
|
COM_INTERFACE_ENTRY(IFsaScanItem)
|
|
COM_INTERFACE_ENTRY(IFsaScanItemPriv)
|
|
// COM_INTERFACE_ENTRY(IWsbCollectable)
|
|
// COM_INTERFACE_ENTRY(IWsbTestable)
|
|
END_COM_MAP()
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_FsaScanItem)
|
|
|
|
// CComObjectRoot
|
|
public:
|
|
HRESULT FinalConstruct(void);
|
|
void FinalRelease(void);
|
|
|
|
// IWsbCollectable
|
|
public:
|
|
STDMETHOD(CompareTo)(IUnknown* pUnknown, SHORT* pResult);
|
|
|
|
// IWsbTestable
|
|
STDMETHOD(Test)(USHORT *passed, USHORT* failed);
|
|
|
|
// IFsaScanItemPriv
|
|
public:
|
|
STDMETHOD(FindFirst)(IFsaResource* pResource, OLECHAR* path, IHsmSession* pSession);
|
|
STDMETHOD(FindFirstInRPIndex)(IFsaResource* pResource, IHsmSession* pSession);
|
|
STDMETHOD(FindFirstInDbIndex)(IFsaResource* pResource, IHsmSession* pSession);
|
|
STDMETHOD(FindNext)(void);
|
|
STDMETHOD(FindNextInRPIndex)(void);
|
|
STDMETHOD(FindNextInDbIndex)(void);
|
|
STDMETHOD(TruncateInternal)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(VerifyInternal)(LONGLONG offset, LONGLONG size, LONGLONG usn1, LONGLONG usn2);
|
|
|
|
// IFsaScanItem
|
|
public:
|
|
STDMETHOD(CheckIfSparse)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(CompareToIScanItem)(IFsaScanItem* pScanItem, SHORT* pResult);
|
|
STDMETHOD(CompareToPathAndName)(OLECHAR* path, OLECHAR* name, SHORT* pResult);
|
|
STDMETHOD(Copy)(OLECHAR* dest, BOOL retainHierarcy, BOOL expandPlaceholders, BOOL overwriteExisting);
|
|
STDMETHOD(CreateLocalStream)(IStream **ppStream);
|
|
STDMETHOD(CreatePlaceholder)(LONGLONG offset, LONGLONG size, FSA_PLACEHOLDER pPlaceholder, BOOL checkUsn, LONGLONG usn, LONGLONG *pUsn);
|
|
STDMETHOD(Delete)(void);
|
|
STDMETHOD(DeletePlaceholder)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(FindFirstPlaceholder)(LONGLONG* pOffset, LONGLONG* pSize, FSA_PLACEHOLDER* pPlaceholder);
|
|
STDMETHOD(FindNextPlaceholder)(LONGLONG* pOffset, LONGLONG* pSize, FSA_PLACEHOLDER* pPlaceholder);
|
|
STDMETHOD(GetAccessTime)(FILETIME* pTime);
|
|
STDMETHOD(GetFileId)(LONGLONG* pFileId);
|
|
STDMETHOD(GetFileUsn)(LONGLONG* pFileUsn);
|
|
STDMETHOD(GetFullPathAndName)(OLECHAR* prependix, OLECHAR *appendix, OLECHAR** pPath, ULONG bufferSize);
|
|
STDMETHOD(GetGroup)(OLECHAR** pOwner, ULONG bufferSize);
|
|
STDMETHOD(GetLogicalSize)(LONGLONG* pSize);
|
|
STDMETHOD(GetModifyTime)(FILETIME* pTime);
|
|
STDMETHOD(GetOwner)(OLECHAR** pOwner, ULONG bufferSize);
|
|
STDMETHOD(GetName)(OLECHAR** pName, ULONG bufferSize);
|
|
STDMETHOD(GetPath)(OLECHAR** pPath, ULONG bufferSize);
|
|
STDMETHOD(GetPathForFind)(OLECHAR* searchName, OLECHAR** pPath, ULONG bufferSize);
|
|
STDMETHOD(GetPathAndName)(OLECHAR* appendix, OLECHAR** pPath, ULONG bufferSize);
|
|
STDMETHOD(GetPhysicalSize)(LONGLONG* pSize);
|
|
STDMETHOD(GetPlaceholder)(LONGLONG offset, LONGLONG size, FSA_PLACEHOLDER* pPlaceholder);
|
|
STDMETHOD(GetSession)(IHsmSession** ppSession);
|
|
STDMETHOD(GetUncPathAndName)(OLECHAR* prependix, OLECHAR *appendix, OLECHAR** pPath, ULONG bufferSize);
|
|
STDMETHOD(GetVersionId)(LONGLONG* pId);
|
|
STDMETHOD(HasExtendedAttributes)(void);
|
|
STDMETHOD(IsALink)(void);
|
|
STDMETHOD(IsAParent)(void);
|
|
STDMETHOD(IsARelativeParent)(void);
|
|
STDMETHOD(IsCompressed)(void);
|
|
STDMETHOD(IsDeleteOK)(IFsaPostIt *pPostIt);
|
|
STDMETHOD(IsEncrypted)(void);
|
|
STDMETHOD(IsHidden)(void);
|
|
STDMETHOD(IsGroupMemberOf)(OLECHAR* group);
|
|
STDMETHOD(IsManageable)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(IsManaged)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(IsMbit)(void);
|
|
STDMETHOD(IsOffline)(void);
|
|
STDMETHOD(IsMigrateOK)(IFsaPostIt *pPostIt);
|
|
STDMETHOD(IsOwnerMemberOf)(OLECHAR* group);
|
|
STDMETHOD(IsPremigrated)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(IsReadOnly)(void);
|
|
STDMETHOD(IsRecallOK)(IFsaPostIt *pPostIt);
|
|
STDMETHOD(IsSparse)(void);
|
|
STDMETHOD(IsSystem)(void);
|
|
STDMETHOD(IsTotallySparse)(void);
|
|
STDMETHOD(IsTruncated)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(Manage)(LONGLONG offset, LONGLONG size, GUID storagePoolId, BOOL truncate);
|
|
STDMETHOD(Move)(OLECHAR* dest, BOOL retainHierarcy, BOOL expandPlaceholders, BOOL overwriteExisting);
|
|
STDMETHOD(Recall)(LONGLONG offset, LONGLONG size, BOOL deletePlaceholder);
|
|
STDMETHOD(Recycle)(void);
|
|
STDMETHOD(Truncate)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(Unmanage)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(Validate)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(PrepareForManage)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(Verify)(LONGLONG offset, LONGLONG size);
|
|
STDMETHOD(TruncateValidated)(LONGLONG offset, LONGLONG size);
|
|
|
|
// Private functions
|
|
private:
|
|
STDMETHOD(CheckUsnJournalForChanges)(LONGLONG StartUsn, LONGLONG StopUsn, BOOL *pChanged);
|
|
STDMETHOD(GetPremigratedUsn)(LONGLONG* pFileUsn);
|
|
STDMETHOD(GetFromRPIndex)(BOOL first);
|
|
STDMETHOD(GetFromDbIndex)(BOOL first);
|
|
STDMETHOD(CalculateCurrentCRCAndUSN)(LONGLONG offset,LONGLONG size, ULONG *pCurrentCRC, LONGLONG *pUsn);
|
|
STDMETHOD(CalculateCurrentCRCInternal)(HANDLE handle, LONGLONG offset,LONGLONG size, ULONG *pCurrentCRC);
|
|
STDMETHOD(MakeReadWrite)(void);
|
|
STDMETHOD(RestoreAttributes)(void);
|
|
STDMETHOD(CheckIfDiskFull)(void);
|
|
|
|
protected:
|
|
CComPtr<IFsaResource> m_pResource;
|
|
CWsbStringPtr m_path;
|
|
CComPtr<IHsmSession> m_pSession;
|
|
HANDLE m_handle;
|
|
WIN32_FIND_DATA m_findData;
|
|
BOOL m_gotPhysicalSize;
|
|
ULARGE_INTEGER m_physicalSize;
|
|
BOOL m_gotPlaceholder;
|
|
FSA_PLACEHOLDER m_placeholder;
|
|
BOOL m_changedAttributes;
|
|
ULONG m_originalAttributes;
|
|
CComPtr<IDataMover> m_pDataMover;
|
|
CComPtr<IStream> m_pStream;
|
|
|
|
// Only used for Reparse Point Index scan:
|
|
HANDLE m_handleRPI;
|
|
|
|
// Used by :Verify
|
|
HANDLE m_handleVerify;
|
|
|
|
// Only used for Database scan
|
|
CComPtr<IFsaUnmanageDb> m_pUnmanageDb;
|
|
CComPtr<IFsaUnmanageRec> m_pUnmanageRec;
|
|
CComPtr<IWsbDbSession> m_pDbSession;
|
|
|
|
};
|
|
|
|
#endif // _FSAITEM_
|