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.
172 lines
5.1 KiB
172 lines
5.1 KiB
#ifndef _FSAFLTR_
|
|
#define _FSAFLTR_
|
|
|
|
/*++
|
|
|
|
© 1998 Seagate Software, Inc. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
fsafltr.h
|
|
|
|
Abstract:
|
|
|
|
This class represents a file system filter for NTFS 5.0.
|
|
|
|
Author:
|
|
|
|
Chuck Bardeen [cbardeen] 12-Feb-1997
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "resource.h" // main symbols
|
|
|
|
#include "wsb.h"
|
|
#include "fsa.h"
|
|
#include "rpdata.h"
|
|
#include "rpguid.h"
|
|
#include "rpio.h"
|
|
|
|
|
|
typedef struct _FSA_IOCTL_CONTROL {
|
|
HANDLE dHand;
|
|
OVERLAPPED overlap;
|
|
RP_MSG in;
|
|
RP_MSG out;
|
|
DWORD outSize;
|
|
struct _FSA_IOCTL_CONTROL *next;
|
|
} FSA_IOCTL_CONTROL, *PFSA_IOCTL_CONTROL;
|
|
|
|
//
|
|
// This defines the length of time a client structure will be kept around after
|
|
// the last recall was done (in seconds).
|
|
//
|
|
#define FSA_CLIENT_EXPIRATION_TIME 600 // 10 minutes
|
|
#define THREAD_HANDLE_COUNT 2 //for WaitForMultipleObjects array
|
|
|
|
/*++
|
|
|
|
Class Name:
|
|
|
|
CFsaFilter
|
|
|
|
Class Description:
|
|
|
|
This class represents a file system filter for NTFS 5.0.
|
|
|
|
--*/
|
|
|
|
class CFsaFilter :
|
|
public CWsbCollectable,
|
|
public IFsaFilter,
|
|
public IFsaFilterPriv,
|
|
public CComCoClass<CFsaFilter,&CLSID_CFsaFilterNTFS>
|
|
{
|
|
public:
|
|
CFsaFilter() {}
|
|
BEGIN_COM_MAP(CFsaFilter)
|
|
COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
|
|
COM_INTERFACE_ENTRY(IPersistStream)
|
|
COM_INTERFACE_ENTRY(IFsaFilter)
|
|
COM_INTERFACE_ENTRY(IFsaFilterPriv)
|
|
COM_INTERFACE_ENTRY(IWsbCollectable)
|
|
COM_INTERFACE_ENTRY(IWsbTestable)
|
|
END_COM_MAP()
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_FsaFilter)
|
|
|
|
// 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);
|
|
|
|
// IFsaFilterPriv
|
|
public:
|
|
STDMETHOD(Init)(IFsaServer* pServer);
|
|
STDMETHOD(SetIdentifier)(GUID id);
|
|
STDMETHOD(IoctlThread)(void);
|
|
STDMETHOD(PipeThread)(void);
|
|
STDMETHOD(SendCancel)(IFsaFilterRecallPriv *pRecallPriv);
|
|
STDMETHOD(SendComplete)(IFsaFilterRecallPriv *pRecall, HRESULT result);
|
|
|
|
// IFsaFilter
|
|
public:
|
|
STDMETHOD(Cancel)(void);
|
|
STDMETHOD(CancelRecall)(IFsaFilterRecall* pRecall);
|
|
STDMETHOD(CompareToIdentifier)(GUID id, SHORT* pResult);
|
|
STDMETHOD(CompareToIFilter)(IFsaFilter* pFilter, SHORT* pResult);
|
|
STDMETHOD(DeleteRecall)(IFsaFilterRecall* pRecall);
|
|
STDMETHOD(EnumRecalls)(IWsbEnum** ppEnum);
|
|
STDMETHOD(GetAdminExemption)(BOOL *isExempt);
|
|
STDMETHOD(GetIdentifier)(GUID* pId);
|
|
STDMETHOD(GetLogicalName)(OLECHAR** pName, ULONG bufferSize);
|
|
STDMETHOD(GetMaxRecallBuffers)(ULONG* pMaxBuffers);
|
|
STDMETHOD(GetMaxRecalls)(ULONG* pMaxRecalls);
|
|
STDMETHOD(GetMinRecallInterval)(ULONG* pMinIterval);
|
|
STDMETHOD(GetState)(HSM_JOB_STATE* pState);
|
|
STDMETHOD(IsEnabled)();
|
|
STDMETHOD(Pause)(void);
|
|
STDMETHOD(Resume)(void);
|
|
STDMETHOD(SetIsEnabled)(BOOL isEnabled);
|
|
STDMETHOD(SetMaxRecalls)(ULONG maxRecalls);
|
|
STDMETHOD(SetMinRecallInterval)(ULONG minIterval);
|
|
STDMETHOD(SetMaxRecallBuffers)(ULONG maxBuffers);
|
|
STDMETHOD(Start)(void);
|
|
STDMETHOD(StopIoctlThread)(void);
|
|
STDMETHOD(FindRecall)(GUID recallId, IFsaFilterRecall** pRecall);
|
|
STDMETHOD(SetAdminExemption)(BOOL isExempt);
|
|
|
|
private:
|
|
HRESULT DoOpenAction(PFSA_IOCTL_CONTROL pIoCmd);
|
|
HRESULT DoRecallWaitingAction(PFSA_IOCTL_CONTROL pIoCmd);
|
|
HRESULT DoRecallAction(PFSA_IOCTL_CONTROL pIoCmd);
|
|
HRESULT DoNoRecallAction(PFSA_IOCTL_CONTROL pIoCmd);
|
|
HRESULT DoCloseAction(PFSA_IOCTL_CONTROL pIoCmd);
|
|
HRESULT DoPreDeleteAction(PFSA_IOCTL_CONTROL pIoCmd);
|
|
HRESULT DoPostDeleteAction(PFSA_IOCTL_CONTROL pIoCmd);
|
|
HRESULT DoCancelRecall(ULONGLONG filterId);
|
|
HRESULT CleanupClients(void);
|
|
NTSTATUS CFsaFilter::TranslateHresultToNtStatus(HRESULT hr);
|
|
|
|
|
|
protected:
|
|
GUID m_id;
|
|
HSM_JOB_STATE m_state;
|
|
ULONG m_maxRecalls;
|
|
ULONG m_minRecallInterval;
|
|
ULONG m_maxRecallBuffers;
|
|
HANDLE m_pipeHandle;
|
|
HANDLE m_pipeThread;
|
|
HANDLE m_ioctlThread;
|
|
HANDLE m_ioctlHandle;
|
|
HANDLE m_terminateEvent;
|
|
IFsaServer* m_pFsaServer; // Parent Pointer, Weak Reference
|
|
CComPtr<IWsbCollection> m_pClients;
|
|
CComPtr<IWsbCollection> m_pRecalls;
|
|
CRITICAL_SECTION m_clientLock; // Protect client collection from multiple thread access
|
|
CRITICAL_SECTION m_recallLock; // Protect recall collection from multiple thread access
|
|
CRITICAL_SECTION m_stateLock; // Protect state change while sending new Ioctls
|
|
BOOL m_isEnabled;
|
|
BOOL m_exemptAdmin; // TRUE = exempt admin from runaway recall check
|
|
};
|
|
|
|
#endif // _FSAFLTR_
|