| 1 |
/* |
| 2 |
* sdkddkver.h |
| 3 |
* |
| 4 |
* Macros to set up the compilation environment, such that it provides |
| 5 |
* support for a user specified host OS version, (default Win2K). |
| 6 |
* |
| 7 |
* $Id: sdkddkver.h,v f02731a7c98a 2016/06/02 21:15:06 keithmarshall $ |
| 8 |
* |
| 9 |
* Written by Earnie Boyd <earnie@users.sourceforge.net> |
| 10 |
* Copyright (C) 2012, 2013, 2015, MinGW.org Project |
| 11 |
* |
| 12 |
* |
| 13 |
* Permission is hereby granted, free of charge, to any person obtaining a |
| 14 |
* copy of this software and associated documentation files (the "Software"), |
| 15 |
* to deal in the Software without restriction, including without limitation |
| 16 |
* the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| 17 |
* and/or sell copies of the Software, and to permit persons to whom the |
| 18 |
* Software is furnished to do so, subject to the following conditions: |
| 19 |
* |
| 20 |
* The above copyright notice and this permission notice (including the next |
| 21 |
* paragraph) shall be included in all copies or substantial portions of the |
| 22 |
* Software. |
| 23 |
* |
| 24 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 25 |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 26 |
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| 27 |
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 28 |
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| 29 |
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| 30 |
* DEALINGS IN THE SOFTWARE. |
| 31 |
* |
| 32 |
*/ |
| 33 |
#ifndef _SDKDDKVER_H |
| 34 |
#define _SDKDDKVER_H |
| 35 |
#pragma GCC system_header |
| 36 |
|
| 37 |
/* Define masks for extracting version components from NTDDI_VERSION; |
| 38 |
* values and names are guessed based on comments in the documentation; see |
| 39 |
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx |
| 40 |
*/ |
| 41 |
#define OSVERSION_MASK 0xFFFF0000 |
| 42 |
#define SPVERSION_MASK 0x0000FF00 |
| 43 |
#define SUBVERSION_MASK 0x000000FF |
| 44 |
|
| 45 |
/* Macros to facilitate such extraction; derived from comments on MSDN or |
| 46 |
* on social.microsoft.com |
| 47 |
*/ |
| 48 |
#define OSVER(ver) ((ver) & OSVERSION_MASK) |
| 49 |
#define SPVER(ver) (((ver) & SPVERSION_MASK) >> 8) |
| 50 |
#define SUBVER(ver) ((ver) & SUBVERSION_MASK) |
| 51 |
#define WINNTVER(ver) ((ver) >> 16) |
| 52 |
|
| 53 |
/* Macros to construct a minimal NTDDI_VERSION from a _WIN32_WINNT value. |
| 54 |
*/ |
| 55 |
#define NTDDI_VERSION_FROM_WIN32_WINNT(ver) _NTDDI_VERSION_FROM_WIN32_WINNT(ver) |
| 56 |
#define _NTDDI_VERSION_FROM_WIN32_WINNT(ver) ver##0000 |
| 57 |
|
| 58 |
/* Version constants specifying _WIN32_WINNT versions; these are defined at |
| 59 |
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx |
| 60 |
* (values for legacy platforms have been inferred from historical knowledge). |
| 61 |
*/ |
| 62 |
#define _WIN32_WINNT_NT4 0x0400 /* Windows NT4 */ |
| 63 |
#define _WIN32_WINNT_NT4E 0x0401 /* Windows NT4E */ |
| 64 |
#define _WIN32_WINDOWS_95 0x0400 /* Windows 95 */ |
| 65 |
#define _WIN32_WINDOWS_98 0x0410 /* Windows 98 */ |
| 66 |
#define _WIN32_WINDOWS_ME 0x0490 /* Windows Millenium Edition */ |
| 67 |
#define _WIN32_WINNT_WIN2K 0x0500 /* Windows 2000 */ |
| 68 |
#define _WIN32_WINNT_WINXP 0x0501 /* Windows XP */ |
| 69 |
#define _WIN32_WINNT_WS03 0x0502 /* Windows Server 2003 */ |
| 70 |
#define _WIN32_WINNT_WIN6 0x0600 /* Alias for Windows Vista */ |
| 71 |
#define _WIN32_WINNT_VISTA 0x0600 /* Windows Vista */ |
| 72 |
#define _WIN32_WINNT_WS08 0x0600 /* Windows Server 2008 */ |
| 73 |
#define _WIN32_WINNT_LONGHORN 0x0600 /* Alias for Windows Vista */ |
| 74 |
#define _WIN32_WINNT_WIN7 0x0601 /* Windows 7 */ |
| 75 |
#define _WIN32_WINNT_WIN8 0x0602 /* Windows 8 */ |
| 76 |
#define _WIN32_WINNT_WINBLUE 0x0603 /* Windows 8.1 */ |
| 77 |
|
| 78 |
/* Version constants specifying Internet Explorer versions; also defined at |
| 79 |
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx |
| 80 |
*/ |
| 81 |
#define _WIN32_IE_IE50 0x0500 |
| 82 |
#define _WIN32_IE_IE501 0x0501 |
| 83 |
#define _WIN32_IE_IE55 0x0550 |
| 84 |
#define _WIN32_IE_IE56 0x0560 |
| 85 |
#define _WIN32_IE_IE60 0x0600 |
| 86 |
#define _WIN32_IE_IE60SP1 0x0601 |
| 87 |
#define _WIN32_IE_IE60SP2 0x0603 |
| 88 |
#define _WIN32_IE_IE70 0x0700 |
| 89 |
#define _WIN32_IE_IE80 0x0800 |
| 90 |
|
| 91 |
#define _WIN32_IE_IE30 0x0300 |
| 92 |
#define _WIN32_IE_IE301 0x0301 |
| 93 |
#define _WIN32_IE_IE302 0x0302 |
| 94 |
#define _WIN32_IE_IE40 0x0400 |
| 95 |
#define _WIN32_IE_IE401 0x0401 |
| 96 |
|
| 97 |
/* Version constants specifying NTDDI_VERSION; these are also defined at |
| 98 |
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx |
| 99 |
*/ |
| 100 |
#define __NTDDI_WIN5 0x05000000 |
| 101 |
#define __NTDDI_WIN51 0x05010000 |
| 102 |
#define __NTDDI_WIN52 0x05020000 |
| 103 |
#define __NTDDI_WIN6 0x06000000 |
| 104 |
#define __NTDDI_WIN61 0x06010000 |
| 105 |
#define __NTDDI_WIN62 0x06020000 |
| 106 |
#define __NTDDI_WIN63 0x06030000 |
| 107 |
#define __NTDDI_SP0 0x00000000 |
| 108 |
#define __NTDDI_SP1 0x00000100 |
| 109 |
#define __NTDDI_SP2 0x00000200 |
| 110 |
#define __NTDDI_SP3 0x00000300 |
| 111 |
#define __NTDDI_SP4 0x00000400 |
| 112 |
|
| 113 |
#define NTDDI_WIN2K __NTDDI_WIN5 + __NTDDI_SP0 |
| 114 |
#define NTDDI_WIN2KSP1 __NTDDI_WIN5 + __NTDDI_SP1 |
| 115 |
#define NTDDI_WIN2KSP2 __NTDDI_WIN5 + __NTDDI_SP2 |
| 116 |
#define NTDDI_WIN2KSP3 __NTDDI_WIN5 + __NTDDI_SP3 |
| 117 |
#define NTDDI_WIN2KSP4 __NTDDI_WIN5 + __NTDDI_SP4 |
| 118 |
|
| 119 |
#define NTDDI_WINXP __NTDDI_WIN51 + __NTDDI_SP0 |
| 120 |
#define NTDDI_WINXPSP1 __NTDDI_WIN51 + __NTDDI_SP1 |
| 121 |
#define NTDDI_WINXPSP2 __NTDDI_WIN51 + __NTDDI_SP2 |
| 122 |
#define NTDDI_WINXPSP3 __NTDDI_WIN51 + __NTDDI_SP3 |
| 123 |
|
| 124 |
#define NTDDI_WS03 __NTDDI_WIN52 + __NTDDI_SP0 |
| 125 |
#define NTDDI_WS03SP1 __NTDDI_WIN52 + __NTDDI_SP1 |
| 126 |
#define NTDDI_WS03SP2 __NTDDI_WIN52 + __NTDDI_SP2 |
| 127 |
|
| 128 |
#define NTDDI_VISTA __NTDDI_WIN6 + __NTDDI_SP0 |
| 129 |
#define NTDDI_VISTASP1 __NTDDI_WIN6 + __NTDDI_SP1 |
| 130 |
#define NTDDI_VISTASP2 __NTDDI_WIN6 + __NTDDI_SP2 |
| 131 |
|
| 132 |
#define NTDDI_LONGHORN NTDDI_VISTA |
| 133 |
|
| 134 |
#define NTDDI_WIN6 NTDDI_VISTA |
| 135 |
#define NTDDI_WIN6SP1 NTDDI_VISTASP1 |
| 136 |
#define NTDDI_WIN6SP2 NTDDI_VISTASP2 |
| 137 |
|
| 138 |
#define NTDDI_WS08 __NTDDI_WIN6 + __NTDDI_SP1 |
| 139 |
|
| 140 |
#define NTDDI_WIN7 __NTDDI_WIN61 + __NTDDI_SP0 |
| 141 |
|
| 142 |
#define NTDDI_WIN8 __NTDDI_WIN62 + __NTDDI_SP0 |
| 143 |
|
| 144 |
#define NTDDI_WINBLUE __NTDDI_WIN63 + __NTDDI_SP0 |
| 145 |
|
| 146 |
/* Although NTDDI_VERSION is now the preferred designator for the |
| 147 |
* level of support required from the operating system, legacy code |
| 148 |
* is likely to have specified WINVER, from which _WIN32_WINNT may |
| 149 |
* be inferred. |
| 150 |
*/ |
| 151 |
#if defined WINVER && ! defined _WIN32_WINNT |
| 152 |
# define _WIN32_WINNT WINVER |
| 153 |
|
| 154 |
/* Additionally, legacy code intended for deployment on the Win9x |
| 155 |
* series operating systems may have specified _WIN32_WINDOWS, as |
| 156 |
* an alternative to, or in addition to, _WIN32_WINNT. |
| 157 |
*/ |
| 158 |
#elif defined _WIN32_WINDOWS && ! defined _WIN32_WINNT |
| 159 |
# define _WIN32_WINNT _WIN32_WINDOWS |
| 160 |
#endif |
| 161 |
|
| 162 |
/* Stipulate defaults; check consistency of any user specified overrides. |
| 163 |
*/ |
| 164 |
#ifdef NTDDI_VERSION |
| 165 |
# ifdef _WIN32_WINNT |
| 166 |
# if _WIN32_WINNT != WINNTVER(NTDDI_VERSION) |
| 167 |
# error "_WIN32_WINNT setting conflicts with specified NTDDI_VERSION" |
| 168 |
# endif |
| 169 |
# else |
| 170 |
# define _WIN32_WINNT WINNTVER(NTDDI_VERSION) |
| 171 |
# ifndef WINVER |
| 172 |
# define WINVER _WIN32_WINNT |
| 173 |
# endif |
| 174 |
# endif |
| 175 |
#endif |
| 176 |
|
| 177 |
#ifndef _WIN32_WINNT |
| 178 |
# ifdef WINVER |
| 179 |
# define _WIN32_WINNT WINVER |
| 180 |
# else |
| 181 |
# ifdef _WARN_DEFAULTS |
| 182 |
# warning "Assuming default setting of _WIN32_WINNT_WIN2K for _WIN32_WINNT" |
| 183 |
# endif |
| 184 |
# define _WIN32_WINNT _WIN32_WINNT_WIN2K |
| 185 |
# endif |
| 186 |
#endif |
| 187 |
|
| 188 |
#ifndef WINVER |
| 189 |
# define WINVER _WIN32_WINNT |
| 190 |
#elif WINVER != _WIN32_WINNT |
| 191 |
/* TODO(REVIEW): is this appropriate for WINVER consistency checking? |
| 192 |
*/ |
| 193 |
# error "_WIN32_WINNT setting conflicts with specified WINVER" |
| 194 |
#endif |
| 195 |
|
| 196 |
#ifndef NTDDI_VERSION |
| 197 |
# ifdef _WARN_DEFAULTS |
| 198 |
# warning "Assuming default NTDDI_VERSION setting to match _WIN32_WINNT" |
| 199 |
# endif |
| 200 |
# define NTDDI_VERSION NTDDI_VERSION_FROM_WIN32_WINNT(_WIN32_WINNT) |
| 201 |
#endif |
| 202 |
|
| 203 |
/* Map GCC architecture identification macros to their MSVC equivalents. |
| 204 |
* This mapping was previously specified in <winnt.h>, and duplicated in |
| 205 |
* <windows.h>; it is now only defined here, because both <windows.h> and |
| 206 |
* <winnt.h> must include this file anyway, and the potentially error prone |
| 207 |
* burden of maintaining duplicates is as unnecessary as it is undesirable. |
| 208 |
*/ |
| 209 |
#ifndef _M_IX86 |
| 210 |
/* Note that we must process the _M_IX86 equivalent macros in diminishing |
| 211 |
* order of processor version, since GCC defines __i386__ as identification |
| 212 |
* for the X86 processor family, in addition to any one of the other three |
| 213 |
* macros, which may be used to identify a particular processor version. |
| 214 |
*/ |
| 215 |
# if defined(__i686__) |
| 216 |
# define _M_IX86 600 |
| 217 |
|
| 218 |
# elif defined(__i586__) |
| 219 |
# define _M_IX86 500 |
| 220 |
|
| 221 |
# elif defined(__i486__) |
| 222 |
# define _M_IX86 400 |
| 223 |
|
| 224 |
# elif defined(__i386__) |
| 225 |
# define _M_IX86 300 |
| 226 |
# endif |
| 227 |
#endif |
| 228 |
|
| 229 |
/* The preceding logic may have established the host type as X86, or it |
| 230 |
* may have done nothing at all; we must check further. |
| 231 |
*/ |
| 232 |
#ifdef _M_IX86 |
| 233 |
/* We've established that we ARE compiling for an X86 host; any MinGW32 |
| 234 |
* compiler SHOULD have set this for us already... |
| 235 |
*/ |
| 236 |
# ifndef _X86_ |
| 237 |
/* ...but cross-check it anyway, in case the user may have some unusual |
| 238 |
* compiler configuration in place. |
| 239 |
*/ |
| 240 |
# define _X86_ 1 |
| 241 |
# endif |
| 242 |
|
| 243 |
# ifndef _M_IX86_FP |
| 244 |
/* MSVC defines this, to provide additional information about particular |
| 245 |
* capabilties of the X86 host environment; specifically... |
| 246 |
*/ |
| 247 |
# ifdef __SSE2__ |
| 248 |
/* ...this indicates that the SSE2 instruction set (or better) may be |
| 249 |
* assumed to be supported... |
| 250 |
*/ |
| 251 |
# define _M_IX86_FP 2 |
| 252 |
|
| 253 |
# elif defined(__SSE__) |
| 254 |
/* ...whereas, this promises only basic SSE instruction set support... |
| 255 |
*/ |
| 256 |
# define _M_IX86_FP 1 |
| 257 |
|
| 258 |
# else |
| 259 |
/* ...and this disallows its use, entirely. |
| 260 |
*/ |
| 261 |
# define _M_IX86_FP 0 |
| 262 |
# endif |
| 263 |
# endif |
| 264 |
|
| 265 |
/* When not compiling for an X86 host; check mapping from other possible |
| 266 |
* GCC architecture identifiers, to their MSVC equivalents. |
| 267 |
*/ |
| 268 |
#elif defined(__x86_64__) || defined(__amd64__) |
| 269 |
/* This represents an Intel X86-64, or (compatible) AMD-64 processor; |
| 270 |
* MSVC defines... |
| 271 |
*/ |
| 272 |
# ifndef _M_X64 |
| 273 |
/* ...this to represent the former, together with... |
| 274 |
*/ |
| 275 |
# define _M_X64 1 |
| 276 |
# endif |
| 277 |
# ifndef _M_AMD64 |
| 278 |
/* ...this alias, to represent the latter. |
| 279 |
*/ |
| 280 |
# define _M_AMD64 1 |
| 281 |
# endif |
| 282 |
|
| 283 |
#elif defined(__ia64__) |
| 284 |
/* This represents an Intel Itanium processor, which MSVC designates |
| 285 |
* by defining this feature test macro. |
| 286 |
*/ |
| 287 |
# ifndef _M_IA64 |
| 288 |
# define _M_IA64 1 |
| 289 |
# endif |
| 290 |
#endif /* !_M_IX86 */ |
| 291 |
|
| 292 |
#endif /* _SDKDDKVER_H: $RCSfile: sdkddkver.h,v $: end of file */ |