aboutsummaryrefslogtreecommitdiff
path: root/CPP/Windows/FileMapping.h
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/Windows/FileMapping.h')
-rw-r--r--CPP/Windows/FileMapping.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/CPP/Windows/FileMapping.h b/CPP/Windows/FileMapping.h
new file mode 100644
index 0000000..f90c429
--- /dev/null
+++ b/CPP/Windows/FileMapping.h
@@ -0,0 +1,66 @@
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
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
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
56class CFileUnmapper
57{
58 const void *_data;
59public:
60 CFileUnmapper(const void *data) : _data(data) {}
61 ~CFileUnmapper() { ::UnmapViewOfFile(_data); }
62};
63
64}
65
66#endif