mirror of
https://github.com/reactos/reactos.git
synced 2024-08-19 18:02:55 +00:00
180 lines
5.8 KiB
C
180 lines
5.8 KiB
C
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS system libraries
|
|
* FILE: dll/win32/kernel32/client/version.c
|
|
* PURPOSE: Version functions
|
|
* PROGRAMMER: Ariadne (ariadne@xs4all.nl)
|
|
Ged Murphy (gedmurphy@reactos.org)
|
|
*/
|
|
|
|
#include <k32.h>
|
|
|
|
#define NDEBUG
|
|
#include <debug.h>
|
|
|
|
/* FUNCTIONS ******************************************************************/
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
DWORD
|
|
WINAPI
|
|
GetVersion(VOID)
|
|
{
|
|
PPEB Peb = NtCurrentPeb();
|
|
|
|
return (DWORD)( ((Peb->OSPlatformId ^ 2) << 30) |
|
|
(Peb->OSBuildNumber << 16) |
|
|
(Peb->OSMinorVersion << 8 ) |
|
|
Peb->OSMajorVersion );
|
|
}
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
BOOL
|
|
WINAPI
|
|
GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
|
|
{
|
|
NTSTATUS Status;
|
|
LPOSVERSIONINFOEXW lpVersionInformationEx;
|
|
|
|
if ((lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOW)) &&
|
|
(lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOEXW)))
|
|
{
|
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
|
return FALSE;
|
|
}
|
|
|
|
Status = RtlGetVersion((PRTL_OSVERSIONINFOW)lpVersionInformation);
|
|
if (Status == STATUS_SUCCESS)
|
|
{
|
|
if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXW))
|
|
{
|
|
lpVersionInformationEx = (PVOID)lpVersionInformation;
|
|
lpVersionInformationEx->wReserved = 0;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
BOOL
|
|
WINAPI
|
|
GetVersionExA(IN LPOSVERSIONINFOA lpVersionInformation)
|
|
{
|
|
OSVERSIONINFOEXW VersionInformation;
|
|
LPOSVERSIONINFOEXA lpVersionInformationEx;
|
|
UNICODE_STRING CsdVersionW;
|
|
NTSTATUS Status;
|
|
ANSI_STRING CsdVersionA;
|
|
|
|
if ((lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOA)) &&
|
|
(lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOEXA)))
|
|
{
|
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
|
return FALSE;
|
|
}
|
|
|
|
VersionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
|
|
|
|
if (!GetVersionExW((LPOSVERSIONINFOW)&VersionInformation)) return FALSE;
|
|
|
|
/* Copy back fields that match both supported structures */
|
|
lpVersionInformation->dwMajorVersion = VersionInformation.dwMajorVersion;
|
|
lpVersionInformation->dwMinorVersion = VersionInformation.dwMinorVersion;
|
|
lpVersionInformation->dwBuildNumber = VersionInformation.dwBuildNumber;
|
|
lpVersionInformation->dwPlatformId = VersionInformation.dwPlatformId;
|
|
|
|
if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA))
|
|
{
|
|
lpVersionInformationEx = (PVOID)lpVersionInformation;
|
|
lpVersionInformationEx->wServicePackMajor = VersionInformation.wServicePackMajor;
|
|
lpVersionInformationEx->wServicePackMinor = VersionInformation.wServicePackMinor;
|
|
lpVersionInformationEx->wSuiteMask = VersionInformation.wSuiteMask;
|
|
lpVersionInformationEx->wProductType = VersionInformation.wProductType;
|
|
lpVersionInformationEx->wReserved = VersionInformation.wReserved;
|
|
}
|
|
|
|
/* Convert the CSD string */
|
|
RtlInitEmptyAnsiString(&CsdVersionA,
|
|
lpVersionInformation->szCSDVersion,
|
|
sizeof(lpVersionInformation->szCSDVersion));
|
|
RtlInitUnicodeString(&CsdVersionW, VersionInformation.szCSDVersion);
|
|
Status = RtlUnicodeStringToAnsiString(&CsdVersionA, &CsdVersionW, FALSE);
|
|
return (NT_SUCCESS(Status));
|
|
}
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
BOOL
|
|
WINAPI
|
|
VerifyVersionInfoW(IN LPOSVERSIONINFOEXW lpVersionInformation,
|
|
IN DWORD dwTypeMask,
|
|
IN DWORDLONG dwlConditionMask)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
Status = RtlVerifyVersionInfo((PRTL_OSVERSIONINFOEXW)lpVersionInformation,
|
|
dwTypeMask,
|
|
dwlConditionMask);
|
|
switch (Status)
|
|
{
|
|
case STATUS_INVALID_PARAMETER:
|
|
SetLastError(ERROR_BAD_ARGUMENTS);
|
|
return FALSE;
|
|
|
|
case STATUS_REVISION_MISMATCH:
|
|
if (lpVersionInformation)
|
|
{
|
|
DPRINT1("VerifyVersionInfo -- Version mismatch(%d.%d.%d:%d)\n",
|
|
(dwTypeMask & VER_MAJORVERSION) ? lpVersionInformation->dwMajorVersion : -1,
|
|
(dwTypeMask & VER_MINORVERSION) ? lpVersionInformation->dwMinorVersion : -1,
|
|
(dwTypeMask & VER_BUILDNUMBER) ? lpVersionInformation->dwBuildNumber : -1,
|
|
(dwTypeMask & VER_PLATFORMID) ? lpVersionInformation->dwPlatformId : -1);
|
|
}
|
|
else
|
|
{
|
|
DPRINT1("VerifyVersionInfo -- Version mismatch(NULL)\n");
|
|
}
|
|
SetLastError(ERROR_OLD_WIN_VERSION);
|
|
return FALSE;
|
|
|
|
default:
|
|
/* RtlVerifyVersionInfo shouldn't report any other failure code! */
|
|
ASSERT(NT_SUCCESS(Status));
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
BOOL
|
|
WINAPI
|
|
VerifyVersionInfoA(IN LPOSVERSIONINFOEXA lpVersionInformation,
|
|
IN DWORD dwTypeMask,
|
|
IN DWORDLONG dwlConditionMask)
|
|
{
|
|
OSVERSIONINFOEXW viex;
|
|
|
|
/* NOTE: szCSDVersion is ignored, we don't need to convert it to Unicode */
|
|
viex.dwOSVersionInfoSize = sizeof(viex);
|
|
viex.dwMajorVersion = lpVersionInformation->dwMajorVersion;
|
|
viex.dwMinorVersion = lpVersionInformation->dwMinorVersion;
|
|
viex.dwBuildNumber = lpVersionInformation->dwBuildNumber;
|
|
viex.dwPlatformId = lpVersionInformation->dwPlatformId;
|
|
viex.wServicePackMajor = lpVersionInformation->wServicePackMajor;
|
|
viex.wServicePackMinor = lpVersionInformation->wServicePackMinor;
|
|
viex.wSuiteMask = lpVersionInformation->wSuiteMask;
|
|
viex.wProductType = lpVersionInformation->wProductType;
|
|
viex.wReserved = lpVersionInformation->wReserved;
|
|
return VerifyVersionInfoW(&viex, dwTypeMask, dwlConditionMask);
|
|
}
|