[KERNEL32/NTDLL]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Thu, 1 Nov 2012 12:52:34 +0000 (12:52 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Thu, 1 Nov 2012 12:52:34 +0000 (12:52 +0000)
- Move the ReactOS-specific workaround described in http://jira.reactos.org/browse/CORE-6611 and http://jira.reactos.org/browse/CORE-4620
  from kernel32 to ntdll for using it by RtlGetVersion, in order to :
  * still having it available in user-mode only,
  * and having VerifyVersionInfo (and its Rtl counter-part) working properly.

[RTL/NTOSKRNL]
- Code formatting.
- Use a defined-constant instead of a hard-coded value.

svn path=/trunk/; revision=57662

reactos/dll/ntdll/rtl/version.c
reactos/dll/win32/kernel32/client/version.c
reactos/lib/rtl/version.c
reactos/ntoskrnl/mm/ARM3/procsup.c
reactos/ntoskrnl/rtl/misc.c

index ce832c3..66193fe 100644 (file)
@@ -8,13 +8,64 @@
  *                  Created 01/11/98
  */
 
-/* INCLUDES ****************************************************************/
+/* INCLUDES *******************************************************************/
 
 #include <ntdll.h>
 #define NDEBUG
 #include <debug.h>
 
-/* FUNCTIONS ****************************************************************/
+/* FUNCTIONS ******************************************************************/
+
+/* HACK: ReactOS specific changes, see bug-reports CORE-6611 and CORE-4620 (aka. #5003) */
+static VOID NTAPI
+SetRosSpecificInfo(IN OUT PRTL_OSVERSIONINFOEXW VersionInformation)
+{
+    CHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)];
+    PKEY_VALUE_PARTIAL_INFORMATION kvpInfo = (PVOID)Buffer;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    ULONG ReportAsWorkstation = 0;
+    HANDLE hKey;
+    ULONG Length;
+    NTSTATUS Status;
+    UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\ReactOS\\Settings\\Version");
+    UNICODE_STRING ValName = RTL_CONSTANT_STRING(L"ReportAsWorkstation");
+
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_OPENIF | OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+
+    /* Don't change anything if the key doesn't exist */
+    Status = NtOpenKey(&hKey, KEY_READ, &ObjectAttributes);
+    if (NT_SUCCESS(Status))
+    {
+        /* Get the value from the registry and make sure it's a 32-bit value */
+        Status = NtQueryValueKey(hKey,
+                                 &ValName,
+                                 KeyValuePartialInformation,
+                                 kvpInfo,
+                                 sizeof(Buffer),
+                                 &Length);
+        if (NT_SUCCESS(Status) &&
+            (kvpInfo->Type == REG_DWORD) &&
+            (kvpInfo->DataLength == sizeof(ULONG)))
+        {
+            /* Is the value set? */
+            ReportAsWorkstation = *(PULONG)kvpInfo->Data;
+            if ((VersionInformation->wProductType == VER_NT_SERVER) &&
+                (ReportAsWorkstation != 0))
+            {
+                /* It is, modify the product type to report a workstation */
+                VersionInformation->wProductType = VER_NT_WORKSTATION;
+                DPRINT1("We modified the reported OS from NtProductServer to NtProductWinNt\n");
+            }
+        }
+
+        /* Close the handle */
+        NtClose(hKey);
+    }
+}
 
 /**********************************************************************
  * NAME                                                        EXPORTED
  *
  * @implemented
  */
-
 BOOLEAN NTAPI
 RtlGetNtProductType(PNT_PRODUCT_TYPE ProductType)
 {
-  *ProductType = SharedUserData->NtProductType;
-  return(TRUE);
+    *ProductType = SharedUserData->NtProductType;
+    return TRUE;
 }
 
 /**********************************************************************
@@ -71,7 +121,6 @@ RtlGetNtProductType(PNT_PRODUCT_TYPE ProductType)
  *
  * @implemented
  */
-
 VOID NTAPI
 RtlGetNtVersionNumbers(OUT LPDWORD pdwMajorVersion,
                        OUT LPDWORD pdwMinorVersion,
@@ -101,49 +150,56 @@ RtlGetNtVersionNumbers(OUT LPDWORD pdwMajorVersion,
 }
 
 /*
-* @implemented
-*/
+ * @implemented
+ * @note User-mode version of RtlGetVersion in ntoskrnl/rtl/misc.c
+ */
 NTSTATUS NTAPI
-RtlGetVersion(RTL_OSVERSIONINFOW *Info)
+RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
 {
-   LONG i, MaxLength;
-
-   if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) ||
-       Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW))
-   {
-      PPEB Peb = NtCurrentPeb();
-
-      Info->dwMajorVersion = Peb->OSMajorVersion;
-      Info->dwMinorVersion = Peb->OSMinorVersion;
-      Info->dwBuildNumber = Peb->OSBuildNumber;
-      Info->dwPlatformId = Peb->OSPlatformId;
-      RtlZeroMemory(Info->szCSDVersion, sizeof(Info->szCSDVersion));
-      if(((Peb->OSCSDVersion >> 8) & 0xFF) != 0)
-      {
-        MaxLength = (sizeof(Info->szCSDVersion) / sizeof(Info->szCSDVersion[0])) - 1;
-        i = _snwprintf(Info->szCSDVersion,
-                       MaxLength,
-                       L"Service Pack %d",
-                       ((Peb->OSCSDVersion >> 8) & 0xFF));
-        if (i < 0)
+    LONG i, MaxLength;
+
+    if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) ||
+        lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW))
+    {
+        PPEB Peb = NtCurrentPeb();
+
+        lpVersionInformation->dwMajorVersion = Peb->OSMajorVersion;
+        lpVersionInformation->dwMinorVersion = Peb->OSMinorVersion;
+        lpVersionInformation->dwBuildNumber = Peb->OSBuildNumber;
+        lpVersionInformation->dwPlatformId = Peb->OSPlatformId;
+        RtlZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion));
+
+        if(((Peb->OSCSDVersion >> 8) & 0xFF) != 0)
         {
-           /* null-terminate if it was overflowed */
-           Info->szCSDVersion[MaxLength] = L'\0';
+            MaxLength = (sizeof(lpVersionInformation->szCSDVersion) / sizeof(lpVersionInformation->szCSDVersion[0])) - 1;
+            i = _snwprintf(lpVersionInformation->szCSDVersion,
+                           MaxLength,
+                           L"Service Pack %d",
+                           ((Peb->OSCSDVersion >> 8) & 0xFF));
+            if (i < 0)
+            {
+                /* Null-terminate if it was overflowed */
+                lpVersionInformation->szCSDVersion[MaxLength] = L'\0';
+            }
         }
-      }
-      if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW))
-      {
-         RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)Info;
-         InfoEx->wServicePackMajor = (Peb->OSCSDVersion >> 8) & 0xFF;
-         InfoEx->wServicePackMinor = Peb->OSCSDVersion & 0xFF;
-         InfoEx->wSuiteMask = SharedUserData->SuiteMask & 0xFFFF;
-         InfoEx->wProductType = SharedUserData->NtProductType;
-      }
-
-      return STATUS_SUCCESS;
-   }
-
-   return STATUS_INVALID_PARAMETER;
+
+        if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW))
+        {
+            PRTL_OSVERSIONINFOEXW InfoEx = (PRTL_OSVERSIONINFOEXW)lpVersionInformation;
+            InfoEx->wServicePackMajor = (Peb->OSCSDVersion >> 8) & 0xFF;
+            InfoEx->wServicePackMinor = Peb->OSCSDVersion & 0xFF;
+            InfoEx->wSuiteMask = SharedUserData->SuiteMask & 0xFFFF;
+            InfoEx->wProductType = SharedUserData->NtProductType;
+            InfoEx->wReserved = 0;
+
+            /* HACK: ReactOS specific changes, see bug-reports CORE-6611 and CORE-4620 (aka. #5003) */
+            SetRosSpecificInfo(InfoEx);
+        }
+
+        return STATUS_SUCCESS;
+    }
+
+    return STATUS_INVALID_PARAMETER;
 }
 
 /* EOF */
index e830308..c0afdbf 100644 (file)
 
 /* FUNCTIONS ******************************************************************/
 
-VOID
-NTAPI
-SetRosSpecificInfo(IN LPOSVERSIONINFOEXW VersionInformation)
-{
-    CHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(DWORD)];
-    PKEY_VALUE_PARTIAL_INFORMATION kvpInfo = (PVOID)Buffer;
-    OBJECT_ATTRIBUTES ObjectAttributes;
-    DWORD ReportAsWorkstation = 0;
-    HANDLE hKey;
-    DWORD dwSize;
-    NTSTATUS Status;
-    UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\ReactOS\\Settings\\Version");
-    UNICODE_STRING ValName = RTL_CONSTANT_STRING(L"ReportAsWorkstation");
-
-    InitializeObjectAttributes(&ObjectAttributes,
-                               &KeyName,
-                               OBJ_OPENIF | OBJ_CASE_INSENSITIVE,
-                               NULL,
-                               NULL);
-
-    /* Don't change anything if the key doesn't exist */
-    Status = NtOpenKey(&hKey, KEY_READ, &ObjectAttributes);
-    if (NT_SUCCESS(Status))
-    {
-        /* Get the value from the registry and make sure it's a 32-bit value */
-        Status = NtQueryValueKey(hKey,
-                                 &ValName,
-                                 KeyValuePartialInformation,
-                                 kvpInfo,
-                                 sizeof(Buffer),
-                                 &dwSize);
-        if ((NT_SUCCESS(Status)) &&
-            (kvpInfo->Type == REG_DWORD) &&
-            (kvpInfo->DataLength == sizeof(DWORD)))
-        {
-            /* Is the value set? */
-            ReportAsWorkstation = *(PULONG)kvpInfo->Data;
-            if ((VersionInformation->wProductType == VER_NT_SERVER) &&
-                (ReportAsWorkstation))
-            {
-                /* It is, modify the product type to report a workstation */
-                VersionInformation->wProductType = VER_NT_WORKSTATION;
-                DPRINT1("We modified the reported OS from NtProductServer to NtProductWinNt\n");
-            }
-        }
-
-        /* Close the handle */
-        NtClose(hKey);
-     }
-}
-
 /*
  * @implemented
  */
@@ -104,9 +53,6 @@ GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
         {
             lpVersionInformationEx = (PVOID)lpVersionInformation;
             lpVersionInformationEx->wReserved = 0;
-
-            /* ReactOS specific changes */
-            SetRosSpecificInfo(lpVersionInformationEx);
         }
 
         return TRUE;
index e81509c..b2e8210 100644 (file)
@@ -4,7 +4,7 @@
  * PURPOSE:         Runtime code
  * FILE:            lib/rtl/version.c
  * PROGRAMERS:      Filip Navara
- *                  Hermes BELUSCA - MAITO
+ *                  Hermes Belusca-Maito (hermes.belusca@sfr.fr)
  */
 
 /* INCLUDES *****************************************************************/
@@ -18,9 +18,7 @@
 
 NTSTATUS
 NTAPI
-RtlGetVersion(
-    OUT PRTL_OSVERSIONINFOW lpVersionInformation
-    );
+RtlGetVersion(OUT PRTL_OSVERSIONINFOW lpVersionInformation);
 
 /* FUNCTIONS ****************************************************************/
 
@@ -54,11 +52,9 @@ RtlpVerCompare(ULONG left, ULONG right, UCHAR condition)
 */
 NTSTATUS
 NTAPI
-RtlVerifyVersionInfo(
-    IN PRTL_OSVERSIONINFOEXW VersionInfo,
-    IN ULONG TypeMask,
-    IN ULONGLONG ConditionMask
-    )
+RtlVerifyVersionInfo(IN PRTL_OSVERSIONINFOEXW VersionInfo,
+                     IN ULONG TypeMask,
+                     IN ULONGLONG ConditionMask)
 {
     RTL_OSVERSIONINFOEXW ver;
     NTSTATUS status;
index ae5d496..27660f7 100644 (file)
@@ -678,7 +678,7 @@ MmCreatePeb(IN PEPROCESS Process,
         Peb->OSMajorVersion = NtMajorVersion;
         Peb->OSMinorVersion = NtMinorVersion;
         Peb->OSBuildNumber = (USHORT)(NtBuildNumber & 0x3FFF);
-        Peb->OSPlatformId = 2; /* VER_PLATFORM_WIN32_NT */
+        Peb->OSPlatformId = VER_PLATFORM_WIN32_NT;
         Peb->OSCSDVersion = (USHORT)CmNtCSDVersion;
 
         //
index 2ad6931..d7c09b1 100644 (file)
@@ -29,51 +29,55 @@ ULONG
 NTAPI
 RtlGetNtGlobalFlags(VOID)
 {
-       return(NtGlobalFlag);
+    return NtGlobalFlag;
 }
 
-
 /*
 * @implemented
 */
 NTSTATUS NTAPI
 RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
 {
-   LONG i;
-   ULONG MaxLength;
-   if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) ||
-       lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW))
-   {
-      lpVersionInformation->dwMajorVersion = NtMajorVersion;
-      lpVersionInformation->dwMinorVersion = NtMinorVersion;
-      lpVersionInformation->dwBuildNumber = NtBuildNumber;
-      lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT;
-      RtlZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion));
-      if(((CmNtCSDVersion >> 8) & 0xFF) != 0)
-      {
-        MaxLength = (sizeof(lpVersionInformation->szCSDVersion) / sizeof(lpVersionInformation->szCSDVersion[0])) - 1;
-        i = _snwprintf(lpVersionInformation->szCSDVersion,
-                       MaxLength,
-                       L"Service Pack %d",
-                       ((CmNtCSDVersion >> 8) & 0xFF));
-        if (i < 0)
+    LONG i;
+    ULONG MaxLength;
+
+    if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) ||
+        lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW))
+    {
+        lpVersionInformation->dwMajorVersion = NtMajorVersion;
+        lpVersionInformation->dwMinorVersion = NtMinorVersion;
+        lpVersionInformation->dwBuildNumber = NtBuildNumber;
+        lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT;
+        RtlZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion));
+
+        if(((CmNtCSDVersion >> 8) & 0xFF) != 0)
+        {
+            MaxLength = (sizeof(lpVersionInformation->szCSDVersion) / sizeof(lpVersionInformation->szCSDVersion[0])) - 1;
+            i = _snwprintf(lpVersionInformation->szCSDVersion,
+                           MaxLength,
+                           L"Service Pack %d",
+                           ((CmNtCSDVersion >> 8) & 0xFF));
+            if (i < 0)
+            {
+                /* Null-terminate if it was overflowed */
+                lpVersionInformation->szCSDVersion[MaxLength] = L'\0';
+            }
+        }
+
+        if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW))
         {
-           /* null-terminate if it was overflowed */
-           lpVersionInformation->szCSDVersion[MaxLength] = L'\0';
+            PRTL_OSVERSIONINFOEXW InfoEx = (PRTL_OSVERSIONINFOEXW)lpVersionInformation;
+            InfoEx->wServicePackMajor = (USHORT)(CmNtCSDVersion >> 8) & 0xFF;
+            InfoEx->wServicePackMinor = (USHORT)(CmNtCSDVersion & 0xFF);
+            InfoEx->wSuiteMask = (USHORT)(SharedUserData->SuiteMask & 0xFFFF);
+            InfoEx->wProductType = SharedUserData->NtProductType;
+            InfoEx->wReserved = 0;
         }
-      }
-      if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXW))
-      {
-         RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)lpVersionInformation;
-         InfoEx->wServicePackMajor = (USHORT)(CmNtCSDVersion >> 8) & 0xFF;
-         InfoEx->wServicePackMinor = (USHORT)(CmNtCSDVersion & 0xFF);
-         InfoEx->wSuiteMask = (USHORT)(SharedUserData->SuiteMask & 0xFFFF);
-         InfoEx->wProductType = SharedUserData->NtProductType;
-      }
 
-      return STATUS_SUCCESS;
-   }
+        return STATUS_SUCCESS;
+    }
 
-   return STATUS_INVALID_PARAMETER;
+    return STATUS_INVALID_PARAMETER;
 }
 
+/* EOF */