From 8ba1ca638e8fff6b3d755b47aeecfa3b99dfa3b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Thu, 1 Nov 2012 12:52:34 +0000 Subject: [PATCH] [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. svn path=/trunk/; revision=57662 --- reactos/dll/ntdll/rtl/version.c | 138 ++++++++++++++------ reactos/dll/win32/kernel32/client/version.c | 54 -------- reactos/lib/rtl/version.c | 14 +- reactos/ntoskrnl/mm/ARM3/procsup.c | 2 +- reactos/ntoskrnl/rtl/misc.c | 72 +++++----- 5 files changed, 141 insertions(+), 139 deletions(-) diff --git a/reactos/dll/ntdll/rtl/version.c b/reactos/dll/ntdll/rtl/version.c index ce832c3e4fc..66193febb70 100644 --- a/reactos/dll/ntdll/rtl/version.c +++ b/reactos/dll/ntdll/rtl/version.c @@ -8,13 +8,64 @@ * Created 01/11/98 */ -/* INCLUDES ****************************************************************/ +/* INCLUDES *******************************************************************/ #include #define NDEBUG #include -/* 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 @@ 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; + LONG i, MaxLength; - if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || - Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) - { - PPEB Peb = NtCurrentPeb(); + if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || + lpVersionInformation->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) + 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; - } + 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; - return STATUS_INVALID_PARAMETER; + /* HACK: ReactOS specific changes, see bug-reports CORE-6611 and CORE-4620 (aka. #5003) */ + SetRosSpecificInfo(InfoEx); + } + + return STATUS_SUCCESS; + } + + return STATUS_INVALID_PARAMETER; } /* EOF */ diff --git a/reactos/dll/win32/kernel32/client/version.c b/reactos/dll/win32/kernel32/client/version.c index e8303086bb8..c0afdbf9ce5 100644 --- a/reactos/dll/win32/kernel32/client/version.c +++ b/reactos/dll/win32/kernel32/client/version.c @@ -14,57 +14,6 @@ /* 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; diff --git a/reactos/lib/rtl/version.c b/reactos/lib/rtl/version.c index e81509cd96f..b2e82108a62 100644 --- a/reactos/lib/rtl/version.c +++ b/reactos/lib/rtl/version.c @@ -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; diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index ae5d496e9f9..27660f72180 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -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; // diff --git a/reactos/ntoskrnl/rtl/misc.c b/reactos/ntoskrnl/rtl/misc.c index 2ad6931fda7..d7c09b1b9b7 100644 --- a/reactos/ntoskrnl/rtl/misc.c +++ b/reactos/ntoskrnl/rtl/misc.c @@ -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) { - /* 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 */