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:
Create(DWORD protect,UInt64 maxSize,LPCTSTR name)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 
Open(DWORD desiredAccess,LPCTSTR name)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 
Map(DWORD desiredAccess,UInt64 fileOffset,SIZE_T numberOfBytesToMap)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
Map(DWORD desiredAccess,UInt64 fileOffset,SIZE_T numberOfBytesToMap,LPVOID baseAddress)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:
CFileUnmapper(const void * data)60   CFileUnmapper(const void *data) : _data(data) {}
~CFileUnmapper()61   ~CFileUnmapper() { ::UnmapViewOfFile(_data); }
62 };
63 
64 }
65 
66 #endif
67