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/Types.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 desiredAccess, LPCTSTR name)
     22   {
     23     #ifdef UNDER_CE
     24     WRes res = Create(PAGE_READONLY, 0, name);
     25     if (res == ERROR_ALREADY_EXISTS)
     26       return 0;
     27     Close();
     28     if (res == 0)
     29       res = ERROR_FILE_NOT_FOUND;
     30     return res;
     31     #else
     32     _handle = ::OpenFileMapping(desiredAccess, FALSE, name);
     33     if (_handle != 0)
     34       return 0;
     35     return ::GetLastError();
     36     #endif
     37   }
     38 
     39   LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap)
     40   {
     41     return ::MapViewOfFile(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap);
     42   }
     43 
     44   #ifndef UNDER_CE
     45   LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap, LPVOID baseAddress)
     46   {
     47     return ::MapViewOfFileEx(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap, baseAddress);
     48   }
     49   #endif
     50 };
     51 
     52 class CFileUnmapper
     53 {
     54   const void *_data;
     55 public:
     56   CFileUnmapper(const void *data) : _data(data) {}
     57   ~CFileUnmapper() { ::UnmapViewOfFile(_data); }
     58 };
     59 
     60 }
     61 
     62 #endif
     63