Home | History | Annotate | Download | only in Windows
      1 // Windows/FileMapping.h
      2 
      3 #ifndef __WINDOWS_FILEMAPPING_H
      4 #define __WINDOWS_FILEMAPPING_H
      5 
      6 #include "../Common/MyTypes.h"
      7 
      8 #include "Handle.h"
      9 
     10 namespace NWindows {
     11 
     12 class CFileMapping: public CHandle
     13 {
     14 public:
     15   WRes Create(DWORD protect, UInt64 maxSize, LPCTSTR name)
     16   {
     17     _handle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, protect, (DWORD)(maxSize >> 32), (DWORD)maxSize, name);
     18     return ::GetLastError();
     19   }
     20 
     21   WRes Open(DWORD
     22       #ifndef UNDER_CE
     23       desiredAccess
     24       #endif
     25       , LPCTSTR name)
     26   {
     27     #ifdef UNDER_CE
     28     WRes res = Create(PAGE_READONLY, 0, name);
     29     if (res == ERROR_ALREADY_EXISTS)
     30       return 0;
     31     Close();
     32     if (res == 0)
     33       res = ERROR_FILE_NOT_FOUND;
     34     return res;
     35     #else
     36     _handle = ::OpenFileMapping(desiredAccess, FALSE, name);
     37     if (_handle != 0)
     38       return 0;
     39     return ::GetLastError();
     40     #endif
     41   }
     42 
     43   LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap)
     44   {
     45     return ::MapViewOfFile(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap);
     46   }
     47 
     48   #ifndef UNDER_CE
     49   LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap, LPVOID baseAddress)
     50   {
     51     return ::MapViewOfFileEx(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap, baseAddress);
     52   }
     53   #endif
     54 };
     55 
     56 class CFileUnmapper
     57 {
     58   const void *_data;
     59 public:
     60   CFileUnmapper(const void *data) : _data(data) {}
     61   ~CFileUnmapper() { ::UnmapViewOfFile(_data); }
     62 };
     63 
     64 }
     65 
     66 #endif
     67