Listing 1: The CVirtMemFile class

///////////////////////////////////////////////
// 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 —