1 //  file_mapping.hpp  --------------------------------------------------------------//
2 
3 //  Copyright 2010 Vicente J. Botet Escriba
4 //  Copyright 2015 Andrey Semashev
5 //  Copyright 2016 Jorge Lodos
6 
7 //  Distributed under the Boost Software License, Version 1.0.
8 //  See http://www.boost.org/LICENSE_1_0.txt
9 
10 
11 #ifndef BOOST_DETAIL_WINAPI_FILE_MAPPING_HPP
12 #define BOOST_DETAIL_WINAPI_FILE_MAPPING_HPP
13 
14 #include <boost/detail/winapi/basic_types.hpp>
15 
16 #ifdef BOOST_HAS_PRAGMA_ONCE
17 #pragma once
18 #endif
19 
20 #if !defined( BOOST_USE_WINDOWS_H )
21 extern "C" {
22 #if !defined( BOOST_NO_ANSI_APIS )
23 BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
24 CreateFileMappingA(
25     boost::detail::winapi::HANDLE_ hFile,
26     ::_SECURITY_ATTRIBUTES* lpFileMappingAttributes,
27     boost::detail::winapi::DWORD_ flProtect,
28     boost::detail::winapi::DWORD_ dwMaximumSizeHigh,
29     boost::detail::winapi::DWORD_ dwMaximumSizeLow,
30     boost::detail::winapi::LPCSTR_ lpName);
31 
32 BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
33 OpenFileMappingA(
34     boost::detail::winapi::DWORD_ dwDesiredAccess,
35     boost::detail::winapi::BOOL_ bInheritHandle,
36     boost::detail::winapi::LPCSTR_ lpName);
37 #endif
38 
39 BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
40 CreateFileMappingW(
41     boost::detail::winapi::HANDLE_ hFile,
42     ::_SECURITY_ATTRIBUTES* lpFileMappingAttributes,
43     boost::detail::winapi::DWORD_ flProtect,
44     boost::detail::winapi::DWORD_ dwMaximumSizeHigh,
45     boost::detail::winapi::DWORD_ dwMaximumSizeLow,
46     boost::detail::winapi::LPCWSTR_ lpName);
47 
48 BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
49 OpenFileMappingW(
50     boost::detail::winapi::DWORD_ dwDesiredAccess,
51     boost::detail::winapi::BOOL_ bInheritHandle,
52     boost::detail::winapi::LPCWSTR_ lpName);
53 
54 BOOST_SYMBOL_IMPORT boost::detail::winapi::LPVOID_ WINAPI
55 MapViewOfFile(
56     boost::detail::winapi::HANDLE_ hFileMappingObject,
57     boost::detail::winapi::DWORD_ dwDesiredAccess,
58     boost::detail::winapi::DWORD_ dwFileOffsetHigh,
59     boost::detail::winapi::DWORD_ dwFileOffsetLow,
60     boost::detail::winapi::SIZE_T_ dwNumberOfBytesToMap);
61 
62 BOOST_SYMBOL_IMPORT boost::detail::winapi::LPVOID_ WINAPI
63 MapViewOfFileEx(
64     boost::detail::winapi::HANDLE_ hFileMappingObject,
65     boost::detail::winapi::DWORD_ dwDesiredAccess,
66     boost::detail::winapi::DWORD_ dwFileOffsetHigh,
67     boost::detail::winapi::DWORD_ dwFileOffsetLow,
68     boost::detail::winapi::SIZE_T_ dwNumberOfBytesToMap,
69     boost::detail::winapi::LPVOID_ lpBaseAddress);
70 
71 BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
72 FlushViewOfFile(
73     boost::detail::winapi::LPCVOID_ lpBaseAddress,
74     boost::detail::winapi::SIZE_T_ dwNumberOfBytesToFlush);
75 
76 BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
77 UnmapViewOfFile(boost::detail::winapi::LPCVOID_ lpBaseAddress);
78 }
79 #endif
80 
81 namespace boost {
82 namespace detail {
83 namespace winapi {
84 
85 #if defined( BOOST_USE_WINDOWS_H )
86 
87 const DWORD_ SEC_FILE_ = SEC_FILE;
88 const DWORD_ SEC_IMAGE_ = SEC_IMAGE;
89 const DWORD_ SEC_RESERVE_ = SEC_RESERVE;
90 const DWORD_ SEC_COMMIT_ = SEC_COMMIT;
91 const DWORD_ SEC_NOCACHE_ = SEC_NOCACHE;
92 
93 // These permission flags are undocumented and some of them are equivalent to the FILE_MAP_* flags.
94 // SECTION_QUERY enables NtQuerySection.
95 // http://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FNT%20Objects%2FSection%2FNtQuerySection.html
96 const DWORD_ SECTION_QUERY_ = SECTION_QUERY;
97 const DWORD_ SECTION_MAP_WRITE_ = SECTION_MAP_WRITE;
98 const DWORD_ SECTION_MAP_READ_ = SECTION_MAP_READ;
99 const DWORD_ SECTION_MAP_EXECUTE_ = SECTION_MAP_EXECUTE;
100 const DWORD_ SECTION_EXTEND_SIZE_ = SECTION_EXTEND_SIZE;
101 const DWORD_ SECTION_ALL_ACCESS_ = SECTION_ALL_ACCESS;
102 
103 const DWORD_ FILE_MAP_COPY_ = FILE_MAP_COPY;
104 const DWORD_ FILE_MAP_WRITE_ = FILE_MAP_WRITE;
105 const DWORD_ FILE_MAP_READ_ = FILE_MAP_READ;
106 const DWORD_ FILE_MAP_ALL_ACCESS_ = FILE_MAP_ALL_ACCESS;
107 
108 #else // defined( BOOST_USE_WINDOWS_H )
109 
110 const DWORD_ SEC_FILE_ = 0x800000;
111 const DWORD_ SEC_IMAGE_ = 0x1000000;
112 const DWORD_ SEC_RESERVE_ = 0x4000000;
113 const DWORD_ SEC_COMMIT_ = 0x8000000;
114 const DWORD_ SEC_NOCACHE_ = 0x10000000;
115 
116 // These permission flags are undocumented and some of them are equivalent to the FILE_MAP_* flags.
117 // SECTION_QUERY enables NtQuerySection.
118 // http://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FNT%20Objects%2FSection%2FNtQuerySection.html
119 const DWORD_ SECTION_QUERY_ = 0x00000001;
120 const DWORD_ SECTION_MAP_WRITE_ = 0x00000002;
121 const DWORD_ SECTION_MAP_READ_ = 0x00000004;
122 const DWORD_ SECTION_MAP_EXECUTE_ = 0x00000008;
123 const DWORD_ SECTION_EXTEND_SIZE_ = 0x00000010;
124 const DWORD_ SECTION_ALL_ACCESS_ = 0x000F001F; // STANDARD_RIGHTS_REQUIRED | SECTION_*
125 
126 const DWORD_ FILE_MAP_COPY_ = SECTION_QUERY_;
127 const DWORD_ FILE_MAP_WRITE_ = SECTION_MAP_WRITE_;
128 const DWORD_ FILE_MAP_READ_ = SECTION_MAP_READ_;
129 const DWORD_ FILE_MAP_ALL_ACCESS_ = SECTION_ALL_ACCESS_;
130 
131 #endif // defined( BOOST_USE_WINDOWS_H )
132 
133 // These constants are not defined in Windows SDK up until the one shipped with MSVC 8 and MinGW (as of 2016-02-14)
134 const DWORD_ SECTION_MAP_EXECUTE_EXPLICIT_ = 0x00000020; // not included in SECTION_ALL_ACCESS
135 const DWORD_ FILE_MAP_EXECUTE_ = SECTION_MAP_EXECUTE_EXPLICIT_; // not included in FILE_MAP_ALL_ACCESS
136 
137 // These constants are not defined in Windows SDK up until 6.0A and MinGW (as of 2016-02-14)
138 const DWORD_ SEC_PROTECTED_IMAGE_ = 0x2000000;
139 const DWORD_ SEC_WRITECOMBINE_ = 0x40000000;
140 const DWORD_ SEC_LARGE_PAGES_ = 0x80000000;
141 const DWORD_ SEC_IMAGE_NO_EXECUTE_ = (SEC_IMAGE_ | SEC_NOCACHE_);
142 
143 #if !defined( BOOST_NO_ANSI_APIS )
144 using ::OpenFileMappingA;
145 #endif
146 using ::OpenFileMappingW;
147 using ::MapViewOfFile;
148 using ::MapViewOfFileEx;
149 using ::FlushViewOfFile;
150 using ::UnmapViewOfFile;
151 
152 #if !defined( BOOST_NO_ANSI_APIS )
CreateFileMappingA(HANDLE_ hFile,SECURITY_ATTRIBUTES_ * lpFileMappingAttributes,DWORD_ flProtect,DWORD_ dwMaximumSizeHigh,DWORD_ dwMaximumSizeLow,LPCSTR_ lpName)153 BOOST_FORCEINLINE HANDLE_ CreateFileMappingA(
154     HANDLE_ hFile,
155     SECURITY_ATTRIBUTES_* lpFileMappingAttributes,
156     DWORD_ flProtect,
157     DWORD_ dwMaximumSizeHigh,
158     DWORD_ dwMaximumSizeLow,
159     LPCSTR_ lpName)
160 {
161     return ::CreateFileMappingA(
162         hFile,
163         reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpFileMappingAttributes),
164         flProtect,
165         dwMaximumSizeHigh,
166         dwMaximumSizeLow,
167         lpName);
168 }
169 #endif
170 
CreateFileMappingW(HANDLE_ hFile,SECURITY_ATTRIBUTES_ * lpFileMappingAttributes,DWORD_ flProtect,DWORD_ dwMaximumSizeHigh,DWORD_ dwMaximumSizeLow,LPCWSTR_ lpName)171 BOOST_FORCEINLINE HANDLE_ CreateFileMappingW(
172     HANDLE_ hFile,
173     SECURITY_ATTRIBUTES_* lpFileMappingAttributes,
174     DWORD_ flProtect,
175     DWORD_ dwMaximumSizeHigh,
176     DWORD_ dwMaximumSizeLow,
177     LPCWSTR_ lpName)
178 {
179     return ::CreateFileMappingW(
180         hFile,
181         reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpFileMappingAttributes),
182         flProtect,
183         dwMaximumSizeHigh,
184         dwMaximumSizeLow,
185         lpName);
186 }
187 
188 #if !defined( BOOST_NO_ANSI_APIS )
create_file_mapping(HANDLE_ hFile,SECURITY_ATTRIBUTES_ * lpFileMappingAttributes,DWORD_ flProtect,DWORD_ dwMaximumSizeHigh,DWORD_ dwMaximumSizeLow,LPCSTR_ lpName)189 BOOST_FORCEINLINE HANDLE_ create_file_mapping(
190     HANDLE_ hFile,
191     SECURITY_ATTRIBUTES_* lpFileMappingAttributes,
192     DWORD_ flProtect,
193     DWORD_ dwMaximumSizeHigh,
194     DWORD_ dwMaximumSizeLow,
195     LPCSTR_ lpName)
196 {
197     return ::CreateFileMappingA(
198         hFile,
199         reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpFileMappingAttributes),
200         flProtect,
201         dwMaximumSizeHigh,
202         dwMaximumSizeLow,
203         lpName);
204 }
205 
open_file_mapping(DWORD_ dwDesiredAccess,BOOL_ bInheritHandle,LPCSTR_ lpName)206 BOOST_FORCEINLINE HANDLE_ open_file_mapping(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName)
207 {
208     return ::OpenFileMappingA(dwDesiredAccess, bInheritHandle, lpName);
209 }
210 #endif
211 
create_file_mapping(HANDLE_ hFile,SECURITY_ATTRIBUTES_ * lpFileMappingAttributes,DWORD_ flProtect,DWORD_ dwMaximumSizeHigh,DWORD_ dwMaximumSizeLow,LPCWSTR_ lpName)212 BOOST_FORCEINLINE HANDLE_ create_file_mapping(
213     HANDLE_ hFile,
214     SECURITY_ATTRIBUTES_* lpFileMappingAttributes,
215     DWORD_ flProtect,
216     DWORD_ dwMaximumSizeHigh,
217     DWORD_ dwMaximumSizeLow,
218     LPCWSTR_ lpName)
219 {
220     return ::CreateFileMappingW(
221         hFile,
222         reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpFileMappingAttributes),
223         flProtect,
224         dwMaximumSizeHigh,
225         dwMaximumSizeLow,
226         lpName);
227 }
228 
open_file_mapping(DWORD_ dwDesiredAccess,BOOL_ bInheritHandle,LPCWSTR_ lpName)229 BOOST_FORCEINLINE HANDLE_ open_file_mapping(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName)
230 {
231     return ::OpenFileMappingW(dwDesiredAccess, bInheritHandle, lpName);
232 }
233 
234 }
235 }
236 }
237 
238 #endif // BOOST_DETAIL_WINAPI_FILE_MAPPING_HPP
239