/* ------------------------------------------------------------------------- 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_