Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenversion.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
1.7.6.1
|