125 lines
3.9 KiB
C++
125 lines
3.9 KiB
C++
/* -------------------------------------------------------------------------
|
|
mapfile.h
|
|
(was bbmpfile.h)
|
|
Definitions for the mapped file class.
|
|
|
|
Copyright (C) 1995 Microsoft Corporation.
|
|
All Rights Reserved.
|
|
|
|
Author
|
|
Lindsay Harris - lindsayh
|
|
|
|
History
|
|
14:49 on Mon 10 Apr 1995 -by- Lindsay Harris [lindsayh]
|
|
First version, based on pvMapFile() and derivatives.
|
|
|
|
------------------------------------------------------------------------- */
|
|
|
|
/*
|
|
* Generic class to handle mapped files. Part of the reason for
|
|
* turning this into a class is to allow tracking of mapping/unmapping
|
|
* and thus to handle clean up of dangling mappings in exception
|
|
* handling code. Tracking is enabled if the fTrack parameter is
|
|
* specified.
|
|
*/
|
|
|
|
#ifndef _MAPFILE_H_
|
|
#define _MAPFILE_H_
|
|
|
|
// Bits used in the m_fFlags field below.
|
|
#define MF_TRACKING 0x0001 // Tracking use of this item.
|
|
#define MF_RELINQUISH 0x0002 // Someone else to free this item.
|
|
|
|
class CCreateFile
|
|
{
|
|
public:
|
|
virtual HANDLE CreateFileHandle( LPCSTR szFileName ) = 0;
|
|
};
|
|
|
|
class CMapFile
|
|
{
|
|
public:
|
|
CMapFile( const char *pchFileName, HANDLE & hFile, BOOL fWriteEnable, DWORD cbIncrease = 0, CCreateFile *pCreateFile = NULL);
|
|
CMapFile( const WCHAR *pwchFileName, BOOL fWriteEnable, BOOL fTrack );
|
|
CMapFile( const char *pchFileName, BOOL fWriteEnable, BOOL fTrack, DWORD cbSizeIncrease = 0 );
|
|
CMapFile( HANDLE hFile, BOOL fWriteEnable, BOOL fTrack, DWORD dwSizeIncrease = 0, BOOL fZero = FALSE );
|
|
|
|
~CMapFile( void );
|
|
|
|
// Get the details of this item.
|
|
void *pvAddress( DWORD *pcb ) { if( pcb ) *pcb = m_cb; return m_pv; };
|
|
|
|
// Relinquish control (meaning someone else unmaps file).
|
|
void Relinquish( void ) { m_fFlags |= MF_RELINQUISH; };
|
|
|
|
// Tells if mapping is OK.
|
|
BOOL fGood(void) {return NULL != m_pv; };
|
|
|
|
private:
|
|
DWORD m_cb; // Size of this file.
|
|
void *m_pv; // Address to use.
|
|
DWORD m_fFlags; // See above for the bits used in here.
|
|
WCHAR m_rgwchFileName[ MAX_PATH ]; // For error recording.
|
|
|
|
void MapFromHandle( HANDLE hFile, BOOL fWriteEnable, DWORD cbIncrease, BOOL fZero = FALSE );
|
|
};
|
|
|
|
|
|
/*
|
|
* For compatability with old code, the original functions remain.
|
|
*/
|
|
|
|
void *pvMapFile( DWORD *pdwSize, const char *pchFileName, BOOL bWriteEnable );
|
|
void *pvMapFile( DWORD *pdwSize, const WCHAR *pwchFileName, BOOL bWriteEnable );
|
|
|
|
void *pvMapFile(const char *pchFileName, BOOL bWriteEnable,
|
|
DWORD *pdwSizeFinal = NULL, DWORD dwSizeIncrease = 0);
|
|
|
|
void * pvFromHandle( HANDLE hFile, BOOL bWriteEnable,
|
|
DWORD * pdwSizeFinal = NULL, DWORD dwSizeIncrease = 0);
|
|
|
|
#ifdef DEBUG
|
|
//
|
|
// CMapFileEx: version with guard pages to be used only in DEBUG builds
|
|
// to catch other threads writing into our memory !
|
|
//
|
|
|
|
class CMapFileEx
|
|
{
|
|
public:
|
|
CMapFileEx( HANDLE hFile, BOOL fWriteEnable, BOOL fTrack, DWORD dwSizeIncrease = 0 );
|
|
~CMapFileEx( void );
|
|
void Cleanup( void ); // cleanup in case of failure !
|
|
|
|
// Get the details of this item.
|
|
void *pvAddress( DWORD *pcb ) { if( pcb ) *pcb = m_cb; return (void*)m_pv; };
|
|
|
|
// Relinquish control (meaning someone else unmaps file).
|
|
void Relinquish( void ) { m_fFlags |= MF_RELINQUISH; };
|
|
|
|
// Tells if mapping is OK.
|
|
BOOL fGood(void) {return NULL != m_pv; };
|
|
|
|
// Protect and Unprotect mapping
|
|
BOOL ProtectMapping();
|
|
BOOL UnprotectMapping();
|
|
|
|
private:
|
|
DWORD m_cb; // Size of this file.
|
|
LPBYTE m_pv; // Address to use.
|
|
DWORD m_fFlags; // See above for the bits used in here.
|
|
WCHAR m_rgwchFileName[ MAX_PATH ]; // For error recording.
|
|
|
|
HANDLE m_hFile; // handle to the mapped file
|
|
LPBYTE m_pvFrontGuard; // front guard page
|
|
DWORD m_cbFrontGuardSize; // front guard page size
|
|
LPBYTE m_pvRearGuard; // rear guard page
|
|
DWORD m_cbRearGuardSize; // rear guard page size
|
|
CRITICAL_SECTION m_csProtectMap; // crit sect to protect/unprotect mapping
|
|
|
|
void MapFromHandle( HANDLE hFile, BOOL fWriteEnable, DWORD cbIncrease );
|
|
};
|
|
|
|
#endif // DEBUG
|
|
#endif // _MAPFILE_H_
|