Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

219 lines
5.2 KiB

//+---------------------------------------------------------------------------
//
// 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;
};