From 1f8570be622dcd758fb8287a488c27e0cc94e2a9 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Tue, 13 Aug 2013 03:14:22 +0000 Subject: [PATCH] [NTOSKRNL]: RtlGetVersion in the kernel does not fail, does not return a CSD version, and should not be returning negative build numbers. Fix it so that it works as it should (and anyone that relied on correct build numbers will no longer fail). svn path=/trunk/; revision=59717 --- reactos/ntoskrnl/rtl/misc.c | 60 +++++++++++++------------------------ 1 file changed, 21 insertions(+), 39 deletions(-) diff --git a/reactos/ntoskrnl/rtl/misc.c b/reactos/ntoskrnl/rtl/misc.c index d7c09b1b9b7..1b885498aa0 100644 --- a/reactos/ntoskrnl/rtl/misc.c +++ b/reactos/ntoskrnl/rtl/misc.c @@ -33,51 +33,33 @@ RtlGetNtGlobalFlags(VOID) } /* -* @implemented -*/ -NTSTATUS NTAPI + * @implemented + */ +NTSTATUS +NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation) { - LONG i; - ULONG MaxLength; + PAGED_CODE(); - if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || - lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + /* Return the basics */ + lpVersionInformation->dwMajorVersion = NtMajorVersion; + lpVersionInformation->dwMinorVersion = NtMinorVersion; + lpVersionInformation->dwBuildNumber = NtBuildNumber & 0x3FFF; + lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT; + + /* Check if this is the extended version */ + if (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)) - { - 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_SUCCESS; + 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; + /* Always succeed */ + return STATUS_SUCCESS; } /* EOF */