xref: /netbsd-src/external/gpl3/gcc/dist/libphobos/libdruntime/core/sys/windows/winver.d (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW Windows headers
5  *
6  * Authors: Stewart Gordon
7  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
8  * Source: $(DRUNTIMESRC core/sys/windows/_winver.d)
9  */
10 module core.sys.windows.winver;
11 version (Windows):
12 @system:
13 import core.sys.windows.w32api;
14 import core.sys.windows.winbase;
15 import core.sys.windows.sdkddkver;
16 
version(ANSI)17 version (ANSI) {} else version = Unicode;
18 pragma(lib, "version");
19 
20 import core.sys.windows.windef;
21 
22 // FIXME: type weirdness
23 enum {
24     VS_FILE_INFO    =  16,
25     VS_VERSION_INFO =   1,
26     VS_USER_DEFINED = 100
27 }
28 
29 enum {
30     VS_FFI_SIGNATURE     = 0xFEEF04BD,
31     VS_FFI_STRUCVERSION  =    0x10000,
32     VS_FFI_FILEFLAGSMASK =       0x3F
33 }
34 
35 enum {
36     VS_FF_DEBUG        =  1,
37     VS_FF_PRERELEASE   =  2,
38     VS_FF_PATCHED      =  4,
39     VS_FF_PRIVATEBUILD =  8,
40     VS_FF_INFOINFERRED = 16,
41     VS_FF_SPECIALBUILD = 32
42 }
43 
44 enum {
45     VOS_UNKNOWN       =       0,
46     VOS_DOS           = 0x10000,
47     VOS_OS216         = 0x20000,
48     VOS_OS232         = 0x30000,
49     VOS_NT            = 0x40000,
50     VOS__BASE         =       0,
51     VOS__WINDOWS16    =       1,
52     VOS__PM16         =       2,
53     VOS__PM32         =       3,
54     VOS__WINDOWS32    =       4,
55     VOS_DOS_WINDOWS16 = 0x10001,
56     VOS_DOS_WINDOWS32 = 0x10004,
57     VOS_OS216_PM16    = 0x20002,
58     VOS_OS232_PM32    = 0x30003,
59     VOS_NT_WINDOWS32  = 0x40004
60 }
61 
62 enum {
63     VFT_UNKNOWN    = 0,
64     VFT_APP        = 1,
65     VFT_DLL        = 2,
66     VFT_DRV        = 3,
67     VFT_FONT       = 4,
68     VFT_VXD        = 5,
69     VFT_STATIC_LIB = 7
70 }
71 
72 enum {
73     VFT2_UNKNOWN         =  0,
74     VFT2_DRV_PRINTER     =  1,
75     VFT2_DRV_KEYBOARD    =  2,
76     VFT2_DRV_LANGUAGE    =  3,
77     VFT2_DRV_DISPLAY     =  4,
78     VFT2_DRV_MOUSE       =  5,
79     VFT2_DRV_NETWORK     =  6,
80     VFT2_DRV_SYSTEM      =  7,
81     VFT2_DRV_INSTALLABLE =  8,
82     VFT2_DRV_SOUND       =  9,
83     VFT2_DRV_COMM        = 10,
84     VFT2_DRV_INPUTMETHOD = 11,
85     VFT2_FONT_RASTER     =  1,
86     VFT2_FONT_VECTOR     =  2,
87     VFT2_FONT_TRUETYPE   =  3
88 }
89 
90 enum : DWORD {
91     VFFF_ISSHAREDFILE = 1
92 }
93 
94 enum : DWORD {
95     VFF_CURNEDEST    = 1,
96     VFF_FILEINUSE    = 2,
97     VFF_BUFFTOOSMALL = 4
98 }
99 
100 enum : DWORD {
101     VIFF_FORCEINSTALL  = 1,
102     VIFF_DONTDELETEOLD
103 }
104 
105 enum {
106     VIF_TEMPFILE         = 0x00001,
107     VIF_MISMATCH         = 0x00002,
108     VIF_SRCOLD           = 0x00004,
109     VIF_DIFFLANG         = 0x00008,
110     VIF_DIFFCODEPG       = 0x00010,
111     VIF_DIFFTYPE         = 0x00020,
112     VIF_WRITEPROT        = 0x00040,
113     VIF_FILEINUSE        = 0x00080,
114     VIF_OUTOFSPACE       = 0x00100,
115     VIF_ACCESSVIOLATION  = 0x00200,
116     VIF_SHARINGVIOLATION = 0x00400,
117     VIF_CANNOTCREATE     = 0x00800,
118     VIF_CANNOTDELETE     = 0x01000,
119     VIF_CANNOTRENAME     = 0x02000,
120     VIF_CANNOTDELETECUR  = 0x04000,
121     VIF_OUTOFMEMORY      = 0x08000,
122     VIF_CANNOTREADSRC    = 0x10000,
123     VIF_CANNOTREADDST    = 0x20000,
124     VIF_BUFFTOOSMALL     = 0x40000
125 }
126 
127 struct VS_FIXEDFILEINFO {
128     DWORD dwSignature;
129     DWORD dwStrucVersion;
130     DWORD dwFileVersionMS;
131     DWORD dwFileVersionLS;
132     DWORD dwProductVersionMS;
133     DWORD dwProductVersionLS;
134     DWORD dwFileFlagsMask;
135     DWORD dwFileFlags;
136     DWORD dwFileOS;
137     DWORD dwFileType;
138     DWORD dwFileSubtype;
139     DWORD dwFileDateMS;
140     DWORD dwFileDateLS;
141 }
142 
143 extern (Windows) {
144     DWORD VerFindFileA(DWORD, LPCSTR, LPCSTR, LPCSTR, LPSTR, PUINT, LPSTR,
145       PUINT);
146     DWORD VerFindFileW(DWORD, LPCWSTR, LPCWSTR, LPCWSTR, LPWSTR, PUINT, LPWSTR,
147       PUINT);
148     DWORD VerInstallFileA(DWORD, LPCSTR, LPCSTR, LPCSTR, LPCSTR, LPCSTR, LPSTR,
149       PUINT);
150     DWORD VerInstallFileW(DWORD, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR,
151       LPWSTR, PUINT);
152     DWORD GetFileVersionInfoSizeA(LPCSTR, PDWORD);
153     DWORD GetFileVersionInfoSizeW(LPCWSTR, PDWORD);
154     BOOL GetFileVersionInfoA(LPCSTR, DWORD, DWORD, PVOID);
155     BOOL GetFileVersionInfoW(LPCWSTR, DWORD, DWORD, PVOID);
156     DWORD VerLanguageNameA(DWORD, LPSTR, DWORD);
157     DWORD VerLanguageNameW(DWORD, LPWSTR, DWORD);
158     BOOL VerQueryValueA(LPCVOID, LPCSTR, LPVOID*, PUINT);
159     BOOL VerQueryValueW(LPCVOID, LPCWSTR, LPVOID*, PUINT);
160 }
161 
version(Unicode)162 version (Unicode) {
163     alias VerFindFileW VerFindFile;
164     alias VerQueryValueW VerQueryValue;
165     alias VerInstallFileW VerInstallFile;
166     alias GetFileVersionInfoSizeW GetFileVersionInfoSize;
167     alias GetFileVersionInfoW GetFileVersionInfo;
168     alias VerLanguageNameW VerLanguageName;
169     alias VerQueryValueW VerQueryValue;
170 } else {
171     alias VerQueryValueA VerQueryValue;
172     alias VerFindFileA VerFindFile;
173     alias VerInstallFileA VerInstallFile;
174     alias GetFileVersionInfoSizeA GetFileVersionInfoSize;
175     alias GetFileVersionInfoA GetFileVersionInfo;
176     alias VerLanguageNameA VerLanguageName;
177     alias VerQueryValueA VerQueryValue;
178 }
179 
180 alias VERSIONHELPERAPI = BOOL;
IsWindowsVersionOrGreater(WORD wMajorVersion,WORD wMinorVersion,WORD wServicePackMajor)181 VERSIONHELPERAPI IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
182 {
183     OSVERSIONINFOEXW osvi;
184     const DWORDLONG dwlConditionMask = VerSetConditionMask(
185         VerSetConditionMask(
186             VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),
187             VER_MINORVERSION,
188             VER_GREATER_EQUAL),
189         VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL
190     );
191     osvi.dwMajorVersion = wMajorVersion;
192     osvi.dwMinorVersion = wMinorVersion;
193     osvi.wServicePackMajor = wServicePackMajor;
194 
195     return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
196 }
197 
IsWindowsXPOrGreater()198 VERSIONHELPERAPI IsWindowsXPOrGreater()
199 {
200     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0);
201 }
202 
IsWindowsXPSP1OrGreater()203 VERSIONHELPERAPI IsWindowsXPSP1OrGreater()
204 {
205     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1);
206 }
207 
IsWindowsXPSP2OrGreater()208 VERSIONHELPERAPI IsWindowsXPSP2OrGreater()
209 {
210     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 2);
211 }
212 
IsWindowsXPSP3OrGreater()213 VERSIONHELPERAPI IsWindowsXPSP3OrGreater()
214 {
215     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3);
216 }
217 
IsWindowsVistaOrGreater()218 VERSIONHELPERAPI IsWindowsVistaOrGreater()
219 {
220     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0);
221 }
222 
IsWindowsVistaSP1OrGreater()223 VERSIONHELPERAPI IsWindowsVistaSP1OrGreater()
224 {
225     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1);
226 }
227 
IsWindowsVistaSP2OrGreater()228 VERSIONHELPERAPI IsWindowsVistaSP2OrGreater()
229 {
230     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2);
231 }
232 
IsWindows7OrGreater()233 VERSIONHELPERAPI IsWindows7OrGreater()
234 {
235     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0);
236 }
237 
IsWindows7SP1OrGreater()238 VERSIONHELPERAPI IsWindows7SP1OrGreater()
239 {
240     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1);
241 }
242 
IsWindows8OrGreater()243 VERSIONHELPERAPI IsWindows8OrGreater()
244 {
245     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0);
246 }
247 
IsWindows8Point1OrGreater()248 VERSIONHELPERAPI IsWindows8Point1OrGreater()
249 {
250     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0);
251 }
252 
IsWindows10OrGreater()253 VERSIONHELPERAPI IsWindows10OrGreater()
254 {
255     return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 0);
256 }
257 
IsWindowsServer()258 VERSIONHELPERAPI IsWindowsServer()
259 {
260     OSVERSIONINFOEXW osvi = { OSVERSIONINFOEXW.sizeof, 0, 0, 0, 0, [0], 0, 0, 0, VER_NT_WORKSTATION };
261     const DWORDLONG dwlConditionMask = VerSetConditionMask( 0, VER_PRODUCT_TYPE, VER_EQUAL );
262 
263     return !VerifyVersionInfoW(&osvi, VER_PRODUCT_TYPE, dwlConditionMask);
264 }
265