windows-nt/Source/XPSP1/NT/inetsrv/iis/staxinc/export/mapfile.h
2020-09-26 16:20:57 +08:00

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_