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