diff options
Diffstat (limited to 'CPP/Windows/FileMapping.h')
-rw-r--r-- | CPP/Windows/FileMapping.h | 66 |
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 | |||
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 | ||