|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 2000.
//
// File: pmmstrm.hxx
//
// Contents: Memory Mapped Stream protocol
//
// Classes: PMmStream
//
// History: 08-Jul-93 BartoszM Created
//
//----------------------------------------------------------------------------
#pragma once
//+-------------------------------------------------------------------------
//
// Function: CommonPageRound, public
//
// Synopsis: Round number up to multiple of common page size
//
// Arguments: [cb] - number
//
// History: 10-Mar-93 BartoszM Created
//
//--------------------------------------------------------------------------
inline ULONG CommonPageRound ( ULONG cb ) { return ( cb + (COMMON_PAGE_SIZE-1) ) & ~(COMMON_PAGE_SIZE-1); }
inline ULONG CommonPageTrunc ( ULONG cb ) { return( cb & ~(COMMON_PAGE_SIZE-1)); }
//+-------------------------------------------------------------------------
//
// Function: CommonPageRound, public
//
// Synopsis: Round number up to multiple of common page size
//
// Arguments: [cbLow] - low part of the number
// [cbHigh] - high part
//
// History: 19-Mar-93 BartoszM Created
//
//--------------------------------------------------------------------------
inline void CommonPageRound ( ULONG& cbLow, ULONG& cbHigh ) { if (cbLow > ((0xffffffff & ~(COMMON_PAGE_SIZE-1)) + 1)) { cbLow = 0; cbHigh++; } else { cbLow = (cbLow + (COMMON_PAGE_SIZE-1) ) & ~(COMMON_PAGE_SIZE-1); } }
inline LONGLONG llfromuls( IN const ULONG &ulLowPart, IN const ULONG &ulHighPart ) { LARGE_INTEGER li = {ulLowPart, ulHighPart}; return li.QuadPart;
}
class CMmStreamBuf; class PStorage; class CMemBuf;
//+---------------------------------------------------------------------------
//
// Class: PMmStream
//
// Purpose: Memory Mapped Stream protocol
//
// History: 08-Jul-93 BartoszM Created
//
//----------------------------------------------------------------------------
class PMmStream { public: virtual ~PMmStream() {}
virtual BOOL Ok() = 0;
virtual void Close() = 0;
virtual void SetSize ( PStorage& storage, ULONG newSizeLow, ULONG newSizeHigh=0 ) = 0;
virtual BOOL isEmpty() = 0;
virtual LONGLONG Size() = 0;
virtual ULONG SizeLow()=0;
virtual ULONG SizeHigh()=0;
virtual BOOL isWritable()=0;
virtual void MapAll ( CMmStreamBuf& sbuf ) = 0;
virtual void Map ( CMmStreamBuf& sbuf, ULONG cb = 0, ULONG offLow = 0, ULONG offHigh = 0, BOOL fMapForWrite = FALSE ) = 0;
virtual void Unmap ( CMmStreamBuf& sbuf ) = 0;
virtual void Flush ( CMmStreamBuf& sbuf, ULONG cb, BOOL fThrowOnFailure = TRUE ) = 0;
virtual void FlushMetaData ( BOOL fThrowOnFailure = TRUE ) = 0;
virtual ULONG ShrinkFromFront( ULONG firstPage, ULONG numPages ) { return 0; }
virtual BOOL FStatusFileNotFound() { return FALSE; }
virtual WCHAR const * GetPath() { return 0; }
virtual NTSTATUS GetStatus() const { Win4Assert( !"not implemented" ); return S_OK; }
virtual void Read( void * pvBuffer, ULONGLONG oStart, DWORD cbToRead, DWORD & cbRead ) { Win4Assert( !"not implemented" ); }
virtual void Write( void * pvBuffer, ULONGLONG oStart, DWORD cbToWrite ) { Win4Assert( !"not implemented" ); } };
//+---------------------------------------------------------------------------
//
// Class: CMmStreamBuf
//
// Purpose: Memory Mapped Stream Buffer
//
// History: 10-Mar-93 BartoszM Created
//
//----------------------------------------------------------------------------
class CMmStreamBuf { public:
CMmStreamBuf() : _buf(0), _cb(0), _pStream(0) {}
~CMmStreamBuf() { if ( 0 != _buf && 0 != _pStream ) _pStream->Unmap( *this ); }
void * Get() { return (void *)_buf; }
ULONG Size() const { return _cb; }
void SetSize( ULONG cb) { _cb = cb; }
void SetBuf( void* buf ) { _buf = (BYTE *) buf; }
void SetStream ( PMmStream* pStream ) { _pStream = pStream; }
void PurgeFromWorkingSet( ULONG oPurge, ULONG cbPurged ) { Win4Assert( 0 != _buf );
// -1 for both means purge the entire stream
if ( -1 == oPurge && -1 == cbPurged ) { oPurge = 0; cbPurged = _cb; }
//
// nb: an undocumented fact is that calling VirtualUnlock on
// unlocked pages will push the pages out of the working set
//
VirtualUnlock( _buf + oPurge, cbPurged ); }
PMmStream & GetStream() { return * _pStream; }
void Flush( BOOL fThrowOnFailure ) { _pStream->Flush( *this, _cb, fThrowOnFailure ); }
#ifdef CIEXTMODE
void CiExtDump(void *ciExtSelf); #endif
private:
BYTE * _buf; ULONG _cb; PMmStream * _pStream; };
|