- 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:
Thomas Faber 2012-09-20 20:46:08 +00:00
parent 69232d954d
commit e3cd71c6d6

View file

@ -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;
} }