summaryrefslogtreecommitdiffstats
path: root/private/ole32/stg/h/msf.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'private/ole32/stg/h/msf.hxx')
-rw-r--r--private/ole32/stg/h/msf.hxx959
1 files changed, 959 insertions, 0 deletions
diff --git a/private/ole32/stg/h/msf.hxx b/private/ole32/stg/h/msf.hxx
new file mode 100644
index 000000000..879e72eec
--- /dev/null
+++ b/private/ole32/stg/h/msf.hxx
@@ -0,0 +1,959 @@
+//+-------------------------------------------------------------------------
+//
+// Microsoft Windows
+// Copyright (C) Microsoft Corporation, 1991 - 1992.
+//
+// File: msf.hxx
+//
+// Contents: Header for MSF for external use
+//
+// Classes: CMStream - Main multi-stream object
+//
+// History: 27-Aug-91 PhilipLa Created.
+// 24-Apr-92 AlexT Added constants for minifat/stream
+//
+//--------------------------------------------------------------------------
+
+#ifndef __MSF_HXX__
+#define __MSF_HXX__
+
+#ifdef REF
+#include <ref.hxx>
+#endif //!REF
+
+#include <dfmsp.hxx>
+#include <error.hxx>
+
+
+#ifndef REF
+#define SECURE
+#endif //!REF
+
+#define msfErr(l, e) ErrJmp(msf, l, e, sc)
+#define msfChkTo(l, e) if (FAILED(sc = (e))) msfErr(l, sc) else 1
+#define msfHChkTo(l, e) if (FAILED(sc = GetScode(e))) msfErr(l, sc) else 1
+#define msfChk(e) msfChkTo(Err, e)
+#define msfHChk(e) msfHChkTo(Err, e)
+#define msfMemTo(l, e) if ((e) == NULL) msfErr(l, STG_E_INSUFFICIENTMEMORY) else 1
+#define msfMem(e) msfMemTo(Err, e)
+
+#if DBG == 1
+DECLARE_DEBUG(msf);
+#endif
+
+#if DBG == 1
+
+#define msfDebugOut(x) msfInlineDebugOut x
+#ifndef REF
+#define msfAssert(e) Win4Assert(e)
+#define msfVerify(e) Win4Assert(e)
+#else
+#include <assert.h>
+#define msfAssert(e) assert(e)
+#define msfVerify(e) assert(e)
+#endif //!REF
+
+#else
+
+#define msfDebugOut(x)
+#define msfAssert(e)
+#define msfVerify(e) (e)
+
+#endif
+
+#if WIN32 == 200
+//SECURE_SIMPLE_MODE means streams in simple mode will zero themselves.
+#define SECURE_SIMPLE_MODE
+//SECURE_STREAMS means streams in regular docfile will zero themselves.
+#define SECURE_STREAMS
+//SECURE_BUFFER means there is a 4K zero-filled buffer available.
+#define SECURE_BUFFER
+//SECURE_TAIL means that regular docfile will write over tail portions of
+// unused sectors.
+#define SECURE_TAIL
+#endif
+//Enable for testing on all platforms.
+//#define SECURE_SIMPLE_MODE
+//#define SECURE_STREAMS
+//#define SECURE_BUFFER
+//#define SECURE_TAIL
+
+
+#if DBG == 1
+#define SECURECHAR 'P'
+#else
+#define SECURECHAR 0
+#endif
+
+#define USE_NEW_GETFREE
+#define DIFAT_LOOKUP_ARRAY
+#define DIFAT_OPTIMIZATIONS
+#define CACHE_ALLOCATE_OPTIMIZATION
+
+//Enable sorting on the page table.
+#define SORTPAGETABLE
+
+//Enable no-scratch mode on all platforms.
+#define USE_NOSCRATCH
+
+//Enable no-snapshot mode on all platforms.
+#define USE_NOSNAPSHOT
+//Enable USE_NOSNAPSHOT_ALWAYS for testig purposes only.
+//#define USE_NOSNAPSHOT_ALWAYS
+
+//Enable coordinated transaction code on Cairo only.
+#if WIN32 == 300
+#define COORD
+#endif
+
+//Enable coordinated transaction code on other platforms
+// For testing only.
+#ifndef COORD
+//#define COORD
+#endif
+
+//Make all transacted opens use coordinate transaction code.
+// For testing only
+//#define HACK_COORD
+
+// MSF entry flags type
+typedef DWORD MSENTRYFLAGS;
+
+// MEF_ANY refers to all entries regardless of type
+const MSENTRYFLAGS MEF_ANY = 255;
+
+//CWCSTREAMNAME is the maximum length (in wide characters) of
+// a stream name.
+const USHORT CWCSTREAMNAME = 32;
+
+//OFFSET and SECT are used to determine positions within
+//a file.
+typedef SHORT OFFSET;
+typedef ULONG SECT;
+
+#ifndef REF
+//MAXINDEX type is used to dodge warnings. It is the
+// largest type for which array[MAXINDEXTYPE] is valid.
+#ifdef FLAT
+
+#define MAXINDEXTYPE ULONG
+
+#else
+#define MAXINDEXTYPE USHORT
+#endif
+#else //NOREF
+#define MAXINDEXTYPE ULONG
+#endif //!REF
+
+//FSINDEX and FSOFFSET are used to determine the position of a sector
+//within the Fat.
+typedef ULONG FSINDEX;
+typedef USHORT FSOFFSET;
+
+// DIRINDEX and DIROFFSET and used to index directory tables
+typedef ULONG DIRINDEX;
+typedef USHORT DIROFFSET;
+
+//Size of a mini sector in bytes.
+const USHORT MINISECTORSHIFT = 6;
+const USHORT MINISECTORSIZE = 1 << MINISECTORSHIFT; //64
+
+//Maximum size of a ministream.
+const USHORT MINISTREAMSIZE=4096;
+
+//Size of a single sector in bytes.
+const USHORT SECTORSHIFT = 9;
+const USHORT SECTORSIZE = 1 << SECTORSHIFT; //512
+
+//Maximum sector shift
+const USHORT MAXSECTORSHIFT = 16;
+
+//Size of header.
+const USHORT HEADERSIZE = SECTORSIZE;
+
+//Size of single DirEntry
+const USHORT DIRENTRYSIZE = SECTORSIZE / 4;
+
+#ifndef REF
+//Size of a single sector in a scratch multistream
+const USHORT SCRATCHSECTORSHIFT = 12;
+const USHORT SCRATCHSECTORSIZE = 1 << SCRATCHSECTORSHIFT; //4096
+#endif //!REF
+
+const ULONG MAX_ULONG = 0xFFFFFFFF;
+
+
+//
+// Predefined Sector Indices
+//
+
+const SECT MAXREGSECT = 0xFFFFFFFA;
+const SECT STREAMSECT = 0xFFFFFFFB;
+const SECT DIFSECT=0xFFFFFFFC;
+const SECT FATSECT=0xFFFFFFFD;
+const SECT ENDOFCHAIN=0xFFFFFFFE;
+const SECT FREESECT=0xFFFFFFFF;
+
+
+//Start of Fat chain
+const SECT SECTFAT = 0;
+
+//Start of directory chain
+const SECT SECTDIR = 1;
+
+//
+// Predefined Stream ID's
+//
+
+//Return code for Directory
+//Used to signal a 'Stream Not Found' condition
+const SID NOSTREAM=0xFFFFFFFF;
+
+//Stream ID of FAT chain
+const SID SIDFAT=0xFFFFFFFE;
+
+//Stream ID of Directory chain
+const SID SIDDIR=0xFFFFFFFD;
+
+//SID for root level object
+const SID SIDROOT = 0;
+
+//SID of MiniFat
+const SID SIDMINIFAT = 0xFFFFFFFC;
+
+//SID of Double-indirect Fat
+const SID SIDDIF = 0xFFFFFFFB;
+
+//Stream ID for MiniStream chain
+const SID SIDMINISTREAM = SIDROOT;
+
+//SID of the largest regular (non-control) SID
+const SID MAXREGSID = 0xFFFFFFFA;
+
+#ifndef REF
+//CSECTPERBLOCK is used in CDeltaList to determine the granularity
+//of the list.
+const USHORT CSECTPERBLOCK = 16;
+#endif //!REF
+
+class MSTREAM_CLASS CMStream;
+
+class PSStream;
+class CDirectStream;
+class CMSFPageTable;
+
+class CStreamCache;
+
+#define FLUSH_ILB TRUE
+
+SAFE_DFBASED_PTR(CBasedMStreamPtr, CMStream);
+#pragma warning(disable: 4284)
+// disable warning about return type of operator->()
+SAFE_DFBASED_PTR(CBasedBytePtr, BYTE);
+SAFE_DFBASED_PTR(CBasedILockBytesPtrPtr, ILockBytes*);
+#pragma warning(default: 4284)
+
+#include <header.hxx>
+#include <fat.hxx>
+#include <dir.hxx>
+#include <difat.hxx>
+#include <cache.hxx>
+
+
+//+----------------------------------------------------------------------
+//
+// Class: CMStream (ms)
+//
+// Purpose: Main interface to multi-streams
+//
+// Interface: See below
+//
+// History: 18-Jul-91 PhilipLa Created.
+// 26-Aug-82 t-chrisy added init function for
+// corrupted mstream
+// 26-May-95 SusiA added GetAllTimes
+// 26-Nov-95 SusiA added SetAllTimes
+// 06-Sep-95 MikeHill Added _fMaintainFLBModifyTimestamp,
+// MaintainFLBModifyTimestamp(),
+// and SetFileLockBytesTime().
+// Notes:
+//
+//-----------------------------------------------------------------------
+
+class MSTREAM_CLASS CMStream : public CMallocBased
+{
+public:
+ MSTREAM_CLASS CMStream(
+ IMalloc *pMalloc,
+ ILockBytes **pplstParent,
+#ifndef REF
+ BOOL fIsScratch,
+#if defined(USE_NOSCRATCH) || defined(USE_NOSNAPSHOT)
+ DFLAGS df,
+#endif
+#endif //!REF
+ USHORT uSectorShift);
+
+#ifndef REF
+ MSTREAM_CLASS CMStream(const CMStream *pms);
+#endif //!REF
+
+ MSTREAM_CLASS ~CMStream();
+
+ SCODE MSTREAM_CLASS Init(VOID);
+
+#ifndef REF
+#ifdef CHKDSK
+ SCODE MSTREAM_CLASS InitCorrupted(VOID);
+#endif
+#endif //!REF
+
+#ifndef REF
+ SCODE MSTREAM_CLASS InitNew(BOOL fDelay, ULARGE_INTEGER uliSize);
+#else
+ SCODE InitNew(ULARGE_INTEGER uliSize);
+#endif //!REF
+
+#ifndef REF
+ SCODE MSTREAM_CLASS InitConvert(BOOL fDelayConvert);
+#else
+ SCODE InitConvert(VOID);
+#endif //!REF
+
+#ifndef REF
+ void MSTREAM_CLASS InitCopy(CMStream *pms);
+#endif //!REF
+
+ SCODE MSTREAM_CLASS InitScratch(CMStream *pmsBase, BOOL fNew);
+
+ void Empty(void);
+
+ inline SCODE MSTREAM_CLASS CreateEntry(
+ SID const sidParent,
+ CDfName const *pdfn,
+ MSENTRYFLAGS const mefFlags,
+ SID *psid);
+
+ // No implementation, currently unused, placeholder
+ void MSTREAM_CLASS ReleaseEntry(SID const sid);
+
+ inline SCODE MSTREAM_CLASS DestroyEntry(
+ SID const sidParent,
+ CDfName const *pdfn);
+
+ inline SCODE MSTREAM_CLASS KillStream(SECT sectStart, ULONG ulSize);
+
+ inline SCODE MSTREAM_CLASS RenameEntry(
+ SID const sidParent,
+ CDfName const *pdfn,
+ CDfName const *pdfnNew);
+
+ inline SCODE MSTREAM_CLASS IsEntry(
+ SID const sidParent,
+ CDfName const *pdfn,
+ SEntryBuffer *peb);
+
+ inline SCODE MSTREAM_CLASS StatEntry(
+ SID const sid,
+ SIterBuffer *pib,
+ STATSTGW *pstatstg);
+
+ SCODE MSTREAM_CLASS GetTime(
+ SID const sid,
+ WHICHTIME const tt,
+ TIME_T *pnt);
+
+ SCODE MSTREAM_CLASS GetAllTimes(
+ SID const sid,
+ TIME_T *patm,
+ TIME_T *pmtm,
+ TIME_T *pctm);
+
+
+ SCODE MSTREAM_CLASS SetAllTimes(
+ SID const sid,
+ TIME_T atm,
+ TIME_T mtm,
+ TIME_T ctm);
+ SCODE MSTREAM_CLASS SetFileLockBytesTime(
+ WHICHTIME const tt,
+ TIME_T nt);
+
+ SCODE MSTREAM_CLASS SetAllFileLockBytesTimes(
+ TIME_T atm,
+ TIME_T mtm,
+ TIME_T ctm);
+
+ SCODE MSTREAM_CLASS SetTime(
+ SID const sid,
+ WHICHTIME const tt,
+ TIME_T nt);
+
+ inline void MSTREAM_CLASS MaintainFLBModifyTimestamp( void );
+
+ inline SCODE MSTREAM_CLASS GetClass(SID const sid,
+ CLSID *pclsid);
+
+ inline SCODE MSTREAM_CLASS SetClass(SID const sid,
+ REFCLSID clsid);
+
+ inline SCODE MSTREAM_CLASS GetStateBits(SID const sid,
+ DWORD *pgrfStateBits);
+
+ inline SCODE MSTREAM_CLASS SetStateBits(SID const sid,
+ DWORD grfStateBits,
+ DWORD grfMask);
+
+#ifdef USE_NOSCRATCH
+ inline void MSTREAM_CLASS SetScratchMS(CMStream *pmsNoScratch);
+#endif
+
+ inline SCODE MSTREAM_CLASS GetEntrySize(
+ SID const sid,
+ ULONG *pcbSize);
+
+ inline SCODE MSTREAM_CLASS GetChild(
+ SID const sid,
+ SID *psid);
+
+ inline SCODE MSTREAM_CLASS FindGreaterEntry(
+ SID sidChildRoot,
+ CDfName const *pdfn,
+ SID *psidResult);
+
+#ifndef REF
+ SCODE MSTREAM_CLASS BeginCopyOnWrite(DWORD const dwFlags);
+
+ SCODE MSTREAM_CLASS EndCopyOnWrite(
+ DWORD const dwCommitFlags,
+ DFLAGS const df);
+
+ SCODE MSTREAM_CLASS ReadSect(
+ SID sid,
+ SECT sect,
+ VOID *pbuf,
+ ULONG& ulRetval);
+
+ SCODE MSTREAM_CLASS WriteSect(
+ SID sid,
+ SECT sect,
+ VOID *pbuf,
+ ULONG& ulRetval);
+#endif //!REF
+
+ inline SCODE MSTREAM_CLASS SetSize(VOID);
+ inline SCODE MSTREAM_CLASS SetMiniSize(VOID);
+
+
+ SCODE MSTREAM_CLASS MWrite(
+ SID sid,
+ BOOL fIsMiniStream,
+ ULONG ulOffset,
+ VOID const HUGEP *pBuffer,
+ ULONG ulCount,
+ CStreamCache *pstmc,
+ ULONG *pulRetVal);
+
+
+ inline CMSFHeader * MSTREAM_CLASS GetHeader(VOID) const;
+ inline CFat * MSTREAM_CLASS GetFat(VOID) const;
+ inline CFat * MSTREAM_CLASS GetMiniFat(VOID) const;
+ inline CDIFat * MSTREAM_CLASS GetDIFat(VOID) const;
+ inline CDirectory * MSTREAM_CLASS GetDir(VOID) const;
+ inline CMSFPageTable * MSTREAM_CLASS GetPageTable(VOID) const;
+#ifndef REF
+ inline ULONG MSTREAM_CLASS GetParentSize(VOID) const;
+#endif //!REF
+
+ inline USHORT GetSectorSize(VOID) const;
+ inline USHORT GetSectorShift(VOID) const;
+ inline USHORT GetSectorMask(VOID) const;
+
+ SCODE MSTREAM_CLASS Flush(BOOL fFlushILB);
+
+ SCODE MSTREAM_CLASS FlushHeader(USHORT uForce);
+
+#ifndef REF
+ inline BOOL MSTREAM_CLASS IsScratch(VOID) const;
+ inline BOOL MSTREAM_CLASS IsUnconverted(VOID) const;
+
+ inline BOOL MSTREAM_CLASS IsInCOW(VOID) const;
+
+ inline BOOL MSTREAM_CLASS IsShadow(VOID) const;
+
+#ifdef USE_NOSCRATCH
+ inline BOOL MSTREAM_CLASS HasNoScratch(VOID) const;
+#endif
+
+#endif //!REF
+
+ inline CDirectStream * MSTREAM_CLASS GetMiniStream(VOID) const;
+ inline ILockBytes * MSTREAM_CLASS GetILB(VOID) const;
+
+ inline SCODE GetSect(SID sid, SECT sect, SECT *psect);
+ inline SCODE GetESect(SID sid, SECT sect, SECT *psect);
+ inline SCODE GetSize(SID sid, ULONG *pulSize);
+
+#ifdef MULTIHEAP
+ IMalloc *GetMalloc(VOID) const;
+#else
+ inline IMalloc *GetMalloc(VOID) const;
+#endif
+
+#ifdef SECURE
+ SCODE SecureSect(
+ const SECT sect,
+ const ULONG ulSize,
+ const BOOL fIsMini);
+#endif //SECURE
+
+ inline CStreamCache * GetDirCache(void) const;
+ inline CStreamCache * GetMiniFatCache(void) const;
+
+ inline SECT MSTREAM_CLASS GetStart(SID sid) const;
+
+private:
+
+ // The ILockBytes ptr can be a CFileStream or custom ILockBytes from app
+ // The ILockbytes ptr is unmarshaled and stored in a CPerContext
+ // The SAFE_ACCESS macros adjust the CDFBasis before every call
+ // with the correct absolute address ILockBytes pointer values
+ CBasedILockBytesPtrPtr _pplstParent; // based ptr to an absolute ptr
+ CMSFHeader _hdr;
+
+ CBasedMSFPageTablePtr _pmpt;
+
+ CDirectory _dir;
+ CFat _fat;
+ CDIFat _fatDif;
+ CFat _fatMini;
+
+ CStreamCache _stmcDir;
+ CStreamCache _stmcMiniFat;
+
+ CBasedDirectStreamPtr _pdsministream;
+
+#ifndef REF
+ CBasedMStreamPtr _pmsShadow;
+
+ CBasedBytePtr _pCopySectBuf;
+#if DBG == 1
+ LONG _uBufferRef;
+#endif
+#endif //!REF
+
+#ifndef REF
+ BOOL const _fIsScratch;
+#ifdef USE_NOSCRATCH
+ BOOL _fIsNoScratch; //TRUE if the multistream is being used
+ //as a scratch MS in NoScratch mode.
+ CBasedMStreamPtr _pmsScratch;
+#endif
+
+#ifdef USE_NOSNAPSHOT
+ BOOL _fIsNoSnapshot;
+#endif
+
+ BOOL _fBlockWrite;
+ BOOL _fTruncate;
+ BOOL _fBlockHeader;
+ BOOL _fNewConvert;
+
+ BOOL _fIsShadow;
+ BOOL _fMaintainFLBModifyTimestamp;
+
+ ULONG _ulParentSize;
+#endif //!REF
+
+ USHORT _uSectorSize;
+ USHORT _uSectorShift;
+ USHORT _uSectorMask;
+
+ IMalloc * const _pMalloc;
+
+ SCODE MSTREAM_CLASS InitCommon(VOID);
+
+#ifndef REF
+ SCODE MSTREAM_CLASS CopySect(
+ SECT sectOld,
+ SECT sectNew,
+ OFFSET oStart,
+ OFFSET oEnd,
+ BYTE const HUGEP *pb,
+ ULONG *pulRetval);
+#endif //!REF
+
+ SCODE MSTREAM_CLASS ConvertILB(SECT sectMax);
+
+ friend SCODE DllGetScratchMultiStream(
+ CMStream **ppms,
+#ifdef USE_NOSCRATCH
+ BOOL fIsNoScratch,
+#endif
+ ILockBytes **pplstStream,
+ CMStream *pmsMaster);
+};
+
+//+-------------------------------------------------------------------------
+//
+// Method: CMStream::GetSectorSize, public
+//
+// Synopsis: Returns the current sector size
+//
+// History: 05-May-92 PhilipLa Created.
+//
+//--------------------------------------------------------------------------
+
+inline USHORT CMStream::GetSectorSize(VOID) const
+{
+ return _uSectorSize;
+}
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Method: CMStream::GetSectorShift, public
+//
+// Synopsis: Returns the current shift for sector math
+//
+// History: 05-May-92 PhilipLa Created.
+//
+//--------------------------------------------------------------------------
+
+inline USHORT CMStream::GetSectorShift(VOID) const
+{
+ return _uSectorShift;
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Method: CMStream::GetSectorMask, public
+//
+// Synopsis: Returns the current mask for sector math
+//
+// History: 05-May-92 PhilipLa Created.
+//
+//--------------------------------------------------------------------------
+
+inline USHORT CMStream::GetSectorMask(VOID) const
+{
+ return _uSectorMask;
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Method: CMStream::GetHeader, public
+//
+// Synopsis: Returns a pointer to the current header.
+//
+// History: 11-Dec-91 PhilipLa Created.
+//
+//--------------------------------------------------------------------------
+
+inline CMSFHeader * MSTREAM_CLASS CMStream::GetHeader(VOID) const
+{
+ return (CMSFHeader *)&_hdr;
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Method: CMStream::GetFat, public
+//
+// Synopsis: Returns a pointer to the current Fat
+//
+// History: 11-May-92 PhilipLa Created.
+//
+//--------------------------------------------------------------------------
+
+inline CFat * MSTREAM_CLASS CMStream::GetFat(VOID) const
+{
+ return (CFat *)&_fat;
+}
+
+//+-------------------------------------------------------------------------
+//
+// Member: CMStream::GetMiniFat
+//
+// Synopsis: Returns a pointer to the current minifat
+//
+// History: 12-May-92 AlexT Created
+//
+//--------------------------------------------------------------------------
+
+inline CFat * MSTREAM_CLASS CMStream::GetMiniFat(VOID) const
+{
+ return (CFat *)&_fatMini;
+}
+
+//+-------------------------------------------------------------------------
+//
+// Method: CMStream::GetDIFat, public
+//
+// Synopsis: Returns pointer to the current Double Indirect Fat
+//
+// History: 11-May-92 PhilipLa Created.
+//
+//--------------------------------------------------------------------------
+
+inline CDIFat * MSTREAM_CLASS CMStream::GetDIFat(VOID) const
+{
+ return (CDIFat *)&_fatDif;
+}
+
+//+-------------------------------------------------------------------------
+//
+// Member: CMStream::GetDir
+//
+// Synopsis: Returns a pointer to the current directory
+//
+// History: 14-May-92 AlexT Created
+//
+//--------------------------------------------------------------------------
+
+inline CDirectory * MSTREAM_CLASS CMStream::GetDir(VOID) const
+{
+ return (CDirectory *)&_dir;
+}
+
+#ifndef REF
+//+-------------------------------------------------------------------------
+//
+// Member: CMStream::IsScratch
+//
+// Synopsis: Returns TRUE for scratch multistreams, else FALSE
+//
+// History: 14-May-92 AlexT Created
+//
+//--------------------------------------------------------------------------
+
+inline BOOL MSTREAM_CLASS CMStream::IsScratch(VOID) const
+{
+ return(_fIsScratch);
+}
+
+#ifdef USE_NOSCRATCH
+//+---------------------------------------------------------------------------
+//
+// Member: CMStream::HasNoScratch, public
+//
+// Synopsis: Returns TRUE if this multistream is a base MS in no-scratch
+// mode.
+//
+// History: 11-Apr-95 PhilipLa Created
+//
+//----------------------------------------------------------------------------
+
+inline BOOL MSTREAM_CLASS CMStream::HasNoScratch(VOID) const
+{
+ return (_pmsScratch != NULL);
+}
+#endif
+
+//+-------------------------------------------------------------------------
+//
+// Member: CMStream::IsInCOW
+//
+// Synopsis: Returns TRUE if multistream is in copy-on-write mode
+//
+// History: 24-Feb-93 PhilipLa Created.
+//
+//--------------------------------------------------------------------------
+
+inline BOOL MSTREAM_CLASS CMStream::IsInCOW(VOID) const
+{
+ return _fBlockHeader;
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Member: CMStream::IsShadow
+//
+// Synopsis: Returns TRUE for shadow multistreams, else FALSE
+//
+// History: 03-Nov-92 PhilipLa Created.
+//
+//--------------------------------------------------------------------------
+
+inline BOOL MSTREAM_CLASS CMStream::IsShadow(VOID) const
+{
+ return _fIsShadow;
+}
+
+//+-------------------------------------------------------------------------
+//
+// Method: CMStream::IsUnconverted, public
+//
+// Synopsis: Returns TRUE if multistream is in unconverted state.
+//
+// History: 09-Jun-92 PhilipLa Created.
+//
+//--------------------------------------------------------------------------
+
+inline BOOL MSTREAM_CLASS CMStream::IsUnconverted(VOID) const
+{
+ return _fBlockWrite;
+}
+#endif //!REF
+
+//+-------------------------------------------------------------------------
+//
+// Member: CMStream::GetMiniStream
+//
+// Synopsis: Returns pointer to the current ministream
+//
+// History: 15-May-92 AlexT Created
+//
+//--------------------------------------------------------------------------
+
+inline CDirectStream * MSTREAM_CLASS CMStream::GetMiniStream(VOID)
+ const
+{
+ return BP_TO_P(CDirectStream *, _pdsministream);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Member: CMStream::GetILB
+//
+// Synopsis: Returns a pointer to the current parent ILockBytes
+//
+// History: 15-May-92 AlexT Created
+//
+//--------------------------------------------------------------------------
+
+inline ILockBytes * MSTREAM_CLASS CMStream::GetILB(VOID) const
+{
+ return(*_pplstParent);
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Member: CMStream::GetPageTable
+//
+// Synopsis: Returns a pointer to the current page table
+//
+// History: 26-Oct-92 PhilipLa Created
+//
+//--------------------------------------------------------------------------
+
+inline CMSFPageTable * MSTREAM_CLASS CMStream::GetPageTable(VOID) const
+{
+ return BP_TO_P(CMSFPageTable *, _pmpt);
+}
+
+#ifndef REF
+//+-------------------------------------------------------------------------
+//
+// Member: CMStream::GetParentSize
+//
+// Synopsis: Returns the cached parent size for this multistream.
+// If this is non-zero, it indicates a commit is in
+// progress.
+//
+// History: 01-Feb-93 PhilipLa Created
+//
+//--------------------------------------------------------------------------
+
+inline ULONG MSTREAM_CLASS CMStream::GetParentSize(VOID) const
+{
+ return _ulParentSize;
+}
+#endif //!REF
+
+
+//+---------------------------------------------------------------------------
+//
+// Member: CMStream::GetDirCache, public
+//
+// Synopsis: Returns a pointer to the directory cache
+//
+// History: 01-Jun-94 PhilipLa Created
+//----------------------------------------------------------------------------
+
+inline CStreamCache * CMStream::GetDirCache(void) const
+{
+ return (CStreamCache *)&_stmcDir;
+}
+
+//+---------------------------------------------------------------------------
+//
+// Member: CMStream::GetMiniFatCache, public
+//
+// Synopsis: Returns a pointer to the minifat cache
+//
+// History: 01-Jun-94 PhilipLa Created
+//----------------------------------------------------------------------------
+
+inline CStreamCache * CMStream::GetMiniFatCache(void) const
+{
+ return (CStreamCache *)&_stmcMiniFat;
+}
+
+
+#ifndef STGM_SIMPLE
+//STGM_SIMPLE should be in objbase.h - if it isn't, define it here so
+// we build.
+#define STGM_SIMPLE 0x08000000L
+#endif
+
+#ifndef STGM_NOSCRATCH
+//STGM_NOSCRATCH should be in objbase.h - if it isn't, define it here so
+// we build.
+#define STGM_NOSCRATCH 0x00100000L
+#endif
+
+#ifndef STGM_NOSNAPSHOT
+//STGM_NOSNAPSHOT should be in objbase.h - if it isn't, define it here so
+// we build.
+#define STGM_NOSNAPSHOT 0x00200000L
+#endif
+
+extern SCODE DfCreateSimpDocfile(WCHAR const *pwcsName,
+ DWORD grfMode,
+ DWORD reserved,
+ IStorage **ppstgOpen);
+
+extern SCODE DllMultiStreamFromStream(
+ IMalloc *pMalloc,
+ CMStream **ppms,
+ ILockBytes **pplstStream,
+ DWORD dwStartFlags,
+ DFLAGS df);
+
+extern SCODE DllMultiStreamFromCorruptedStream(
+ CMStream **ppms,
+ ILockBytes **pplstStream,
+ DWORD dwFlags);
+
+extern void DllReleaseMultiStream(CMStream *pms);
+
+#ifndef REF
+extern SCODE DllGetScratchMultiStream(
+ CMStream **ppms,
+ BOOL fIsNoScratch,
+ ILockBytes **pplstStream,
+ CMStream *pmsMaster);
+#endif //!REF
+
+extern SCODE DllIsMultiStream(ILockBytes *plstStream);
+
+extern SCODE DllGetCommitSig(ILockBytes *plst, DFSIGNATURE *psig);
+
+extern SCODE DllSetCommitSig(ILockBytes *plst, DFSIGNATURE sig);
+
+#if DBG == 1
+extern VOID SetInfoLevel(ULONG x);
+#endif
+
+#ifdef SECURE_BUFFER
+extern BYTE s_bufSecure[MINISTREAMSIZE];
+#endif
+
+#endif //__MSF_HXX__
+