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 */
10module core.sys.windows.winver;
11version (Windows):
12@system:
13import core.sys.windows.w32api;
14import core.sys.windows.winbase;
15import core.sys.windows.sdkddkver;
16
17version (ANSI) {} else version = Unicode;
18pragma(lib, "version");
19
20import core.sys.windows.windef;
21
22// FIXME: type weirdness
23enum {
24    VS_FILE_INFO    =  16,
25    VS_VERSION_INFO =   1,
26    VS_USER_DEFINED = 100
27}
28
29enum {
30    VS_FFI_SIGNATURE     = 0xFEEF04BD,
31    VS_FFI_STRUCVERSION  =    0x10000,
32    VS_FFI_FILEFLAGSMASK =       0x3F
33}
34
35enum {
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
44enum {
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
62enum {
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
72enum {
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
90enum : DWORD {
91    VFFF_ISSHAREDFILE = 1
92}
93
94enum : DWORD {
95    VFF_CURNEDEST    = 1,
96    VFF_FILEINUSE    = 2,
97    VFF_BUFFTOOSMALL = 4
98}
99
100enum : DWORD {
101    VIFF_FORCEINSTALL  = 1,
102    VIFF_DONTDELETEOLD
103}
104
105enum {
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
127struct 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
143extern (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
162version (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
180alias VERSIONHELPERAPI = BOOL;
181VERSIONHELPERAPI 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
198VERSIONHELPERAPI IsWindowsXPOrGreater()
199{
200    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0);
201}
202
203VERSIONHELPERAPI IsWindowsXPSP1OrGreater()
204{
205    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1);
206}
207
208VERSIONHELPERAPI IsWindowsXPSP2OrGreater()
209{
210    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 2);
211}
212
213VERSIONHELPERAPI IsWindowsXPSP3OrGreater()
214{
215    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3);
216}
217
218VERSIONHELPERAPI IsWindowsVistaOrGreater()
219{
220    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0);
221}
222
223VERSIONHELPERAPI IsWindowsVistaSP1OrGreater()
224{
225    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1);
226}
227
228VERSIONHELPERAPI IsWindowsVistaSP2OrGreater()
229{
230    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2);
231}
232
233VERSIONHELPERAPI IsWindows7OrGreater()
234{
235    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0);
236}
237
238VERSIONHELPERAPI IsWindows7SP1OrGreater()
239{
240    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1);
241}
242
243VERSIONHELPERAPI IsWindows8OrGreater()
244{
245    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0);
246}
247
248VERSIONHELPERAPI IsWindows8Point1OrGreater()
249{
250    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0);
251}
252
253VERSIONHELPERAPI IsWindows10OrGreater()
254{
255    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 0);
256}
257
258VERSIONHELPERAPI 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