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.4 KiB
219 lines
5.4 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;
|
|
};
|