ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

NTSTATUS NTAPI RtlVerifyVersionInfo ( IN PRTL_OSVERSIONINFOEXW  VersionInfo,
IN ULONG  TypeMask,
IN ULONGLONG  ConditionMask 
)

Definition at line 54 of file version.c.

Referenced by PciIsSuiteVersion(), and VerifyVersionInfoW().

{
    RTL_OSVERSIONINFOEXW ver;
    NTSTATUS status;

    /* FIXME:
        - Check the following special case on Windows (various versions):
          o lp->wSuiteMask == 0 and ver.wSuiteMask != 0 and VER_AND/VER_OR
          o lp->dwOSVersionInfoSize != sizeof(OSVERSIONINFOEXW)
        - MSDN talks about some tests being impossible. Check what really happens.
     */

    ver.dwOSVersionInfoSize = sizeof(ver);
    status = RtlGetVersion( (PRTL_OSVERSIONINFOW)&ver );
    if (status != STATUS_SUCCESS) return status;

    if(!(TypeMask && ConditionMask)) return STATUS_INVALID_PARAMETER;

    if(TypeMask & VER_PRODUCT_TYPE)
    {
        status = version_compare_values(ver.wProductType, VersionInfo->wProductType, ConditionMask >> 7 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
        if (status != STATUS_SUCCESS)
            return status;
    }
    if(TypeMask & VER_SUITENAME)
    {
        switch(ConditionMask >> 6 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK)
        {
            case VER_AND:
                if((VersionInfo->wSuiteMask & ver.wSuiteMask) != VersionInfo->wSuiteMask)
                    return STATUS_REVISION_MISMATCH;
                break;
            case VER_OR:
                if(!(VersionInfo->wSuiteMask & ver.wSuiteMask) && VersionInfo->wSuiteMask)
                    return STATUS_REVISION_MISMATCH;
                break;
            default:
                return STATUS_INVALID_PARAMETER;
        }
    }
    if(TypeMask & VER_PLATFORMID)
    {
        status = version_compare_values(ver.dwPlatformId, VersionInfo->dwPlatformId, ConditionMask >> 3 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
        if (status != STATUS_SUCCESS)
            return status;
    }
    if(TypeMask & VER_BUILDNUMBER)
    {
        status = version_compare_values(ver.dwBuildNumber, VersionInfo->dwBuildNumber, ConditionMask >> 2 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
        if (status != STATUS_SUCCESS)
            return status;
    }
    if(TypeMask & (VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR|VER_SERVICEPACKMINOR))
    {
        unsigned char condition = 0;
        BOOLEAN do_next_check = TRUE;

        if(TypeMask & VER_MAJORVERSION)
            condition = ConditionMask >> 1 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
        else if(TypeMask & VER_MINORVERSION)
            condition = ConditionMask >> 0 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
        else if(TypeMask & VER_SERVICEPACKMAJOR)
            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;

        if(TypeMask & VER_MAJORVERSION)
        {
            status = version_compare_values(ver.dwMajorVersion, VersionInfo->dwMajorVersion, condition);
            do_next_check = (ver.dwMajorVersion == VersionInfo->dwMajorVersion) &&
                ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
        }
        if((TypeMask & VER_MINORVERSION) && do_next_check)
        {
            status = version_compare_values(ver.dwMinorVersion, VersionInfo->dwMinorVersion, condition);
            do_next_check = (ver.dwMinorVersion == VersionInfo->dwMinorVersion) &&
                ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
        }
        if((TypeMask & VER_SERVICEPACKMAJOR) && do_next_check)
        {
            status = version_compare_values(ver.wServicePackMajor, VersionInfo->wServicePackMajor, condition);
            do_next_check = (ver.wServicePackMajor == VersionInfo->wServicePackMajor) &&
                ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
        }
        if((TypeMask & VER_SERVICEPACKMINOR) && do_next_check)
        {
            status = version_compare_values(ver.wServicePackMinor, VersionInfo->wServicePackMinor, condition);
        }

        if (status != STATUS_SUCCESS)
            return status;
    }

    return STATUS_SUCCESS;
}

Generated on Sat May 26 2012 04:47:23 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.