1 /*
2  * Copyright 2013, 2017 Andrey Semashev
3  * Copyright 2017 James E. King, III
4  *
5  * Distributed under the Boost Software License, Version 1.0.
6  * See http://www.boost.org/LICENSE_1_0.txt
7  */
8 
9 #ifndef BOOST_WINAPI_CONFIG_HPP_INCLUDED_
10 #define BOOST_WINAPI_CONFIG_HPP_INCLUDED_
11 
12 #include <boost/predef/version_number.h>
13 #include <boost/predef/platform.h>
14 #if defined(__CYGWIN__)
15 // Cygwin 64 compiler does not define _WIN64 and instead defines it in a private header. We can't define _WIN64 ourselves because
16 // the header defines the macro unconditionally and if the user includes both Boost.WinAPI and Cygwin WinAPI headers there will be conflict.
17 #include <_cygwin.h>
18 #endif
19 
20 // BOOST_WINAPI_IS_MINGW indicates that the target Windows SDK is provided by MinGW (http://mingw.org/).
21 // BOOST_WINAPI_IS_MINGW_W64 indicates that the target Windows SDK is provided by MinGW-w64 (http://mingw-w64.org).
22 // BOOST_WINAPI_IS_CYGWIN indicates that the target Windows SDK is provided by MinGW variant from Cygwin (https://cygwin.com/).
23 #if defined(__CYGWIN__)
24 #define BOOST_WINAPI_IS_CYGWIN
25 #elif BOOST_PLAT_MINGW
26 #if defined(__MINGW64_VERSION_MAJOR)
27 #define BOOST_WINAPI_IS_MINGW_W64
28 #else
29 #define BOOST_WINAPI_IS_MINGW
30 #endif
31 #endif
32 
33 // These constants reflect _WIN32_WINNT_* macros from sdkddkver.h
34 // See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745%28v=vs.85%29.aspx#setting_winver_or__win32_winnt
35 #define BOOST_WINAPI_VERSION_NT4 0x0400
36 #define BOOST_WINAPI_VERSION_WIN2K 0x0500
37 #define BOOST_WINAPI_VERSION_WINXP 0x0501
38 #define BOOST_WINAPI_VERSION_WS03 0x0502
39 #define BOOST_WINAPI_VERSION_WIN6 0x0600
40 #define BOOST_WINAPI_VERSION_VISTA 0x0600
41 #define BOOST_WINAPI_VERSION_WS08 0x0600
42 #define BOOST_WINAPI_VERSION_LONGHORN 0x0600
43 #define BOOST_WINAPI_VERSION_WIN7 0x0601
44 #define BOOST_WINAPI_VERSION_WIN8 0x0602
45 #define BOOST_WINAPI_VERSION_WINBLUE 0x0603
46 #define BOOST_WINAPI_VERSION_WINTHRESHOLD 0x0A00
47 #define BOOST_WINAPI_VERSION_WIN10 0x0A00
48 
49 // These constants reflect NTDDI_* macros from sdkddkver.h
50 #define BOOST_WINAPI_NTDDI_WIN2K 0x05000000
51 #define BOOST_WINAPI_NTDDI_WIN2KSP1 0x05000100
52 #define BOOST_WINAPI_NTDDI_WIN2KSP2 0x05000200
53 #define BOOST_WINAPI_NTDDI_WIN2KSP3 0x05000300
54 #define BOOST_WINAPI_NTDDI_WIN2KSP4 0x05000400
55 
56 #define BOOST_WINAPI_NTDDI_WINXP 0x05010000
57 #define BOOST_WINAPI_NTDDI_WINXPSP1 0x05010100
58 #define BOOST_WINAPI_NTDDI_WINXPSP2 0x05010200
59 #define BOOST_WINAPI_NTDDI_WINXPSP3 0x05010300
60 #define BOOST_WINAPI_NTDDI_WINXPSP4 0x05010400
61 
62 #define BOOST_WINAPI_NTDDI_WS03 0x05020000
63 #define BOOST_WINAPI_NTDDI_WS03SP1 0x05020100
64 #define BOOST_WINAPI_NTDDI_WS03SP2 0x05020200
65 #define BOOST_WINAPI_NTDDI_WS03SP3 0x05020300
66 #define BOOST_WINAPI_NTDDI_WS03SP4 0x05020400
67 
68 #define BOOST_WINAPI_NTDDI_WIN6 0x06000000
69 #define BOOST_WINAPI_NTDDI_WIN6SP1 0x06000100
70 #define BOOST_WINAPI_NTDDI_WIN6SP2 0x06000200
71 #define BOOST_WINAPI_NTDDI_WIN6SP3 0x06000300
72 #define BOOST_WINAPI_NTDDI_WIN6SP4 0x06000400
73 
74 #define BOOST_WINAPI_NTDDI_VISTA BOOST_WINAPI_NTDDI_WIN6
75 #define BOOST_WINAPI_NTDDI_VISTASP1 BOOST_WINAPI_NTDDI_WIN6SP1
76 #define BOOST_WINAPI_NTDDI_VISTASP2 BOOST_WINAPI_NTDDI_WIN6SP2
77 #define BOOST_WINAPI_NTDDI_VISTASP3 BOOST_WINAPI_NTDDI_WIN6SP3
78 #define BOOST_WINAPI_NTDDI_VISTASP4 BOOST_WINAPI_NTDDI_WIN6SP4
79 
80 #define BOOST_WINAPI_NTDDI_LONGHORN  BOOST_WINAPI_NTDDI_VISTA
81 
82 #define BOOST_WINAPI_NTDDI_WS08 BOOST_WINAPI_NTDDI_WIN6SP1
83 #define BOOST_WINAPI_NTDDI_WS08SP2 BOOST_WINAPI_NTDDI_WIN6SP2
84 #define BOOST_WINAPI_NTDDI_WS08SP3 BOOST_WINAPI_NTDDI_WIN6SP3
85 #define BOOST_WINAPI_NTDDI_WS08SP4 BOOST_WINAPI_NTDDI_WIN6SP4
86 
87 #define BOOST_WINAPI_NTDDI_WIN7 0x06010000
88 #define BOOST_WINAPI_NTDDI_WIN7SP1 0x06010100 // Not defined in Windows SDK
89 #define BOOST_WINAPI_NTDDI_WIN8 0x06020000
90 #define BOOST_WINAPI_NTDDI_WINBLUE 0x06030000
91 #define BOOST_WINAPI_NTDDI_WINTHRESHOLD 0x0A000000
92 #define BOOST_WINAPI_NTDDI_WIN10 0x0A000000
93 #define BOOST_WINAPI_NTDDI_WIN10_TH2 0x0A000001
94 #define BOOST_WINAPI_NTDDI_WIN10_RS1 0x0A000002
95 #define BOOST_WINAPI_NTDDI_WIN10_RS2 0x0A000003
96 #define BOOST_WINAPI_NTDDI_WIN10_RS3 0x0A000004
97 
98 #define BOOST_WINAPI_DETAIL_MAKE_NTDDI_VERSION2(x) x##0000
99 #define BOOST_WINAPI_DETAIL_MAKE_NTDDI_VERSION(x) BOOST_WINAPI_DETAIL_MAKE_NTDDI_VERSION2(x)
100 
101 #if !defined(BOOST_USE_WINAPI_VERSION)
102 #if defined(_WIN32_WINNT)
103 #define BOOST_USE_WINAPI_VERSION _WIN32_WINNT
104 #elif defined(WINVER)
105 #define BOOST_USE_WINAPI_VERSION WINVER
106 #else
107 // By default use Windows 7 API on compilers that support it and Vista or XP on the others
108 #if (defined(_MSC_VER) && _MSC_VER < 1500) || defined(BOOST_WINAPI_IS_MINGW)
109 #define BOOST_USE_WINAPI_VERSION BOOST_WINAPI_VERSION_WINXP
110 #elif (defined(_MSC_VER) && _MSC_VER < 1600)
111 #define BOOST_USE_WINAPI_VERSION BOOST_WINAPI_VERSION_WIN6
112 #else
113 #define BOOST_USE_WINAPI_VERSION BOOST_WINAPI_VERSION_WIN7
114 #endif
115 #endif
116 #endif
117 
118 #if !defined(BOOST_USE_NTDDI_VERSION)
119 #if defined(NTDDI_VERSION)
120 #define BOOST_USE_NTDDI_VERSION NTDDI_VERSION
121 // Default to respective Windows version with the latest Service Pack
122 #elif BOOST_USE_WINAPI_VERSION == BOOST_WINAPI_VERSION_WIN2K
123 #define BOOST_USE_NTDDI_VERSION BOOST_WINAPI_NTDDI_WIN2KSP4
124 #elif BOOST_USE_WINAPI_VERSION == BOOST_WINAPI_VERSION_WINXP
125 #define BOOST_USE_NTDDI_VERSION BOOST_WINAPI_NTDDI_WINXPSP3
126 #elif BOOST_USE_WINAPI_VERSION == BOOST_WINAPI_VERSION_WS03
127 #define BOOST_USE_NTDDI_VERSION BOOST_WINAPI_NTDDI_WS03SP2
128 #elif BOOST_USE_WINAPI_VERSION == BOOST_WINAPI_VERSION_WIN6
129 #define BOOST_USE_NTDDI_VERSION BOOST_WINAPI_NTDDI_WIN6SP2
130 #elif BOOST_USE_WINAPI_VERSION == BOOST_WINAPI_VERSION_WIN7
131 #define BOOST_USE_NTDDI_VERSION BOOST_WINAPI_NTDDI_WIN7SP1
132 #elif BOOST_USE_WINAPI_VERSION == BOOST_WINAPI_VERSION_WIN10
133 #define BOOST_USE_NTDDI_VERSION BOOST_WINAPI_NTDDI_WIN10_RS3
134 #else
135 #define BOOST_USE_NTDDI_VERSION BOOST_WINAPI_DETAIL_MAKE_NTDDI_VERSION(BOOST_USE_WINAPI_VERSION)
136 #endif
137 #endif
138 
139 // Known Windows SDK versions, taken from VER_PRODUCTBUILD macro value defined in ntverp.h.
140 // These values can be used to compare with BOOST_PLAT_WINDOWS_SDK_VERSION from Boost.Predef.
141 #define BOOST_WINAPI_WINDOWS_SDK_MSVC71 BOOST_VERSION_NUMBER(0, 0, 3668) // Windows SDK bundled with MSVC 7.1
142 #define BOOST_WINAPI_WINDOWS_SDK_MSVC8 BOOST_VERSION_NUMBER(0, 0, 3790) // Windows SDK bundled with MSVC 8
143 #define BOOST_WINAPI_WINDOWS_SDK_6_0 BOOST_VERSION_NUMBER(0, 0, 6000) // Windows SDK 6.0
144 #define BOOST_WINAPI_WINDOWS_SDK_7_0 BOOST_VERSION_NUMBER(0, 0, 7600) // Windows SDK 7.0, 7.1
145 #define BOOST_WINAPI_WINDOWS_SDK_8_0 BOOST_VERSION_NUMBER(0, 0, 9200) // Windows SDK 8.0
146 #define BOOST_WINAPI_WINDOWS_SDK_8_1 BOOST_VERSION_NUMBER(0, 0, 9600) // Windows SDK 8.1
147 #define BOOST_WINAPI_WINDOWS_SDK_10_0 BOOST_VERSION_NUMBER(0, 0, 10011) // Windows SDK 10.0
148 // MinGW does not have the ntverp.h header but it defines VER_PRODUCTBUILD in ddk/ntifs.h.
149 // Cygwin MinGW also defines this version.
150 #define BOOST_WINAPI_WINDOWS_SDK_MINGW BOOST_VERSION_NUMBER(0, 0, 10000)
151 // MinGW-w64 defines the same version as the Windows SDK bundled with MSVC 8
152 #define BOOST_WINAPI_WINDOWS_SDK_MINGW_W64 BOOST_VERSION_NUMBER(0, 0, 3790)
153 
154 #if !defined(BOOST_USE_WINAPI_FAMILY)
155 #if defined(WINAPI_FAMILY)
156 #define BOOST_USE_WINAPI_FAMILY WINAPI_FAMILY
157 #elif defined(WINAPI_FAMILY_DESKTOP_APP)
158 // If none is specified, default to a desktop application which is the most
159 // backwards compatible to previous ways of doing things, if families are even
160 // defined.
161 #define BOOST_USE_WINAPI_FAMILY WINAPI_FAMILY_DESKTOP_APP
162 #endif
163 #endif
164 
165 //
166 // UWP Support
167 //
168 // On platforms without windows family partition support it is assumed one
169 // has all APIs and access is controlled by _WIN32_WINNT or similar mechanisms.
170 //
171 // Leveraging Boost.Predef here
172 //
173 #if BOOST_PLAT_WINDOWS_UWP
174 #define BOOST_WINAPI_PARTITION_APP           (BOOST_PLAT_WINDOWS_DESKTOP || BOOST_PLAT_WINDOWS_STORE || BOOST_WINAPI_PARTITION_PHONE)
175 #define BOOST_WINAPI_PARTITION_PC            (BOOST_PLAT_WINDOWS_STORE)
176 #define BOOST_WINAPI_PARTITION_PHONE         (BOOST_PLAT_WINDOWS_PHONE)
177 #define BOOST_WINAPI_PARTITION_SYSTEM        (BOOST_PLAT_WINDOWS_SYSTEM)
178 #define BOOST_WINAPI_PARTITION_SERVER        (BOOST_PLAT_WINDOWS_SERVER)
179 #define BOOST_WINAPI_PARTITION_DESKTOP       (BOOST_PLAT_WINDOWS_DESKTOP)
180 #else // BOOST_PLAT_WINDOWS_UWP
181 #define BOOST_WINAPI_PARTITION_APP           (1)
182 #define BOOST_WINAPI_PARTITION_PC            (1)
183 #define BOOST_WINAPI_PARTITION_PHONE         (1)
184 #define BOOST_WINAPI_PARTITION_SYSTEM        (1)
185 #define BOOST_WINAPI_PARTITION_SERVER        (1)
186 #define BOOST_WINAPI_PARTITION_DESKTOP       (1)
187 #endif // BOOST_PLAT_WINDOWS_UWP
188 
189 //
190 // Windows 8.x SDK defines some items in the DESKTOP partition and then Windows SDK 10.0 defines
191 // the same items to be in APP or SYSTEM partitions, and APP expands to DESKTOP or PC or PHONE.
192 // The definition of BOOST_WINAPI_PARTITION_APP_SYSTEM provides a universal way to get this
193 // right as it is seen in a number of places in the SDK.
194 //
195 #define BOOST_WINAPI_PARTITION_APP_SYSTEM \
196     ( \
197         ((BOOST_PLAT_WINDOWS_SDK_VERSION >= BOOST_WINAPI_WINDOWS_SDK_10_0) && (BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM)) || \
198         ((BOOST_PLAT_WINDOWS_SDK_VERSION < BOOST_WINAPI_WINDOWS_SDK_10_0) && BOOST_WINAPI_PARTITION_DESKTOP) \
199     )
200 
201 // Simiarly, some other symbols were re-classified as DESKTOP or SYSTEM
202 #define BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM \
203     ( \
204         ((BOOST_PLAT_WINDOWS_SDK_VERSION >= BOOST_WINAPI_WINDOWS_SDK_10_0) && (BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM)) || \
205         ((BOOST_PLAT_WINDOWS_SDK_VERSION < BOOST_WINAPI_WINDOWS_SDK_10_0) && BOOST_WINAPI_PARTITION_DESKTOP) \
206     )
207 
208 #if defined(BOOST_USE_WINDOWS_H) || defined(BOOST_WINAPI_DEFINE_VERSION_MACROS)
209 // We have to define the version macros so that windows.h provides the necessary symbols
210 #if !defined(_WIN32_WINNT)
211 #define _WIN32_WINNT BOOST_USE_WINAPI_VERSION
212 #endif
213 #if !defined(WINVER)
214 #define WINVER BOOST_USE_WINAPI_VERSION
215 #endif
216 #if !defined(NTDDI_VERSION)
217 #define NTDDI_VERSION BOOST_USE_NTDDI_VERSION
218 #endif
219 #if !defined(WINAPI_FAMILY) && defined(BOOST_USE_WINAPI_FAMILY)
220 #define WINAPI_FAMILY BOOST_USE_WINAPI_FAMILY
221 #endif
222 #endif
223 
224 #include <boost/config.hpp>
225 
226 #ifdef BOOST_HAS_PRAGMA_ONCE
227 #pragma once
228 #endif
229 
230 #endif // BOOST_WINAPI_CONFIG_HPP_INCLUDED_
231