///////////////////////////////////////////////
// vmfile.h - CVirtMemFile Class
///////////////////////////////////////////////
#include <Windows.h>
class CVirtMemFile
{
protected:
long m_status;
HANDLE m_hFile;
HANDLE m_hMap;
DWORD m_fileSize;
LPVOID m_ptr;
public:
enum file_modes { READ_ONLY_MODE=0, READ_WRITE_MODE=1 };
enum status_types { FILE_NOT_OPEN=0, FILE_OPEN=1 };
CVirtMemFile( void )
{
m_ptr=m_hMap=m_hFile=NULL;
m_status=FILE_NOT_OPEN;
m_fileSize=0;
}
virtual ~CVirtMemFile( void )
{
if (m_status==FILE_OPEN)
Close();
}
virtual long Open( const char filename[],
long mode=READ_ONLY_MODE )
{
if (m_status==FILE_OPEN) // Close file if open
Close();
DWORD shareMode=FILE_SHARE_READ;
DWORD accessMode;
DWORD protectionMode;
DWORD mapAccess;
if (mode==READ_WRITE_MODE)
{
accessMode=GENERIC_READ | GENERIC_WRITE;
protectionMode=PAGE_READWRITE;
mapAccess=FILE_MAP_WRITE;
}
else // READ_ONLY_MODE
{
accessMode=GENERIC_READ;
protectionMode=PAGE_READONLY;
mapAccess=FILE_MAP_READ;
}
m_fileSize=0;
m_status=FILE_NOT_OPEN;
m_hFile=::CreateFile(filename, accessMode,
shareMode, NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
if (m_hFile==NULL)
return 0;
m_hMap=::CreateFileMapping(m_hFile, NULL,
protectionMode, 0,0,NULL);
if (m_hMap==NULL)
{
Close();
return 0;
}
m_ptr=::MapViewOfFile( m_hMap, mapAccess, 0,0,0);
if (m_ptr==NULL)
{
Close();
return 0;
}
m_fileSize=::GetFileSize(m_hFile,NULL);
m_status=FILE_OPEN;
return 1;
}
virtual void Close( void )
{
if (m_ptr)
::UnmapViewOfFile(m_ptr);
if (m_hMap)
::CloseHandle(m_hMap);
if (m_hFile)
::CloseHandle(m_hFile);
m_ptr=NULL;
m_hMap=NULL;
m_hFile=NULL;
m_status=FILE_NOT_OPEN;
}
virtual long GetStatus( void )
{
return m_status;
}
virtual DWORD GetFileSize( void )
{
return m_fileSize;
}
virtual const LPVOID GetBasePtr( void )
{
return m_ptr;
}
};
End of Listing