mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 23:05:41 +00:00
[RTL]
- Separate condition calculation in RtlVerifyVersionInfo into an extra function. Patch by Hermès Bélusca (2/X) - Don't make the Hungarian more ridiculous than it needs to be CORE-6611 svn path=/trunk/; revision=57355
This commit is contained in:
parent
69232d954d
commit
e3cd71c6d6
1 changed files with 64 additions and 28 deletions
|
@ -3,7 +3,8 @@
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
* PURPOSE: Runtime code
|
* PURPOSE: Runtime code
|
||||||
* FILE: lib/rtl/version.c
|
* FILE: lib/rtl/version.c
|
||||||
* PROGRAMER: Filip Navara
|
* PROGRAMERS: Filip Navara
|
||||||
|
* Hermes BELUSCA - MAITO
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
/* INCLUDES *****************************************************************/
|
||||||
|
@ -23,6 +24,10 @@ RtlGetVersion(
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
|
static BYTE
|
||||||
|
RtlpVerGetCondition(IN ULONGLONG dwlConditionMask,
|
||||||
|
IN DWORD dwTypeBitMask);
|
||||||
|
|
||||||
static BOOLEAN
|
static BOOLEAN
|
||||||
RtlpVerCompare(ULONG left, ULONG right, UCHAR condition)
|
RtlpVerCompare(ULONG left, ULONG right, UCHAR condition)
|
||||||
{
|
{
|
||||||
|
@ -67,7 +72,7 @@ RtlVerifyVersionInfo(
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ver.dwOSVersionInfoSize = sizeof(ver);
|
ver.dwOSVersionInfoSize = sizeof(ver);
|
||||||
status = RtlGetVersion( (PRTL_OSVERSIONINFOW)&ver );
|
status = RtlGetVersion((PRTL_OSVERSIONINFOW)&ver);
|
||||||
if (status != STATUS_SUCCESS) return status;
|
if (status != STATUS_SUCCESS) return status;
|
||||||
|
|
||||||
if (!TypeMask || !ConditionMask) return STATUS_INVALID_PARAMETER;
|
if (!TypeMask || !ConditionMask) return STATUS_INVALID_PARAMETER;
|
||||||
|
@ -76,14 +81,14 @@ RtlVerifyVersionInfo(
|
||||||
{
|
{
|
||||||
comparison = RtlpVerCompare(ver.wProductType,
|
comparison = RtlpVerCompare(ver.wProductType,
|
||||||
VersionInfo->wProductType,
|
VersionInfo->wProductType,
|
||||||
ConditionMask >> 7 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
|
RtlpVerGetCondition(ConditionMask, VER_PRODUCT_TYPE));
|
||||||
if (!comparison)
|
if (!comparison)
|
||||||
return STATUS_REVISION_MISMATCH;
|
return STATUS_REVISION_MISMATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TypeMask & VER_SUITENAME)
|
if (TypeMask & VER_SUITENAME)
|
||||||
{
|
{
|
||||||
switch (ConditionMask >> 6 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK)
|
switch (RtlpVerGetCondition(ConditionMask, VER_SUITENAME))
|
||||||
{
|
{
|
||||||
case VER_AND:
|
case VER_AND:
|
||||||
if ((VersionInfo->wSuiteMask & ver.wSuiteMask) != VersionInfo->wSuiteMask)
|
if ((VersionInfo->wSuiteMask & ver.wSuiteMask) != VersionInfo->wSuiteMask)
|
||||||
|
@ -106,7 +111,7 @@ RtlVerifyVersionInfo(
|
||||||
{
|
{
|
||||||
comparison = RtlpVerCompare(ver.dwPlatformId,
|
comparison = RtlpVerCompare(ver.dwPlatformId,
|
||||||
VersionInfo->dwPlatformId,
|
VersionInfo->dwPlatformId,
|
||||||
ConditionMask >> 3 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
|
RtlpVerGetCondition(ConditionMask, VER_PLATFORMID));
|
||||||
if (!comparison)
|
if (!comparison)
|
||||||
return STATUS_REVISION_MISMATCH;
|
return STATUS_REVISION_MISMATCH;
|
||||||
}
|
}
|
||||||
|
@ -115,24 +120,21 @@ RtlVerifyVersionInfo(
|
||||||
{
|
{
|
||||||
comparison = RtlpVerCompare(ver.dwBuildNumber,
|
comparison = RtlpVerCompare(ver.dwBuildNumber,
|
||||||
VersionInfo->dwBuildNumber,
|
VersionInfo->dwBuildNumber,
|
||||||
ConditionMask >> 2 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
|
RtlpVerGetCondition(ConditionMask, VER_BUILDNUMBER));
|
||||||
if (!comparison)
|
if (!comparison)
|
||||||
return STATUS_REVISION_MISMATCH;
|
return STATUS_REVISION_MISMATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TypeMask & (VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR|VER_SERVICEPACKMINOR))
|
TypeMask &= VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR|VER_SERVICEPACKMINOR;
|
||||||
|
if (TypeMask)
|
||||||
{
|
{
|
||||||
UCHAR condition = 0;
|
|
||||||
BOOLEAN do_next_check = TRUE;
|
BOOLEAN do_next_check = TRUE;
|
||||||
|
/*
|
||||||
if (TypeMask & VER_MAJORVERSION)
|
* Select the leading comparison operator (for example, the comparison
|
||||||
condition = ConditionMask >> 1 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
|
* operator for VER_MAJORVERSION supersedes the others for VER_MINORVERSION,
|
||||||
else if (TypeMask & VER_MINORVERSION)
|
* VER_SERVICEPACKMAJOR and VER_SERVICEPACKMINOR).
|
||||||
condition = ConditionMask >> 0 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
|
*/
|
||||||
else if (TypeMask & VER_SERVICEPACKMAJOR)
|
BYTE condition = RtlpVerGetCondition(ConditionMask, TypeMask);
|
||||||
condition = ConditionMask >> 5 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
|
|
||||||
else if (TypeMask & VER_SERVICEPACKMINOR)
|
|
||||||
condition = ConditionMask >> 4 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
|
|
||||||
|
|
||||||
comparison = TRUE;
|
comparison = TRUE;
|
||||||
if (TypeMask & VER_MAJORVERSION)
|
if (TypeMask & VER_MAJORVERSION)
|
||||||
|
@ -173,6 +175,40 @@ RtlVerifyVersionInfo(
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BYTE
|
||||||
|
RtlpVerGetCondition(IN ULONGLONG dwlConditionMask,
|
||||||
|
IN DWORD dwTypeBitMask)
|
||||||
|
{
|
||||||
|
BYTE bConditionMask = 0;
|
||||||
|
|
||||||
|
if (dwTypeBitMask & VER_PRODUCT_TYPE)
|
||||||
|
bConditionMask |= dwlConditionMask >> 7 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
|
else if (dwTypeBitMask & VER_SUITENAME)
|
||||||
|
bConditionMask |= dwlConditionMask >> 6 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
|
else if (dwTypeBitMask & VER_PLATFORMID)
|
||||||
|
bConditionMask |= dwlConditionMask >> 3 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
|
else if (dwTypeBitMask & VER_BUILDNUMBER)
|
||||||
|
bConditionMask |= dwlConditionMask >> 2 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
|
/*
|
||||||
|
* We choose here the lexicographical order on the 4D space
|
||||||
|
* {(Major ; Minor ; SP Major ; SP Minor)} to select the
|
||||||
|
* appropriate comparison operator.
|
||||||
|
* Therefore the following 'else if' instructions must be in this order.
|
||||||
|
*/
|
||||||
|
else if (dwTypeBitMask & VER_MAJORVERSION)
|
||||||
|
bConditionMask |= dwlConditionMask >> 1 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
|
else if (dwTypeBitMask & VER_MINORVERSION)
|
||||||
|
bConditionMask |= dwlConditionMask >> 0 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
|
else if (dwTypeBitMask & VER_SERVICEPACKMAJOR)
|
||||||
|
bConditionMask |= dwlConditionMask >> 5 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
|
else if (dwTypeBitMask & VER_SERVICEPACKMINOR)
|
||||||
|
bConditionMask |= dwlConditionMask >> 4 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
|
|
||||||
|
bConditionMask &= VER_CONDITION_MASK;
|
||||||
|
|
||||||
|
return bConditionMask;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
@ -180,32 +216,32 @@ ULONGLONG
|
||||||
NTAPI
|
NTAPI
|
||||||
VerSetConditionMask(IN ULONGLONG dwlConditionMask,
|
VerSetConditionMask(IN ULONGLONG dwlConditionMask,
|
||||||
IN DWORD dwTypeBitMask,
|
IN DWORD dwTypeBitMask,
|
||||||
IN BYTE dwConditionMask)
|
IN BYTE bConditionMask)
|
||||||
{
|
{
|
||||||
if (dwTypeBitMask == 0)
|
if (dwTypeBitMask == 0)
|
||||||
return dwlConditionMask;
|
return dwlConditionMask;
|
||||||
|
|
||||||
dwConditionMask &= VER_CONDITION_MASK;
|
bConditionMask &= VER_CONDITION_MASK;
|
||||||
|
|
||||||
if (dwConditionMask == 0)
|
if (bConditionMask == 0)
|
||||||
return dwlConditionMask;
|
return dwlConditionMask;
|
||||||
|
|
||||||
if (dwTypeBitMask & VER_PRODUCT_TYPE)
|
if (dwTypeBitMask & VER_PRODUCT_TYPE)
|
||||||
dwlConditionMask |= dwConditionMask << 7 * VER_NUM_BITS_PER_CONDITION_MASK;
|
dwlConditionMask |= bConditionMask << 7 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
else if (dwTypeBitMask & VER_SUITENAME)
|
else if (dwTypeBitMask & VER_SUITENAME)
|
||||||
dwlConditionMask |= dwConditionMask << 6 * VER_NUM_BITS_PER_CONDITION_MASK;
|
dwlConditionMask |= bConditionMask << 6 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
else if (dwTypeBitMask & VER_SERVICEPACKMAJOR)
|
else if (dwTypeBitMask & VER_SERVICEPACKMAJOR)
|
||||||
dwlConditionMask |= dwConditionMask << 5 * VER_NUM_BITS_PER_CONDITION_MASK;
|
dwlConditionMask |= bConditionMask << 5 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
else if (dwTypeBitMask & VER_SERVICEPACKMINOR)
|
else if (dwTypeBitMask & VER_SERVICEPACKMINOR)
|
||||||
dwlConditionMask |= dwConditionMask << 4 * VER_NUM_BITS_PER_CONDITION_MASK;
|
dwlConditionMask |= bConditionMask << 4 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
else if (dwTypeBitMask & VER_PLATFORMID)
|
else if (dwTypeBitMask & VER_PLATFORMID)
|
||||||
dwlConditionMask |= dwConditionMask << 3 * VER_NUM_BITS_PER_CONDITION_MASK;
|
dwlConditionMask |= bConditionMask << 3 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
else if (dwTypeBitMask & VER_BUILDNUMBER)
|
else if (dwTypeBitMask & VER_BUILDNUMBER)
|
||||||
dwlConditionMask |= dwConditionMask << 2 * VER_NUM_BITS_PER_CONDITION_MASK;
|
dwlConditionMask |= bConditionMask << 2 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
else if (dwTypeBitMask & VER_MAJORVERSION)
|
else if (dwTypeBitMask & VER_MAJORVERSION)
|
||||||
dwlConditionMask |= dwConditionMask << 1 * VER_NUM_BITS_PER_CONDITION_MASK;
|
dwlConditionMask |= bConditionMask << 1 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
else if (dwTypeBitMask & VER_MINORVERSION)
|
else if (dwTypeBitMask & VER_MINORVERSION)
|
||||||
dwlConditionMask |= dwConditionMask << 0 * VER_NUM_BITS_PER_CONDITION_MASK;
|
dwlConditionMask |= bConditionMask << 0 * VER_NUM_BITS_PER_CONDITION_MASK;
|
||||||
|
|
||||||
return dwlConditionMask;
|
return dwlConditionMask;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue