|
|
/**************************************************************************\
* * Copyright (c) 1999 Microsoft Corporation * * Module Name: * * NtfsStream.hpp * * Abstract: * * This file provides the Flat File IStream implementation. * * Created: * * 4/26/1999 Mike Hillberg * \**************************************************************************/
#pragma once
#ifndef _NTFSSTREAM_HPP
#define _NTFSSTREAM_HPP
#define ErrJmp(comp, label, errval, var) \
{\ var = errval;\ goto label;\ }
#define nffErr(l, e) ErrJmp(nff, l, e, sc)
#define nffChkTo(l, e) if (FAILED(sc = (e))) nffErr(l, sc) else 1
#define nffChk(e) nffChkTo(EH_Err, e)
#define nffHChkTo(l, e) if (FAILED(sc = DfGetScode(e))) nffErr(l, sc) else 1
#define nffHChk(e) nffHChkTo(EH_Err, e)
#define nffMemTo(l, e) \
if ((e) == NULL) nffErr(l, STG_E_INSUFFICIENTMEMORY) else 1 #define nffMem(e) nffMemTo(EH_Err, e)
#define nffBoolTo(l, e) if (!(e)) nffErr(l, LAST_STG_SCODE) else 1
#define nffBool(e) nffBoolTo(EH_Err, e)
#define STREAMBUFFERSIZE 8192
////////////////////////////////////////////////////////////////
// IStream for a file stream.
//
class FileStream : public IStream {
// ------------
// Construction
// ------------
public:
FileStream( ); virtual ~FileStream(); virtual HRESULT Init( HANDLE hFile, DWORD grfMode, const OLECHAR *pwcsName );
// --------
// IUnknown
// --------
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
// -------
// IStream
// -------
HRESULT STDMETHODCALLTYPE Read( /* [length_is][size_is][out] */ void __RPC_FAR *pv, /* [in] */ ULONG cb, /* [out] */ ULONG __RPC_FAR *pcbRead);
HRESULT STDMETHODCALLTYPE Write( /* [size_is][in] */ const void __RPC_FAR *pv, /* [in] */ ULONG cb, /* [out] */ ULONG __RPC_FAR *pcbWritten);
HRESULT STDMETHODCALLTYPE Seek( /* [in] */ LARGE_INTEGER dlibMove, /* [in] */ DWORD dwOrigin, /* [out] */ ULARGE_INTEGER __RPC_FAR *plibNewPosition);
HRESULT STDMETHODCALLTYPE SetSize( /* [in] */ ULARGE_INTEGER libNewSize);
HRESULT STDMETHODCALLTYPE CopyTo( /* [unique][in] */ IStream __RPC_FAR *pstm, /* [in] */ ULARGE_INTEGER cb, /* [out] */ ULARGE_INTEGER __RPC_FAR *pcbRead, /* [out] */ ULARGE_INTEGER __RPC_FAR *pcbWritten);
HRESULT STDMETHODCALLTYPE Commit( /* [in] */ DWORD grfCommitFlags);
HRESULT STDMETHODCALLTYPE Revert(void);
HRESULT STDMETHODCALLTYPE LockRegion( /* [in] */ ULARGE_INTEGER libOffset, /* [in] */ ULARGE_INTEGER cb, /* [in] */ DWORD dwLockType);
HRESULT STDMETHODCALLTYPE UnlockRegion( /* [in] */ ULARGE_INTEGER libOffset, /* [in] */ ULARGE_INTEGER cb, /* [in] */ DWORD dwLockType);
HRESULT STDMETHODCALLTYPE Stat( /* [out] */ STATSTG __RPC_FAR *pstatstg, /* [in] */ DWORD grfStatFlag);
HRESULT STDMETHODCALLTYPE Clone( /* [out] */ IStream __RPC_FAR *__RPC_FAR *ppstm);
public:
inline BOOL IsWriteable(); HRESULT CheckReverted();
// ----------------
// Internal Methods
// ----------------
protected:
virtual HRESULT ShutDown(); HRESULT Delete();
private:
HRESULT SetFileSize( const CULargeInteger &uliNewSize ); HRESULT Rename( const WCHAR *pwcsName, BOOL fOverWrite );
inline HRESULT Lock( DWORD dwTimeout ); inline HRESULT Unlock();
static HRESULT DeleteStream( HANDLE *phStream );
HANDLE GetFileHandle();
// --------------
// Internal State
// --------------
private:
CRITICAL_SECTION _critsec; BOOL _bCritSecInitialized; WCHAR * _pwcsName;
DWORD _grfMode; // The mode used to open the IStream
HANDLE _hFile; // File represented by this stream
LONG _cRefs; // Reference count
// This class maintains its own copy of the seek pointer, different from
// the underlying file's. This is necessary so that the IStream methods mantain
// a consistent seek location, even when methods on e.g. IMappedStream are called.
CLargeInteger _liCurrentSeekPosition;
}; // class FileStream
inline HANDLE FileStream::GetFileHandle() { return _hFile; }
inline HRESULT FileStream::CheckReverted() { if(INVALID_HANDLE_VALUE == _hFile) return STG_E_REVERTED;
return S_OK; }
inline BOOL GrfModeIsWriteable( DWORD grfMode ) { return( (STGM_WRITE & grfMode) || (STGM_READWRITE & grfMode) ); }
inline BOOL FileStream::IsWriteable() { return( GrfModeIsWriteable( _grfMode )); }
inline HRESULT FileStream::Lock( DWORD dwTimeout ) { EnterCriticalSection( &_critsec ); return( S_OK ); }
inline HRESULT FileStream::Unlock() { LeaveCriticalSection( &_critsec ); return( S_OK ); }
#endif // _NTFSSTREAM_HPP
|