224 lines
5.2 KiB
C++
224 lines
5.2 KiB
C++
|
/**************************************************************************\
|
||
|
*
|
||
|
* 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
|