[NTOSKRNL][NTDLL][RTL][KERNEL32]
authorThomas Faber <thomas.faber@reactos.org>
Thu, 20 Sep 2012 19:53:14 +0000 (19:53 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Thu, 20 Sep 2012 19:53:14 +0000 (19:53 +0000)
- Code simplification and clarification for version-reporting functionality. Patch by Hermès Bélusca (1/X)
CORE-6611

svn path=/trunk/; revision=57354

reactos/dll/ntdll/rtl/version.c
reactos/dll/win32/kernel32/client/version.c
reactos/include/psdk/ntverp.h
reactos/lib/rtl/version.c
reactos/ntoskrnl/ex/init.c
reactos/ntoskrnl/mm/ARM3/mminit.c
reactos/ntoskrnl/rtl/misc.c

index c55db1a..ce832c3 100644 (file)
@@ -3,7 +3,7 @@
  * PROJECT:         ReactOS system libraries
  * FILE:            lib/ntdll/rtl/process.c
  * PURPOSE:         Process functions
- * PROGRAMMER:      Ariadne ( ariadne@xs4all.nl)
+ * PROGRAMMER:      Ariadne (ariadne@xs4all.nl)
  * UPDATE HISTORY:
  *                  Created 01/11/98
  */
@@ -31,9 +31,9 @@
  *
  * NOTE
  *     ProductType can be one of the following values:
- *       1     Workstation (Winnt)
- *       2     Server (Lanmannt)
- *       3     Advanced Server (Servernt)
+ *       1     Workstation (WinNT)
+ *       2     Server (LanmanNT)
+ *       3     Advanced Server (ServerNT)
  *
  * REVISIONS
  *     2000-08-10 ekohl
@@ -56,46 +56,48 @@ RtlGetNtProductType(PNT_PRODUCT_TYPE ProductType)
  *     Get the version numbers of the run time library.
  *
  * ARGUMENTS
- *     major [OUT]     Destination for the Major version
- *     minor [OUT]     Destination for the Minor version
- *     build [OUT]     Destination for the Build version
+ *     pdwMajorVersion [OUT]   Destination for the Major version
+ *     pdwMinorVersion [OUT]   Destination for the Minor version
+ *     pdwBuildNumber  [OUT]   Destination for the Build version
  *
  * RETURN VALUE
  *     Nothing.
  *
- * NOTE
- *     Introduced in Windows XP (NT5.1)
+ * NOTES
+ *     - Introduced in Windows XP (NT 5.1)
+ *     - Since this call didn't exist before XP, we report at least the version
+ *       5.1. This fixes the loading of msvcrt.dll as released with XP Home,
+ *       which fails in DLLMain() if the major version isn't 5.
  *
  * @implemented
  */
 
-void NTAPI
-RtlGetNtVersionNumbers(LPDWORD major, LPDWORD minor, LPDWORD build)
+VOID NTAPI
+RtlGetNtVersionNumbers(OUT LPDWORD pdwMajorVersion,
+                       OUT LPDWORD pdwMinorVersion,
+                       OUT LPDWORD pdwBuildNumber)
 {
-       PPEB pPeb = NtCurrentPeb();
-
-       if (major)
-       {
-               /* msvcrt.dll as released with XP Home fails in DLLMain() if the
-                * major version is not 5. So, we should never set a version < 5 ...
-                * This makes sense since this call didn't exist before XP anyway.
-                */
-               *major = pPeb->OSMajorVersion < 5 ? 5 : pPeb->OSMajorVersion;
-       }
-
-       if (minor)
-       {
-               if (pPeb->OSMinorVersion <= 5)
-                       *minor = pPeb->OSMinorVersion < 1 ? 1 : pPeb->OSMinorVersion;
-               else
-                       *minor = pPeb->OSMinorVersion;
-       }
-
-       if (build)
-       {
-               /* FIXME: Does anybody know the real formula? */
-               *build = (0xF0000000 | pPeb->OSBuildNumber);
-       }
+    PPEB pPeb = NtCurrentPeb();
+
+    if (pdwMajorVersion)
+    {
+        *pdwMajorVersion = pPeb->OSMajorVersion < 5 ? 5 : pPeb->OSMajorVersion;
+    }
+
+    if (pdwMinorVersion)
+    {
+        if ( (pPeb->OSMajorVersion  < 5) ||
+            ((pPeb->OSMajorVersion == 5) && (pPeb->OSMinorVersion < 1)) )
+            *pdwMinorVersion = 1;
+        else
+            *pdwMinorVersion = pPeb->OSMinorVersion;
+    }
+
+    if (pdwBuildNumber)
+    {
+        /* Windows really does this! */
+        *pdwBuildNumber = (0xF0000000 | pPeb->OSBuildNumber);
+    }
 }
 
 /*
@@ -134,7 +136,7 @@ RtlGetVersion(RTL_OSVERSIONINFOW *Info)
          RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)Info;
          InfoEx->wServicePackMajor = (Peb->OSCSDVersion >> 8) & 0xFF;
          InfoEx->wServicePackMinor = Peb->OSCSDVersion & 0xFF;
-         InfoEx->wSuiteMask = SharedUserData->SuiteMask;
+         InfoEx->wSuiteMask = SharedUserData->SuiteMask & 0xFFFF;
          InfoEx->wProductType = SharedUserData->NtProductType;
       }
 
index f1757af..e830308 100644 (file)
@@ -73,12 +73,11 @@ WINAPI
 GetVersion(VOID)
 {
     PPEB Peb = NtCurrentPeb();
-    DWORD Result;
 
-    Result = MAKELONG(MAKEWORD(Peb->OSMajorVersion, Peb->OSMinorVersion),
-                      (Peb->OSPlatformId ^ 2) << 14);
-    Result |= LOWORD(Peb->OSBuildNumber) << 16;
-    return Result;
+    return (DWORD)( ((Peb->OSPlatformId ^ 2) << 30) |
+                     (Peb->OSBuildNumber     << 16) |
+                     (Peb->OSMinorVersion    << 8 ) |
+                      Peb->OSMajorVersion );
 }
 
 /*
index e892c63..d52f29e 100644 (file)
@@ -9,7 +9,7 @@
  *                  The VER_PRODUCTBUILD lines must contain the product
  *                  comments and end with the build#<CR><LF>.
  *                  The VER_PRODUCTBETA_STR lines must contain the product
- *                  comments and end with "somestring"<CR><LF.
+ *                  comments and end with "somestring"<CR><LF>.
  * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
  */
 
index e467d3d..f29d3d4 100644 (file)
@@ -1,4 +1,5 @@
-/* COPYRIGHT:       See COPYING in the top level directory
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS system libraries
  * PURPOSE:         Runtime code
  * FILE:            lib/rtl/version.c
@@ -22,28 +23,25 @@ RtlGetVersion(
 
 /* FUNCTIONS ****************************************************************/
 
-static inline NTSTATUS version_compare_values(ULONG left, ULONG right, UCHAR condition)
+static BOOLEAN
+RtlpVerCompare(ULONG left, ULONG right, UCHAR condition)
 {
-    switch (condition) {
+    switch (condition)
+    {
         case VER_EQUAL:
-            if (left != right) return STATUS_REVISION_MISMATCH;
-            break;
+            return (left == right);
         case VER_GREATER:
-            if (left <= right) return STATUS_REVISION_MISMATCH;
-            break;
+            return (left > right);
         case VER_GREATER_EQUAL:
-            if (left < right) return STATUS_REVISION_MISMATCH;
-            break;
+            return (left >= right);
         case VER_LESS:
-            if (left >= right) return STATUS_REVISION_MISMATCH;
-            break;
+            return (left < right);
         case VER_LESS_EQUAL:
-            if (left > right) return STATUS_REVISION_MISMATCH;
-            break;
+            return (left <= right);
         default:
-            return STATUS_REVISION_MISMATCH;
+            break;
     }
-    return STATUS_SUCCESS;
+    return FALSE;
 }
 
 /*
@@ -59,6 +57,7 @@ RtlVerifyVersionInfo(
 {
     RTL_OSVERSIONINFOEXW ver;
     NTSTATUS status;
+    BOOLEAN comparison;
 
     /* FIXME:
         - Check the following special case on Windows (various versions):
@@ -71,81 +70,104 @@ RtlVerifyVersionInfo(
     status = RtlGetVersion( (PRTL_OSVERSIONINFOW)&ver );
     if (status != STATUS_SUCCESS) return status;
 
-    if(!(TypeMask && ConditionMask)) return STATUS_INVALID_PARAMETER;
+    if (!TypeMask || !ConditionMask) return STATUS_INVALID_PARAMETER;
 
-    if(TypeMask & VER_PRODUCT_TYPE)
+    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;
+        comparison = RtlpVerCompare(ver.wProductType,
+                                    VersionInfo->wProductType,
+                                    ConditionMask >> 7 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
+        if (!comparison)
+            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 (ConditionMask >> 6 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK)
         {
             case VER_AND:
-                if((VersionInfo->wSuiteMask & ver.wSuiteMask) != VersionInfo->wSuiteMask)
+                if ((VersionInfo->wSuiteMask & ver.wSuiteMask) != VersionInfo->wSuiteMask)
+                {
                     return STATUS_REVISION_MISMATCH;
+                }
                 break;
             case VER_OR:
-                if(!(VersionInfo->wSuiteMask & ver.wSuiteMask) && VersionInfo->wSuiteMask)
+                if (!(VersionInfo->wSuiteMask & ver.wSuiteMask) && VersionInfo->wSuiteMask)
+                {
                     return STATUS_REVISION_MISMATCH;
+                }
                 break;
             default:
                 return STATUS_INVALID_PARAMETER;
         }
     }
-    if(TypeMask & VER_PLATFORMID)
+
+    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;
+        comparison = RtlpVerCompare(ver.dwPlatformId,
+                                    VersionInfo->dwPlatformId,
+                                    ConditionMask >> 3 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
+        if (!comparison)
+            return STATUS_REVISION_MISMATCH;
     }
-    if(TypeMask & VER_BUILDNUMBER)
+
+    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;
+        comparison = RtlpVerCompare(ver.dwBuildNumber,
+                                    VersionInfo->dwBuildNumber,
+                                    ConditionMask >> 2 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK);
+        if (!comparison)
+            return STATUS_REVISION_MISMATCH;
     }
-    if(TypeMask & (VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR|VER_SERVICEPACKMINOR))
+
+    if (TypeMask & (VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR|VER_SERVICEPACKMINOR))
     {
-        unsigned char condition = 0;
+        UCHAR condition = 0;
         BOOLEAN do_next_check = TRUE;
 
-        if(TypeMask & VER_MAJORVERSION)
+        if (TypeMask & VER_MAJORVERSION)
             condition = ConditionMask >> 1 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
-        else if(TypeMask & VER_MINORVERSION)
+        else if (TypeMask & VER_MINORVERSION)
             condition = ConditionMask >> 0 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
-        else if(TypeMask & VER_SERVICEPACKMAJOR)
+        else if (TypeMask & VER_SERVICEPACKMAJOR)
             condition = ConditionMask >> 5 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
-        else if(TypeMask & VER_SERVICEPACKMINOR)
+        else if (TypeMask & VER_SERVICEPACKMINOR)
             condition = ConditionMask >> 4 * VER_NUM_BITS_PER_CONDITION_MASK & VER_CONDITION_MASK;
 
-        if(TypeMask & VER_MAJORVERSION)
+        comparison = TRUE;
+        if (TypeMask & VER_MAJORVERSION)
         {
-            status = version_compare_values(ver.dwMajorVersion, VersionInfo->dwMajorVersion, condition);
+            comparison = RtlpVerCompare(ver.dwMajorVersion,
+                                        VersionInfo->dwMajorVersion,
+                                        condition);
             do_next_check = (ver.dwMajorVersion == VersionInfo->dwMajorVersion) &&
-                ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
+                ((condition != VER_EQUAL) || comparison);
         }
-        if((TypeMask & VER_MINORVERSION) && do_next_check)
+        if ((TypeMask & VER_MINORVERSION) && do_next_check)
         {
-            status = version_compare_values(ver.dwMinorVersion, VersionInfo->dwMinorVersion, condition);
+            comparison = RtlpVerCompare(ver.dwMinorVersion,
+                                        VersionInfo->dwMinorVersion,
+                                        condition);
             do_next_check = (ver.dwMinorVersion == VersionInfo->dwMinorVersion) &&
-                ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
+                ((condition != VER_EQUAL) || comparison);
         }
-        if((TypeMask & VER_SERVICEPACKMAJOR) && do_next_check)
+        if ((TypeMask & VER_SERVICEPACKMAJOR) && do_next_check)
         {
-            status = version_compare_values(ver.wServicePackMajor, VersionInfo->wServicePackMajor, condition);
+            comparison = RtlpVerCompare(ver.wServicePackMajor,
+                                        VersionInfo->wServicePackMajor,
+                                        condition);
             do_next_check = (ver.wServicePackMajor == VersionInfo->wServicePackMajor) &&
-                ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
+                ((condition != VER_EQUAL) || comparison);
         }
-        if((TypeMask & VER_SERVICEPACKMINOR) && do_next_check)
+        if ((TypeMask & VER_SERVICEPACKMINOR) && do_next_check)
         {
-            status = version_compare_values(ver.wServicePackMinor, VersionInfo->wServicePackMinor, condition);
+            comparison = RtlpVerCompare(ver.wServicePackMinor,
+                                        VersionInfo->wServicePackMinor,
+                                        condition);
         }
 
-        if (status != STATUS_SUCCESS)
-            return status;
+        if (!comparison)
+            return STATUS_REVISION_MISMATCH;
     }
 
     return STATUS_SUCCESS;
index 847ddc3..4006494 100644 (file)
@@ -1077,15 +1077,16 @@ ExpInitializeExecutive(IN ULONG Cpu,
     CmGetSystemControlValues(LoaderBlock->RegistryBase, CmControlVector);
 
     /* Load static defaults for Service Pack 1 and add our SVN revision */
+    /* Format of CSD : SPMajor - SPMinor */
     CmNtCSDVersion = 0x100 | (KERNEL_VERSION_BUILD_HEX << 16);
     CmNtCSDReleaseType = 0;
 
     /* Set Service Pack data for Service Pack 1 */
-    CmNtSpBuildNumber = 1830;
+    CmNtSpBuildNumber = VER_PRODUCTBUILD_QFE;
     if (!(CmNtCSDVersion & 0xFFFF0000))
     {
         /* Check the release type */
-        if (CmNtCSDReleaseType == 1) CmNtSpBuildNumber |= 1830 << 16;
+        if (CmNtCSDReleaseType == 1) CmNtSpBuildNumber |= VER_PRODUCTBUILD_QFE << 16;
     }
 
     /* Add loaded CmNtGlobalFlag value */
index 8b7e87e..a5e6f9c 100644 (file)
@@ -2398,7 +2398,7 @@ MmArmInitSystem(IN ULONG Phase,
         }
         else
         {
-            /* Check for LanMan server */
+            /* Check for LanMan server (La for LanmanNT) */
             if (MmProductType == '\0a\0L')
             {
                 /* This is a domain controller */
@@ -2406,7 +2406,7 @@ MmArmInitSystem(IN ULONG Phase,
             }
             else
             {
-                /* Otherwise it must be a normal server */
+                /* Otherwise it must be a normal server (Se for ServerNT) */
                 SharedUserData->NtProductType = NtProductServer;
             }
 
index 01665c5..2ad6931 100644 (file)
@@ -67,7 +67,7 @@ RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
          RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)lpVersionInformation;
          InfoEx->wServicePackMajor = (USHORT)(CmNtCSDVersion >> 8) & 0xFF;
          InfoEx->wServicePackMinor = (USHORT)(CmNtCSDVersion & 0xFF);
-         InfoEx->wSuiteMask = (USHORT)SharedUserData->SuiteMask;
+         InfoEx->wSuiteMask = (USHORT)(SharedUserData->SuiteMask & 0xFFFF);
          InfoEx->wProductType = SharedUserData->NtProductType;
       }