ReactOS 0.4.15-dev-7788-g1ad9096
version.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/kernel32/client/version.c
5 * PURPOSE: Version functions
6 * PROGRAMMER: Ariadne (ariadne@xs4all.nl)
7 Ged Murphy (gedmurphy@reactos.org)
8 */
9
10#include <k32.h>
11
12#define NDEBUG
13#include <debug.h>
14
15/* FUNCTIONS ******************************************************************/
16
17/*
18 * @implemented
19 */
23{
25
26 return (DWORD)( ((Peb->OSPlatformId ^ 2) << 30) |
27 (Peb->OSBuildNumber << 16) |
28 (Peb->OSMinorVersion << 8 ) |
30}
31
32/*
33 * @implemented
34 */
35BOOL
37GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
38{
40 LPOSVERSIONINFOEXW lpVersionInformationEx;
41
42 if ((lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOW)) &&
43 (lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOEXW)))
44 {
46 return FALSE;
47 }
48
49 Status = RtlGetVersion((PRTL_OSVERSIONINFOW)lpVersionInformation);
51 {
52 if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXW))
53 {
54 lpVersionInformationEx = (PVOID)lpVersionInformation;
55 lpVersionInformationEx->wReserved = 0;
56 }
57
58 return TRUE;
59 }
60
61 return FALSE;
62}
63
64/*
65 * @implemented
66 */
67BOOL
69GetVersionExA(IN LPOSVERSIONINFOA lpVersionInformation)
70{
71 OSVERSIONINFOEXW VersionInformation;
72 LPOSVERSIONINFOEXA lpVersionInformationEx;
73 UNICODE_STRING CsdVersionW;
75 ANSI_STRING CsdVersionA;
76
77 if ((lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOA)) &&
78 (lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOEXA)))
79 {
81 return FALSE;
82 }
83
84 VersionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
85
86 if (!GetVersionExW((LPOSVERSIONINFOW)&VersionInformation)) return FALSE;
87
88 /* Copy back fields that match both supported structures */
89 lpVersionInformation->dwMajorVersion = VersionInformation.dwMajorVersion;
90 lpVersionInformation->dwMinorVersion = VersionInformation.dwMinorVersion;
91 lpVersionInformation->dwBuildNumber = VersionInformation.dwBuildNumber;
92 lpVersionInformation->dwPlatformId = VersionInformation.dwPlatformId;
93
94 if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA))
95 {
96 lpVersionInformationEx = (PVOID)lpVersionInformation;
97 lpVersionInformationEx->wServicePackMajor = VersionInformation.wServicePackMajor;
98 lpVersionInformationEx->wServicePackMinor = VersionInformation.wServicePackMinor;
99 lpVersionInformationEx->wSuiteMask = VersionInformation.wSuiteMask;
100 lpVersionInformationEx->wProductType = VersionInformation.wProductType;
101 lpVersionInformationEx->wReserved = VersionInformation.wReserved;
102 }
103
104 /* Convert the CSD string */
105 RtlInitEmptyAnsiString(&CsdVersionA,
106 lpVersionInformation->szCSDVersion,
107 sizeof(lpVersionInformation->szCSDVersion));
108 RtlInitUnicodeString(&CsdVersionW, VersionInformation.szCSDVersion);
109 Status = RtlUnicodeStringToAnsiString(&CsdVersionA, &CsdVersionW, FALSE);
110 return (NT_SUCCESS(Status));
111}
112
113/*
114 * @implemented
115 */
116BOOL
117WINAPI
119 IN DWORD dwTypeMask,
120 IN DWORDLONG dwlConditionMask)
121{
123
124 Status = RtlVerifyVersionInfo((PRTL_OSVERSIONINFOEXW)lpVersionInformation,
125 dwTypeMask,
126 dwlConditionMask);
127 switch (Status)
128 {
131 return FALSE;
132
134 if (lpVersionInformation)
135 {
136 DPRINT1("VerifyVersionInfo -- Version mismatch(%d.%d.%d:%d)\n",
137 (dwTypeMask & VER_MAJORVERSION) ? lpVersionInformation->dwMajorVersion : -1,
138 (dwTypeMask & VER_MINORVERSION) ? lpVersionInformation->dwMinorVersion : -1,
139 (dwTypeMask & VER_BUILDNUMBER) ? lpVersionInformation->dwBuildNumber : -1,
140 (dwTypeMask & VER_PLATFORMID) ? lpVersionInformation->dwPlatformId : -1);
141 }
142 else
143 {
144 DPRINT1("VerifyVersionInfo -- Version mismatch(NULL)\n");
145 }
147 return FALSE;
148
149 default:
150 /* RtlVerifyVersionInfo shouldn't report any other failure code! */
152 return TRUE;
153 }
154}
155
156/*
157 * @implemented
158 */
159BOOL
160WINAPI
162 IN DWORD dwTypeMask,
163 IN DWORDLONG dwlConditionMask)
164{
165 OSVERSIONINFOEXW viex;
166
167 /* NOTE: szCSDVersion is ignored, we don't need to convert it to Unicode */
168 viex.dwOSVersionInfoSize = sizeof(viex);
169 viex.dwMajorVersion = lpVersionInformation->dwMajorVersion;
170 viex.dwMinorVersion = lpVersionInformation->dwMinorVersion;
171 viex.dwBuildNumber = lpVersionInformation->dwBuildNumber;
172 viex.dwPlatformId = lpVersionInformation->dwPlatformId;
173 viex.wServicePackMajor = lpVersionInformation->wServicePackMajor;
174 viex.wServicePackMinor = lpVersionInformation->wServicePackMinor;
175 viex.wSuiteMask = lpVersionInformation->wSuiteMask;
176 viex.wProductType = lpVersionInformation->wProductType;
177 viex.wReserved = lpVersionInformation->wReserved;
178 return VerifyVersionInfoW(&viex, dwTypeMask, dwlConditionMask);
179}
#define NtCurrentPeb()
Definition: FLS.c:22
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:158
#define SetLastError(x)
Definition: compat.h:752
PPEB Peb
Definition: dllmain.c:27
BOOL WINAPI GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
Definition: version.c:37
BOOL WINAPI VerifyVersionInfoA(IN LPOSVERSIONINFOEXA lpVersionInformation, IN DWORD dwTypeMask, IN DWORDLONG dwlConditionMask)
Definition: version.c:161
BOOL WINAPI GetVersionExA(IN LPOSVERSIONINFOA lpVersionInformation)
Definition: version.c:69
BOOL WINAPI VerifyVersionInfoW(IN LPOSVERSIONINFOEXW lpVersionInformation, IN DWORD dwTypeMask, IN DWORDLONG dwlConditionMask)
Definition: version.c:118
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
Status
Definition: gdiplustypes.h:25
NTSYSAPI NTSTATUS WINAPI RtlVerifyVersionInfo(const RTL_OSVERSIONINFOEXW *, DWORD, DWORDLONG)
unsigned long long DWORDLONG
Definition: intsafe.h:93
#define ASSERT(a)
Definition: mode.c:44
#define VER_BUILDNUMBER
Definition: rtltypes.h:230
#define VER_MAJORVERSION
Definition: rtltypes.h:229
#define VER_PLATFORMID
Definition: rtltypes.h:231
#define VER_MINORVERSION
Definition: rtltypes.h:228
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:325
DWORD WINAPI GetVersion()
Definition: redirtest.c:5
#define STATUS_SUCCESS
Definition: shellext.h:65
USHORT wServicePackMajor
Definition: rtltypes.h:261
USHORT wSuiteMask
Definition: rtltypes.h:263
UCHAR wProductType
Definition: rtltypes.h:264
USHORT wServicePackMinor
Definition: rtltypes.h:262
WCHAR szCSDVersion[128]
Definition: rtltypes.h:274
ULONG dwMajorVersion
Definition: rtltypes.h:270
ULONG dwMinorVersion
Definition: rtltypes.h:271
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:269
USHORT wServicePackMinor
Definition: rtltypes.h:276
ULONG dwPlatformId
Definition: rtltypes.h:273
UCHAR wProductType
Definition: rtltypes.h:278
USHORT wSuiteMask
Definition: rtltypes.h:277
ULONG dwBuildNumber
Definition: rtltypes.h:272
USHORT wServicePackMajor
Definition: rtltypes.h:275
ULONG OSMinorVersion
Definition: ntddk_ex.h:301
ULONG OSMajorVersion
Definition: ntddk_ex.h:300
ULONG OSBuildNumber
Definition: ntddk_ex.h:302
ULONG OSPlatformId
Definition: ntddk_ex.h:303
void * PVOID
Definition: typedefs.h:50
#define IN
Definition: typedefs.h:39
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define WINAPI
Definition: msvc.h:6
#define ERROR_OLD_WIN_VERSION
Definition: winerror.h:672
#define ERROR_BAD_ARGUMENTS
Definition: winerror.h:232
struct _OSVERSIONINFOEXW OSVERSIONINFOEXW