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