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