Author: hbelusca Date: Thu Nov 1 12:52:34 2012 New Revision: 57662
URL: http://svn.reactos.org/svn/reactos?rev=57662&view=rev Log: [KERNEL32/NTDLL] - 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.
Modified: trunk/reactos/dll/ntdll/rtl/version.c trunk/reactos/dll/win32/kernel32/client/version.c trunk/reactos/lib/rtl/version.c trunk/reactos/ntoskrnl/mm/ARM3/procsup.c trunk/reactos/ntoskrnl/rtl/misc.c
Modified: trunk/reactos/dll/ntdll/rtl/version.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/rtl/version.c?rev... ============================================================================== --- trunk/reactos/dll/ntdll/rtl/version.c [iso-8859-1] (original) +++ trunk/reactos/dll/ntdll/rtl/version.c [iso-8859-1] Thu Nov 1 12:52:34 2012 @@ -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 @@ -40,12 +91,11 @@ * * @implemented */ - BOOLEAN NTAPI RtlGetNtProductType(PNT_PRODUCT_TYPE ProductType) { - *ProductType = SharedUserData->NtProductType; - return(TRUE); + *ProductType = SharedUserData->NtProductType; + return TRUE; }
/********************************************************************** @@ -71,7 +121,6 @@ * * @implemented */ - VOID NTAPI RtlGetNtVersionNumbers(OUT LPDWORD pdwMajorVersion, OUT LPDWORD pdwMinorVersion, @@ -101,49 +150,56 @@ }
/* -* @implemented -*/ + * @implemented + * @note User-mode version of RtlGetVersion in ntoskrnl/rtl/misc.c + */ NTSTATUS NTAPI -RtlGetVersion(RTL_OSVERSIONINFOW *Info) -{ - 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) +RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation) +{ + 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 */
Modified: trunk/reactos/dll/win32/kernel32/client/version.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/v... ============================================================================== --- trunk/reactos/dll/win32/kernel32/client/version.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/client/version.c [iso-8859-1] Thu Nov 1 12:52:34 2012 @@ -13,57 +13,6 @@ #include <debug.h>
/* 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 @@ { lpVersionInformationEx = (PVOID)lpVersionInformation; lpVersionInformationEx->wReserved = 0; - - /* ReactOS specific changes */ - SetRosSpecificInfo(lpVersionInformationEx); }
return TRUE;
Modified: trunk/reactos/lib/rtl/version.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/version.c?rev=57662... ============================================================================== --- trunk/reactos/lib/rtl/version.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/version.c [iso-8859-1] Thu Nov 1 12:52:34 2012 @@ -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 @@ */ 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;
Modified: trunk/reactos/ntoskrnl/mm/ARM3/procsup.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/procsup.c?... ============================================================================== --- trunk/reactos/ntoskrnl/mm/ARM3/procsup.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/ARM3/procsup.c [iso-8859-1] Thu Nov 1 12:52:34 2012 @@ -678,7 +678,7 @@ 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;
//
Modified: trunk/reactos/ntoskrnl/rtl/misc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/rtl/misc.c?rev=576... ============================================================================== --- trunk/reactos/ntoskrnl/rtl/misc.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/rtl/misc.c [iso-8859-1] Thu Nov 1 12:52:34 2012 @@ -29,9 +29,8 @@ NTAPI RtlGetNtGlobalFlags(VOID) { - return(NtGlobalFlag); + return NtGlobalFlag; } -
/* * @implemented @@ -39,41 +38,46 @@ 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) { - /* null-terminate if it was overflowed */ - lpVersionInformation->szCSDVersion[MaxLength] = L'\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(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; - } + if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + { + 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; + }
- return STATUS_INVALID_PARAMETER; + return STATUS_SUCCESS; + } + + return STATUS_INVALID_PARAMETER; }
+/* EOF */