00219 :
00220
00221 VersionInfo - a version structure containing
the comparison data
00222 TypeMask - a mask comtaining
the data types to look at
00223 ConditionMask - a mask containing conditionals
for doing
the comparisons
00224
00225
00226 Return Value:
00227
00228 STATUS_INVALID_PARAMETER
if the parameters are not valid.
00229 STATUS_REVISION_MISMATCH
if the versions don'
t match.
00230 STATUS_SUCCESS
if the versions match.
00231
00232 --*/
00233
00234 {
00235 ULONG i;
00236 OSVERSIONINFOEXW CurrVersion;
00237 BOOLEAN SuiteFound =
FALSE;
00238 BOOLEAN Equal;
00239
NTSTATUS Status;
00240 ULONG Condition;
00241
00242
00243
if (TypeMask == 0) {
00244
return STATUS_INVALID_PARAMETER;
00245 }
00246
00247 RtlZeroMemory( &CurrVersion,
sizeof(OSVERSIONINFOEXW) );
00248 CurrVersion.dwOSVersionInfoSize =
sizeof(OSVERSIONINFOEXW);
00249
00250
Status =
RtlGetVersion((PRTL_OSVERSIONINFOW)&CurrVersion);
00251
if (
Status != STATUS_SUCCESS)
00252
return Status;
00253
00254
if (VersionInfo->wSuiteMask != 0) {
00255
for (i=0; i<16; i++) {
00256
if (VersionInfo->wSuiteMask&(1<<i)) {
00257
switch (
RTL_GET_CONDITION(ConditionMask,VER_SUITENAME)) {
00258
case VER_AND:
00259
if (!(CurrVersion.wSuiteMask&(1<<i))) {
00260
return STATUS_REVISION_MISMATCH;
00261 }
00262
break;
00263
00264
case VER_OR:
00265
if (CurrVersion.wSuiteMask&(1<<i)) {
00266 SuiteFound =
TRUE;
00267 }
00268
break;
00269
00270
default:
00271
return STATUS_INVALID_PARAMETER;
00272 }
00273 }
00274 }
00275
if ((
RtlpVerGetConditionMask(ConditionMask,VER_SUITENAME) == VER_OR) && (SuiteFound ==
FALSE)) {
00276
return STATUS_REVISION_MISMATCH;
00277 }
00278 }
00279
00280 Equal =
TRUE;
00281 Condition = VER_EQUAL;
00282
if (TypeMask & VER_MAJORVERSION) {
00283 Condition =
RTL_GET_CONDITION( ConditionMask, VER_MAJORVERSION);
00284
if (
RtlpVerCompare(
00285 Condition,
00286 VersionInfo->dwMajorVersion,
00287 CurrVersion.dwMajorVersion,
00288 &Equal,
00289 0
00290 ) ==
FALSE)
00291 {
00292
if (!Equal) {
00293
return STATUS_REVISION_MISMATCH;
00294 }
00295 }
00296 }
00297
00298
if (Equal) {
00299
ASSERT(Condition);
00300
if (TypeMask & VER_MINORVERSION) {
00301
if (Condition == VER_EQUAL) {
00302 Condition =
RTL_GET_CONDITION(ConditionMask, VER_MINORVERSION);
00303 }
00304
if (
RtlpVerCompare(
00305 Condition,
00306 VersionInfo->dwMinorVersion,
00307 CurrVersion.dwMinorVersion,
00308 &Equal,
00309 LEXICAL_COMPARISON
00310 ) ==
FALSE)
00311 {
00312
if (!Equal) {
00313
return STATUS_REVISION_MISMATCH;
00314 }
00315 }
00316 }
00317
00318
if (Equal) {
00319
if (TypeMask & VER_SERVICEPACKMAJOR) {
00320
if (Condition == VER_EQUAL) {
00321 Condition =
RTL_GET_CONDITION(ConditionMask, VER_SERVICEPACKMAJOR);
00322 }
00323
if (
RtlpVerCompare(
00324 Condition,
00325 VersionInfo->wServicePackMajor,
00326 CurrVersion.wServicePackMajor,
00327 &Equal,
00328 0
00329 ) ==
FALSE)
00330 {
00331
if (!Equal) {
00332
return STATUS_REVISION_MISMATCH;
00333 }
00334 }
00335 }
00336
if (Equal) {
00337
if (TypeMask & VER_SERVICEPACKMINOR) {
00338
if (Condition == VER_EQUAL) {
00339 Condition =
RTL_GET_CONDITION(ConditionMask, VER_SERVICEPACKMINOR);
00340 }
00341
if (
RtlpVerCompare(
00342 Condition,
00343 (ULONG)VersionInfo->wServicePackMinor,
00344 (ULONG)CurrVersion.wServicePackMinor,
00345 &Equal,
00346 LEXICAL_COMPARISON
00347 ) ==
FALSE)
00348 {
00349
return STATUS_REVISION_MISMATCH;
00350 }
00351 }
00352 }
00353 }
00354 }
00355
00356
if ((TypeMask & VER_BUILDNUMBER) &&
00357
RtlpVerCompare(
00358
RTL_GET_CONDITION( ConditionMask, VER_BUILDNUMBER),
00359 VersionInfo->dwBuildNumber,
00360 CurrVersion.dwBuildNumber,
00361 &Equal,
00362 0
00363 ) ==
FALSE)
00364 {
00365
return STATUS_REVISION_MISMATCH;
00366 }
00367
00368
if ((TypeMask & VER_PLATFORMID) &&
00369
RtlpVerCompare(
00370
RTL_GET_CONDITION( ConditionMask, VER_PLATFORMID),
00371 VersionInfo->dwPlatformId,
00372 CurrVersion.dwPlatformId,
00373 &Equal,
00374 0
00375 ) ==
FALSE)
00376 {
00377
return STATUS_REVISION_MISMATCH;
00378 }
00379
00380
00381
if ((TypeMask & VER_PRODUCT_TYPE) &&
00382
RtlpVerCompare(
00383
RTL_GET_CONDITION( ConditionMask, VER_PRODUCT_TYPE),
00384 VersionInfo->wProductType,
00385 CurrVersion.wProductType,
00386 &Equal,
00387 0
00388 ) ==
FALSE)
00389 {
00390
return STATUS_REVISION_MISMATCH;
00391 }
00392
00393
return STATUS_SUCCESS;
00394 }