]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 ) | |
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 | ||
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 ) | |
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 | ||
206 | BOOST_FORCEINLINE HANDLE_ open_file_mapping(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName) | |
207 | { | |
208 | return ::OpenFileMappingA(dwDesiredAccess, bInheritHandle, lpName); | |
209 | } | |
210 | #endif | |
211 | ||
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 | ||
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 |