Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / Windows / FileMapping.h
1 // Windows/FileMapping.h\r
2 \r
3 #ifndef __WINDOWS_FILEMAPPING_H\r
4 #define __WINDOWS_FILEMAPPING_H\r
5 \r
6 #include "Common/Types.h"\r
7 \r
8 #include "Handle.h"\r
9 \r
10 namespace NWindows {\r
11 \r
12 class CFileMapping: public CHandle\r
13 {\r
14 public:\r
15   WRes Create(DWORD protect, UInt64 maxSize, LPCTSTR name)\r
16   {\r
17     _handle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, protect, (DWORD)(maxSize >> 32), (DWORD)maxSize, name);\r
18     return ::GetLastError();\r
19   }\r
20 \r
21   WRes Open(DWORD desiredAccess, LPCTSTR name)\r
22   {\r
23     #ifdef UNDER_CE\r
24     WRes res = Create(PAGE_READONLY, 0, name);\r
25     if (res == ERROR_ALREADY_EXISTS)\r
26       return 0;\r
27     Close();\r
28     if (res == 0)\r
29       res = ERROR_FILE_NOT_FOUND;\r
30     return res;\r
31     #else\r
32     _handle = ::OpenFileMapping(desiredAccess, FALSE, name);\r
33     if (_handle != 0)\r
34       return 0;\r
35     return ::GetLastError();\r
36     #endif\r
37   }\r
38 \r
39   LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap)\r
40   {\r
41     return ::MapViewOfFile(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap);\r
42   }\r
43 \r
44   #ifndef UNDER_CE\r
45   LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap, LPVOID baseAddress)\r
46   {\r
47     return ::MapViewOfFileEx(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap, baseAddress);\r
48   }\r
49   #endif\r
50 };\r
51 \r
52 class CFileUnmapper\r
53 {\r
54   const void *_data;\r
55 public:\r
56   CFileUnmapper(const void *data) : _data(data) {}\r
57   ~CFileUnmapper() { ::UnmapViewOfFile(_data); }\r
58 };\r
59 \r
60 }\r
61 \r
62 #endif\r