ReactOS  0.4.14-dev-52-g6116262
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  */
20 DWORD
21 WINAPI
23 {
24  PPEB Peb = NtCurrentPeb();
25 
26  return (DWORD)( ((Peb->OSPlatformId ^ 2) << 30) |
27  (Peb->OSBuildNumber << 16) |
28  (Peb->OSMinorVersion << 8 ) |
30 }
31 
32 /*
33  * @implemented
34  */
35 BOOL
36 WINAPI
37 GetVersionExW(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);
50  if (Status == STATUS_SUCCESS)
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  */
67 BOOL
68 WINAPI
69 GetVersionExA(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  */
116 BOOL
117 WINAPI
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  */
159 BOOL
160 WINAPI
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 STATUS_REVISION_MISMATCH
Definition: ntstatus.h:311
ULONG dwBuildNumber
Definition: rtltypes.h:268
#define VER_MINORVERSION
Definition: rtltypes.h:226
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:265
UCHAR wProductType
Definition: rtltypes.h:274
#define IN
Definition: typedefs.h:38
#define TRUE
Definition: types.h:120
PPEB Peb
Definition: dllmain.c:27
#define VER_BUILDNUMBER
Definition: rtltypes.h:228
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:158
USHORT wSuiteMask
Definition: rtltypes.h:259
ULONG dwPlatformId
Definition: rtltypes.h:269
ULONG OSPlatformId
Definition: ntddk_ex.h:303
ULONG dwMinorVersion
Definition: rtltypes.h:267
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
#define ERROR_BAD_ARGUMENTS
Definition: winerror.h:232
WCHAR szCSDVersion[128]
Definition: rtltypes.h:247
BOOL WINAPI GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
Definition: version.c:37
USHORT wSuiteMask
Definition: rtltypes.h:273
BOOL WINAPI VerifyVersionInfoA(IN LPOSVERSIONINFOEXA lpVersionInformation, IN DWORD dwTypeMask, IN DWORDLONG dwlConditionMask)
Definition: version.c:161
DWORD WINAPI GetVersion(VOID)
Definition: version.c:22
ULONG dwMajorVersion
Definition: rtltypes.h:266
unsigned int BOOL
Definition: ntddk_ex.h:94
USHORT wServicePackMinor
Definition: rtltypes.h:258
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
void * PVOID
Definition: retypes.h:9
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
ULONG dwMajorVersion
Definition: rtltypes.h:243
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:242
#define VER_PLATFORMID
Definition: rtltypes.h:229
#define VER_MAJORVERSION
Definition: rtltypes.h:227
#define WINAPI
Definition: msvc.h:8
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:409
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
ULONG dwBuildNumber
Definition: rtltypes.h:245
ULONG OSBuildNumber
Definition: ntddk_ex.h:302
USHORT wServicePackMajor
Definition: rtltypes.h:257
struct _OSVERSIONINFOEXW OSVERSIONINFOEXW
ULONG dwPlatformId
Definition: rtltypes.h:246
Status
Definition: gdiplustypes.h:24
ULONG OSMinorVersion
Definition: ntddk_ex.h:301
#define NtCurrentPeb()
Definition: FLS.c:20
USHORT wServicePackMajor
Definition: rtltypes.h:271
#define DPRINT1
Definition: precomp.h:8
ULONG dwMinorVersion
Definition: rtltypes.h:244
#define ERROR_OLD_WIN_VERSION
Definition: winerror.h:672
unsigned long long DWORDLONG
Definition: intsafe.h:99
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
UCHAR wProductType
Definition: rtltypes.h:260
ULONG OSMajorVersion
Definition: ntddk_ex.h:300
return STATUS_SUCCESS
Definition: btrfs.c:2966
USHORT wServicePackMinor
Definition: rtltypes.h:272
NTSTATUS NTAPI RtlVerifyVersionInfo(IN PRTL_OSVERSIONINFOEXW VersionInfo, IN ULONG TypeMask, IN ULONGLONG ConditionMask)
Definition: version.c:55
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10