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

version.c
Go to the documentation of this file.
00001 /* COPYRIGHT:       See COPYING in the top level directory
00002  * PROJECT:         ReactOS system libraries
00003  * PURPOSE:         Runtime code
00004  * FILE:            lib/rtl/version.c
00005  * PROGRAMER:       Filip Navara
00006  */
00007 
00008 /* INCLUDES *****************************************************************/
00009 
00010 #include <rtl.h>
00011 
00012 #define NDEBUG
00013 #include <debug.h>
00014 
00015 /* GLOBALS ******************************************************************/
00016 
00017 NTSTATUS
00018 NTAPI
00019 RtlGetVersion(
00020     OUT PRTL_OSVERSIONINFOW lpVersionInformation
00021     );
00022 
00023 /* FUNCTIONS ****************************************************************/
00024 
00025 static inline NTSTATUS version_compare_values(ULONG left, ULONG right, UCHAR condition)
00026 {
00027     switch (condition) {
00028         case VER_EQUAL:
00029             if (left != right) return STATUS_REVISION_MISMATCH;
00030             break;
00031         case VER_GREATER:
00032             if (left <= right) return STATUS_REVISION_MISMATCH;
00033             break;
00034         case VER_GREATER_EQUAL:
00035             if (left < right) return STATUS_REVISION_MISMATCH;
00036             break;
00037         case VER_LESS:
00038             if (left >= right) return STATUS_REVISION_MISMATCH;
00039             break;
00040         case VER_LESS_EQUAL:
00041             if (left > right) return STATUS_REVISION_MISMATCH;
00042             break;
00043         default:
00044             return STATUS_REVISION_MISMATCH;
00045     }
00046     return STATUS_SUCCESS;
00047 }
00048 
00049 /*
00050 * @implemented
00051 */
00052 NTSTATUS
00053 NTAPI
00054 RtlVerifyVersionInfo(
00055     IN PRTL_OSVERSIONINFOEXW VersionInfo,
00056     IN ULONG TypeMask,
00057     IN ULONGLONG ConditionMask
00058     )
00059 {
00060     RTL_OSVERSIONINFOEXW ver;
00061     NTSTATUS status;
00062 
00063     /* FIXME:
00064         - Check the following special case on Windows (various versions):
00065           o lp->wSuiteMask == 0 and ver.wSuiteMask != 0 and VER_AND/VER_OR
00066           o lp->dwOSVersionInfoSize != sizeof(OSVERSIONINFOEXW)
00067         - MSDN talks about some tests being impossible. Check what really happens.
00068      */
00069 
00070     ver.dwOSVersionInfoSize = sizeof(ver);
00071     status = RtlGetVersion( (PRTL_OSVERSIONINFOW)&ver );
00072     if (status != STATUS_SUCCESS) return status;
00073 
00074     if(!(TypeMask && ConditionMask)) return STATUS_INVALID_PARAMETER;
00075 
00076     if(TypeMask & VER_PRODUCT_TYPE)
00077     {
00078         status = version_compare_values(ver.wProductType, VersionInfo->wProductType, ConditionMask >> 7 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
00079         if (status != STATUS_SUCCESS)
00080             return status;
00081     }
00082     if(TypeMask & VER_SUITENAME)
00083     {
00084         switch(ConditionMask >> 6 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK)
00085         {
00086             case VER_AND:
00087                 if((VersionInfo->wSuiteMask & ver.wSuiteMask) != VersionInfo->wSuiteMask)
00088                     return STATUS_REVISION_MISMATCH;
00089                 break;
00090             case VER_OR:
00091                 if(!(VersionInfo->wSuiteMask & ver.wSuiteMask) && VersionInfo->wSuiteMask)
00092                     return STATUS_REVISION_MISMATCH;
00093                 break;
00094             default:
00095                 return STATUS_INVALID_PARAMETER;
00096         }
00097     }
00098     if(TypeMask & VER_PLATFORMID)
00099     {
00100         status = version_compare_values(ver.dwPlatformId, VersionInfo->dwPlatformId, ConditionMask >> 3 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
00101         if (status != STATUS_SUCCESS)
00102             return status;
00103     }
00104     if(TypeMask & VER_BUILDNUMBER)
00105     {
00106         status = version_compare_values(ver.dwBuildNumber, VersionInfo->dwBuildNumber, ConditionMask >> 2 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
00107         if (status != STATUS_SUCCESS)
00108             return status;
00109     }
00110     if(TypeMask & (VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR|VER_SERVICEPACKMINOR))
00111     {
00112         unsigned char condition = 0;
00113         BOOLEAN do_next_check = TRUE;
00114 
00115         if(TypeMask & VER_MAJORVERSION)
00116             condition = ConditionMask >> 1 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
00117         else if(TypeMask & VER_MINORVERSION)
00118             condition = ConditionMask >> 0 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
00119         else if(TypeMask & VER_SERVICEPACKMAJOR)
00120             condition = ConditionMask >> 5 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
00121         else if(TypeMask & VER_SERVICEPACKMINOR)
00122             condition = ConditionMask >> 4 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
00123 
00124         if(TypeMask & VER_MAJORVERSION)
00125         {
00126             status = version_compare_values(ver.dwMajorVersion, VersionInfo->dwMajorVersion, condition);
00127             do_next_check = (ver.dwMajorVersion == VersionInfo->dwMajorVersion) &&
00128                 ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
00129         }
00130         if((TypeMask & VER_MINORVERSION) && do_next_check)
00131         {
00132             status = version_compare_values(ver.dwMinorVersion, VersionInfo->dwMinorVersion, condition);
00133             do_next_check = (ver.dwMinorVersion == VersionInfo->dwMinorVersion) &&
00134                 ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
00135         }
00136         if((TypeMask & VER_SERVICEPACKMAJOR) && do_next_check)
00137         {
00138             status = version_compare_values(ver.wServicePackMajor, VersionInfo->wServicePackMajor, condition);
00139             do_next_check = (ver.wServicePackMajor == VersionInfo->wServicePackMajor) &&
00140                 ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
00141         }
00142         if((TypeMask & VER_SERVICEPACKMINOR) && do_next_check)
00143         {
00144             status = version_compare_values(ver.wServicePackMinor, VersionInfo->wServicePackMinor, condition);
00145         }
00146 
00147         if (status != STATUS_SUCCESS)
00148             return status;
00149     }
00150 
00151     return STATUS_SUCCESS;
00152 }
00153 
00154 /*
00155  * @implemented
00156  */
00157 ULONGLONG NTAPI
00158 VerSetConditionMask(IN ULONGLONG dwlConditionMask,
00159                     IN DWORD dwTypeBitMask,
00160                     IN BYTE dwConditionMask)
00161 {
00162   if(dwTypeBitMask == 0)
00163     return dwlConditionMask;
00164 
00165   dwConditionMask &= VER_CONDITION_MASK;
00166 
00167   if(dwConditionMask == 0)
00168     return dwlConditionMask;
00169 
00170   if(dwTypeBitMask & VER_PRODUCT_TYPE)
00171     dwlConditionMask |= dwConditionMask << 7 * VER_NUM_BITS_PER_CONDITION_MASK;
00172   else if(dwTypeBitMask & VER_SUITENAME)
00173     dwlConditionMask |= dwConditionMask << 6 * VER_NUM_BITS_PER_CONDITION_MASK;
00174   else if(dwTypeBitMask & VER_SERVICEPACKMAJOR)
00175     dwlConditionMask |= dwConditionMask << 5 * VER_NUM_BITS_PER_CONDITION_MASK;
00176   else if(dwTypeBitMask & VER_SERVICEPACKMINOR)
00177     dwlConditionMask |= dwConditionMask << 4 * VER_NUM_BITS_PER_CONDITION_MASK;
00178   else if(dwTypeBitMask & VER_PLATFORMID)
00179     dwlConditionMask |= dwConditionMask << 3 * VER_NUM_BITS_PER_CONDITION_MASK;
00180   else if(dwTypeBitMask & VER_BUILDNUMBER)
00181     dwlConditionMask |= dwConditionMask << 2 * VER_NUM_BITS_PER_CONDITION_MASK;
00182   else if(dwTypeBitMask & VER_MAJORVERSION)
00183     dwlConditionMask |= dwConditionMask << 1 * VER_NUM_BITS_PER_CONDITION_MASK;
00184   else if(dwTypeBitMask & VER_MINORVERSION)
00185     dwlConditionMask |= dwConditionMask << 0 * VER_NUM_BITS_PER_CONDITION_MASK;
00186 
00187   return dwlConditionMask;
00188 }
00189 
00190 /* EOF */

Generated on Sat May 26 2012 04:18:05 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.