Leaked source code of windows server 2003
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.

223 lines
5.2 KiB

  1. /**************************************************************************\
  2. *
  3. * Copyright (c) 1999 Microsoft Corporation
  4. *
  5. * Module Name:
  6. *
  7. * NtfsStream.hpp
  8. *
  9. * Abstract:
  10. *
  11. * This file provides the Flat File IStream implementation.
  12. *
  13. * Created:
  14. *
  15. * 4/26/1999 Mike Hillberg
  16. *
  17. \**************************************************************************/
  18. #pragma once
  19. #ifndef _NTFSSTREAM_HPP
  20. #define _NTFSSTREAM_HPP
  21. #define ErrJmp(comp, label, errval, var) \
  22. {\
  23. var = errval;\
  24. goto label;\
  25. }
  26. #define nffErr(l, e) ErrJmp(nff, l, e, sc)
  27. #define nffChkTo(l, e) if (FAILED(sc = (e))) nffErr(l, sc) else 1
  28. #define nffChk(e) nffChkTo(EH_Err, e)
  29. #define nffHChkTo(l, e) if (FAILED(sc = DfGetScode(e))) nffErr(l, sc) else 1
  30. #define nffHChk(e) nffHChkTo(EH_Err, e)
  31. #define nffMemTo(l, e) \
  32. if ((e) == NULL) nffErr(l, STG_E_INSUFFICIENTMEMORY) else 1
  33. #define nffMem(e) nffMemTo(EH_Err, e)
  34. #define nffBoolTo(l, e) if (!(e)) nffErr(l, LAST_STG_SCODE) else 1
  35. #define nffBool(e) nffBoolTo(EH_Err, e)
  36. #define STREAMBUFFERSIZE 8192
  37. ////////////////////////////////////////////////////////////////
  38. // IStream for a file stream.
  39. //
  40. class FileStream : public IStream
  41. {
  42. // ------------
  43. // Construction
  44. // ------------
  45. public:
  46. FileStream( );
  47. virtual ~FileStream();
  48. virtual HRESULT Init( HANDLE hFile,
  49. DWORD grfMode,
  50. const OLECHAR *pwcsName );
  51. // --------
  52. // IUnknown
  53. // --------
  54. STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject);
  55. STDMETHODIMP_(ULONG) AddRef(void);
  56. STDMETHODIMP_(ULONG) Release(void);
  57. // -------
  58. // IStream
  59. // -------
  60. HRESULT STDMETHODCALLTYPE Read(
  61. /* [length_is][size_is][out] */ void __RPC_FAR *pv,
  62. /* [in] */ ULONG cb,
  63. /* [out] */ ULONG __RPC_FAR *pcbRead);
  64. HRESULT STDMETHODCALLTYPE Write(
  65. /* [size_is][in] */ const void __RPC_FAR *pv,
  66. /* [in] */ ULONG cb,
  67. /* [out] */ ULONG __RPC_FAR *pcbWritten);
  68. HRESULT STDMETHODCALLTYPE Seek(
  69. /* [in] */ LARGE_INTEGER dlibMove,
  70. /* [in] */ DWORD dwOrigin,
  71. /* [out] */ ULARGE_INTEGER __RPC_FAR *plibNewPosition);
  72. HRESULT STDMETHODCALLTYPE SetSize(
  73. /* [in] */ ULARGE_INTEGER libNewSize);
  74. HRESULT STDMETHODCALLTYPE CopyTo(
  75. /* [unique][in] */ IStream __RPC_FAR *pstm,
  76. /* [in] */ ULARGE_INTEGER cb,
  77. /* [out] */ ULARGE_INTEGER __RPC_FAR *pcbRead,
  78. /* [out] */ ULARGE_INTEGER __RPC_FAR *pcbWritten);
  79. HRESULT STDMETHODCALLTYPE Commit(
  80. /* [in] */ DWORD grfCommitFlags);
  81. HRESULT STDMETHODCALLTYPE Revert(void);
  82. HRESULT STDMETHODCALLTYPE LockRegion(
  83. /* [in] */ ULARGE_INTEGER libOffset,
  84. /* [in] */ ULARGE_INTEGER cb,
  85. /* [in] */ DWORD dwLockType);
  86. HRESULT STDMETHODCALLTYPE UnlockRegion(
  87. /* [in] */ ULARGE_INTEGER libOffset,
  88. /* [in] */ ULARGE_INTEGER cb,
  89. /* [in] */ DWORD dwLockType);
  90. HRESULT STDMETHODCALLTYPE Stat(
  91. /* [out] */ STATSTG __RPC_FAR *pstatstg,
  92. /* [in] */ DWORD grfStatFlag);
  93. HRESULT STDMETHODCALLTYPE Clone(
  94. /* [out] */ IStream __RPC_FAR *__RPC_FAR *ppstm);
  95. public:
  96. inline BOOL IsWriteable();
  97. HRESULT CheckReverted();
  98. // ----------------
  99. // Internal Methods
  100. // ----------------
  101. protected:
  102. virtual HRESULT ShutDown();
  103. HRESULT Delete();
  104. private:
  105. HRESULT SetFileSize( const CULargeInteger &uliNewSize );
  106. HRESULT Rename( const WCHAR *pwcsName, BOOL fOverWrite );
  107. inline HRESULT Lock( DWORD dwTimeout );
  108. inline HRESULT Unlock();
  109. static HRESULT DeleteStream( HANDLE *phStream );
  110. HANDLE GetFileHandle();
  111. // --------------
  112. // Internal State
  113. // --------------
  114. private:
  115. CRITICAL_SECTION _critsec;
  116. BOOL _bCritSecInitialized;
  117. WCHAR * _pwcsName;
  118. DWORD _grfMode; // The mode used to open the IStream
  119. HANDLE _hFile; // File represented by this stream
  120. LONG _cRefs; // Reference count
  121. // This class maintains its own copy of the seek pointer, different from
  122. // the underlying file's. This is necessary so that the IStream methods mantain
  123. // a consistent seek location, even when methods on e.g. IMappedStream are called.
  124. CLargeInteger _liCurrentSeekPosition;
  125. }; // class FileStream
  126. inline HANDLE
  127. FileStream::GetFileHandle()
  128. {
  129. return _hFile;
  130. }
  131. inline HRESULT
  132. FileStream::CheckReverted()
  133. {
  134. if(INVALID_HANDLE_VALUE == _hFile)
  135. return STG_E_REVERTED;
  136. return S_OK;
  137. }
  138. inline BOOL
  139. GrfModeIsWriteable( DWORD grfMode )
  140. {
  141. return( (STGM_WRITE & grfMode) || (STGM_READWRITE & grfMode) );
  142. }
  143. inline BOOL
  144. FileStream::IsWriteable()
  145. {
  146. return( GrfModeIsWriteable( _grfMode ));
  147. }
  148. inline HRESULT
  149. FileStream::Lock( DWORD dwTimeout )
  150. {
  151. EnterCriticalSection( &_critsec );
  152. return( S_OK );
  153. }
  154. inline HRESULT
  155. FileStream::Unlock()
  156. {
  157. LeaveCriticalSection( &_critsec );
  158. return( S_OK );
  159. }
  160. #endif // _NTFSSTREAM_HPP