[KERNEL32/NTDLL]
[reactos.git] / reactos / dll / ntdll / rtl / version.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 */