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
10namespace NWindows {
11
12class CFileMapping: public CHandle
13{
14public:
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
52class CFileUnmapper
53{
54  const void *_data;
55public:
56  CFileUnmapper(const void *data) : _data(data) {}
57  ~CFileUnmapper() { ::UnmapViewOfFile(_data); }
58};
59
60}
61
62#endif
63