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)
15 /* FUNCTIONS ******************************************************************/
24 PPEB Peb
= NtCurrentPeb();
26 return (DWORD
)( ((Peb
->OSPlatformId
^ 2) << 30) |
27 (Peb
->OSBuildNumber
<< 16) |
28 (Peb
->OSMinorVersion
<< 8 ) |
29 Peb
->OSMajorVersion
);
37 GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation
)
40 LPOSVERSIONINFOEXW lpVersionInformationEx
;
42 if ((lpVersionInformation
->dwOSVersionInfoSize
!= sizeof(OSVERSIONINFOW
)) &&
43 (lpVersionInformation
->dwOSVersionInfoSize
!= sizeof(OSVERSIONINFOEXW
)))
45 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
49 Status
= RtlGetVersion((PRTL_OSVERSIONINFOW
)lpVersionInformation
);
50 if (Status
== STATUS_SUCCESS
)
52 if (lpVersionInformation
->dwOSVersionInfoSize
== sizeof(OSVERSIONINFOEXW
))
54 lpVersionInformationEx
= (PVOID
)lpVersionInformation
;
55 lpVersionInformationEx
->wReserved
= 0;
69 GetVersionExA(IN LPOSVERSIONINFOA lpVersionInformation
)
71 OSVERSIONINFOEXW VersionInformation
;
72 LPOSVERSIONINFOEXA lpVersionInformationEx
;
73 UNICODE_STRING CsdVersionW
;
75 ANSI_STRING CsdVersionA
;
77 if ((lpVersionInformation
->dwOSVersionInfoSize
!= sizeof(OSVERSIONINFOA
)) &&
78 (lpVersionInformation
->dwOSVersionInfoSize
!= sizeof(OSVERSIONINFOEXA
)))
80 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
84 VersionInformation
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXW
);
86 if (!GetVersionExW((LPOSVERSIONINFOW
)&VersionInformation
)) return FALSE
;
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
;
94 if (lpVersionInformation
->dwOSVersionInfoSize
== sizeof(OSVERSIONINFOEXA
))
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
;
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
));
118 VerifyVersionInfoW(IN LPOSVERSIONINFOEXW lpVersionInformation
,
120 IN DWORDLONG dwlConditionMask
)
124 Status
= RtlVerifyVersionInfo((PRTL_OSVERSIONINFOEXW
)lpVersionInformation
,
129 case STATUS_INVALID_PARAMETER
:
130 SetLastError(ERROR_BAD_ARGUMENTS
);
133 case STATUS_REVISION_MISMATCH
:
134 DPRINT1("VerifyVersionInfo -- Version mismatch\n");
135 SetLastError(ERROR_OLD_WIN_VERSION
);
139 /* RtlVerifyVersionInfo shouldn't report any other failure code! */
140 ASSERT(NT_SUCCESS(Status
));
150 VerifyVersionInfoA(IN LPOSVERSIONINFOEXA lpVersionInformation
,
152 IN DWORDLONG dwlConditionMask
)
154 OSVERSIONINFOEXW viex
;
156 /* NOTE: szCSDVersion is ignored, we don't need to convert it to Unicode */
157 viex
.dwOSVersionInfoSize
= sizeof(viex
);
158 viex
.dwMajorVersion
= lpVersionInformation
->dwMajorVersion
;
159 viex
.dwMinorVersion
= lpVersionInformation
->dwMinorVersion
;
160 viex
.dwBuildNumber
= lpVersionInformation
->dwBuildNumber
;
161 viex
.dwPlatformId
= lpVersionInformation
->dwPlatformId
;
162 viex
.wServicePackMajor
= lpVersionInformation
->wServicePackMajor
;
163 viex
.wServicePackMinor
= lpVersionInformation
->wServicePackMinor
;
164 viex
.wSuiteMask
= lpVersionInformation
->wSuiteMask
;
165 viex
.wProductType
= lpVersionInformation
->wProductType
;
166 viex
.wReserved
= lpVersionInformation
->wReserved
;
167 return VerifyVersionInfoW(&viex
, dwTypeMask
, dwlConditionMask
);