diff --git a/reactos/dll/win32/kernel32/misc/version.c b/reactos/dll/win32/kernel32/misc/version.c index 67e96b3f196..101eec116c3 100644 --- a/reactos/dll/win32/kernel32/misc/version.c +++ b/reactos/dll/win32/kernel32/misc/version.c @@ -1,12 +1,9 @@ -/* $Id$ - * +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries - * FILE: lib/kernel32/misc/version.c + * FILE: dll/win32/kernel32/misc/version.c * PURPOSE: Version functions - * PROGRAMMER: Ariadne ( ariadne@xs4all.nl) - * UPDATE HISTORY: - * Created 01/11/98 + * PROGRAMMER: Ariadne (ariadne@xs4all.nl) */ #include @@ -28,21 +25,21 @@ DWORD WINAPI GetVersion(VOID) { - PPEB pPeb = NtCurrentPeb(); - DWORD nVersion; + PPEB pPeb = NtCurrentPeb(); + DWORD nVersion; - nVersion = MAKEWORD(pPeb->OSMajorVersion, pPeb->OSMinorVersion); + nVersion = MAKEWORD(pPeb->OSMajorVersion, pPeb->OSMinorVersion); - /* behave consistently when posing as another operating system */ - /* build number */ - if(pPeb->OSPlatformId != VER_PLATFORM_WIN32_WINDOWS) - nVersion |= ((DWORD)(pPeb->OSBuildNumber)) << 16; + /* behave consistently when posing as another operating system */ + /* build number */ + if(pPeb->OSPlatformId != VER_PLATFORM_WIN32_WINDOWS) + nVersion |= ((DWORD)(pPeb->OSBuildNumber)) << 16; - /* non-NT platform flag */ - if(pPeb->OSPlatformId != VER_PLATFORM_WIN32_NT) - nVersion |= 0x80000000; + /* non-NT platform flag */ + if(pPeb->OSPlatformId != VER_PLATFORM_WIN32_NT) + nVersion |= 0x80000000; - return nVersion; + return nVersion; } /* @@ -50,126 +47,122 @@ GetVersion(VOID) */ BOOL WINAPI -GetVersionExW( - LPOSVERSIONINFOW lpVersionInformation - ) +GetVersionExW(LPOSVERSIONINFOW lpVersionInformation) { - NTSTATUS Status; + NTSTATUS Status; + + if(lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOW) && + lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOEXW)) + { + /* for some reason win sets ERROR_INSUFFICIENT_BUFFER even if it is large + enough but doesn't match the exact sizes supported, ERROR_INVALID_PARAMETER + would've been much more appropriate... */ + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return FALSE; + } + + Status = RtlGetVersion((PRTL_OSVERSIONINFOW)lpVersionInformation); + if(NT_SUCCESS(Status)) + { + int ln, maxlen; + + /* append a reactos specific string to the szCSDVersion string */ + + /* FIXME - we shouldn't do this when there is a (ros-specific) compatibility + flag set so we don't screw applications that might depend on a + certain string */ + + ln = wcslen(lpVersionInformation->szCSDVersion) + 1; + maxlen = (sizeof(lpVersionInformation->szCSDVersion) / sizeof(lpVersionInformation->szCSDVersion[0]) - 1); + if(maxlen > ln) + { + PWCHAR szVer = lpVersionInformation->szCSDVersion + ln; + RtlZeroMemory(szVer, (maxlen - ln + 1) * sizeof(WCHAR)); + wcsncpy(szVer, + L"ReactOS " UNICODIZE(KERNEL_VERSION_STR) L" (Build " UNICODIZE(KERNEL_VERSION_BUILD_STR) L")", + maxlen - ln); + } + + return TRUE; + } - if(lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOW) && - lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOEXW)) - { - /* for some reason win sets ERROR_INSUFFICIENT_BUFFER even if it is large - enough but doesn't match the exact sizes supported, ERROR_INVALID_PARAMETER - would've been much more appropriate... */ - SetLastError(ERROR_INSUFFICIENT_BUFFER); return FALSE; - } +} - Status = RtlGetVersion((PRTL_OSVERSIONINFOW)lpVersionInformation); - if(NT_SUCCESS(Status)) - { - int ln, maxlen; - /* append a reactos specific string to the szCSDVersion string */ +/* + * @implemented + */ +BOOL +WINAPI +GetVersionExA(LPOSVERSIONINFOA lpVersionInformation) +{ + OSVERSIONINFOEXW viw; - /* FIXME - we shouldn't do this when there is a (ros-specific) compatibility - flag set so we don't screw applications that might depend on a - certain string */ + RtlZeroMemory(&viw, sizeof(viw)); - ln = wcslen(lpVersionInformation->szCSDVersion) + 1; - maxlen = (sizeof(lpVersionInformation->szCSDVersion) / sizeof(lpVersionInformation->szCSDVersion[0]) - 1); - if(maxlen > ln) + switch(lpVersionInformation->dwOSVersionInfoSize) { - PWCHAR szVer = lpVersionInformation->szCSDVersion + ln; - RtlZeroMemory(szVer, (maxlen - ln + 1) * sizeof(WCHAR)); - wcsncpy(szVer, - L"ReactOS " UNICODIZE(KERNEL_VERSION_STR) L" (Build " UNICODIZE(KERNEL_VERSION_BUILD_STR) L")", - maxlen - ln); + case sizeof(OSVERSIONINFOA): + viw.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); + break; + + case sizeof(OSVERSIONINFOEXA): + viw.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); + break; + + default: + /* for some reason win sets ERROR_INSUFFICIENT_BUFFER even if it is large + enough but doesn't match the exact sizes supported, ERROR_INVALID_PARAMETER + would've been much more appropriate... */ + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return FALSE; } - return TRUE; - } - - return FALSE; -} - - -/* - * @implemented - */ -BOOL -WINAPI -GetVersionExA( - LPOSVERSIONINFOA lpVersionInformation - ) -{ - OSVERSIONINFOEXW viw; - - RtlZeroMemory(&viw, sizeof(viw)); - - switch(lpVersionInformation->dwOSVersionInfoSize) - { - case sizeof(OSVERSIONINFOA): - viw.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); - break; - - case sizeof(OSVERSIONINFOEXA): - viw.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); - break; - - default: - /* for some reason win sets ERROR_INSUFFICIENT_BUFFER even if it is large - enough but doesn't match the exact sizes supported, ERROR_INVALID_PARAMETER - would've been much more appropriate... */ - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; - } - - if(GetVersionExW((LPOSVERSIONINFOW)&viw)) - { - ANSI_STRING CSDVersionA; - UNICODE_STRING CSDVersionW; - - /* copy back fields that match both supported structures */ - lpVersionInformation->dwMajorVersion = viw.dwMajorVersion; - lpVersionInformation->dwMinorVersion = viw.dwMinorVersion; - lpVersionInformation->dwBuildNumber = viw.dwBuildNumber; - lpVersionInformation->dwPlatformId = viw.dwPlatformId; - - /* convert the win version string */ - RtlInitUnicodeString(&CSDVersionW, viw.szCSDVersion); - - CSDVersionA.Length = 0; - CSDVersionA.MaximumLength = sizeof(lpVersionInformation->szCSDVersion); - CSDVersionA.Buffer = lpVersionInformation->szCSDVersion; - - RtlUnicodeStringToAnsiString(&CSDVersionA, &CSDVersionW, FALSE); - - /* convert the ReactOS version string */ - CSDVersionW.Buffer = viw.szCSDVersion + CSDVersionW.Length / sizeof(WCHAR) + 1; - CSDVersionW.MaximumLength = sizeof(viw.szCSDVersion) - (CSDVersionW.Length + sizeof(WCHAR)); - CSDVersionW.Length = wcslen(CSDVersionW.Buffer) * sizeof(WCHAR); - CSDVersionA.Buffer = lpVersionInformation->szCSDVersion + CSDVersionA.Length + 1; - CSDVersionA.MaximumLength = sizeof(lpVersionInformation->szCSDVersion) - (CSDVersionA.Length + 1); - CSDVersionA.Length = 0; - - RtlUnicodeStringToAnsiString(&CSDVersionA, &CSDVersionW, FALSE); - - /* copy back the extended fields */ - if(viw.dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXW)) + if(GetVersionExW((LPOSVERSIONINFOW)&viw)) { - ((LPOSVERSIONINFOEXA)lpVersionInformation)->wServicePackMajor = viw.wServicePackMajor; - ((LPOSVERSIONINFOEXA)lpVersionInformation)->wServicePackMinor = viw.wServicePackMinor; - ((LPOSVERSIONINFOEXA)lpVersionInformation)->wSuiteMask = viw.wSuiteMask; - ((LPOSVERSIONINFOEXA)lpVersionInformation)->wProductType = viw.wProductType; - ((LPOSVERSIONINFOEXA)lpVersionInformation)->wReserved = viw.wReserved; + ANSI_STRING CSDVersionA; + UNICODE_STRING CSDVersionW; + + /* copy back fields that match both supported structures */ + lpVersionInformation->dwMajorVersion = viw.dwMajorVersion; + lpVersionInformation->dwMinorVersion = viw.dwMinorVersion; + lpVersionInformation->dwBuildNumber = viw.dwBuildNumber; + lpVersionInformation->dwPlatformId = viw.dwPlatformId; + + /* convert the win version string */ + RtlInitUnicodeString(&CSDVersionW, viw.szCSDVersion); + + CSDVersionA.Length = 0; + CSDVersionA.MaximumLength = sizeof(lpVersionInformation->szCSDVersion); + CSDVersionA.Buffer = lpVersionInformation->szCSDVersion; + + RtlUnicodeStringToAnsiString(&CSDVersionA, &CSDVersionW, FALSE); + + /* convert the ReactOS version string */ + CSDVersionW.Buffer = viw.szCSDVersion + CSDVersionW.Length / sizeof(WCHAR) + 1; + CSDVersionW.MaximumLength = sizeof(viw.szCSDVersion) - (CSDVersionW.Length + sizeof(WCHAR)); + CSDVersionW.Length = wcslen(CSDVersionW.Buffer) * sizeof(WCHAR); + CSDVersionA.Buffer = lpVersionInformation->szCSDVersion + CSDVersionA.Length + 1; + CSDVersionA.MaximumLength = sizeof(lpVersionInformation->szCSDVersion) - (CSDVersionA.Length + 1); + CSDVersionA.Length = 0; + + RtlUnicodeStringToAnsiString(&CSDVersionA, &CSDVersionW, FALSE); + + /* copy back the extended fields */ + if(viw.dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXW)) + { + ((LPOSVERSIONINFOEXA)lpVersionInformation)->wServicePackMajor = viw.wServicePackMajor; + ((LPOSVERSIONINFOEXA)lpVersionInformation)->wServicePackMinor = viw.wServicePackMinor; + ((LPOSVERSIONINFOEXA)lpVersionInformation)->wSuiteMask = viw.wSuiteMask; + ((LPOSVERSIONINFOEXA)lpVersionInformation)->wProductType = viw.wProductType; + ((LPOSVERSIONINFOEXA)lpVersionInformation)->wReserved = viw.wReserved; + } + + return TRUE; } - return TRUE; - } - - return FALSE; + return FALSE; } @@ -178,32 +171,30 @@ GetVersionExA( */ BOOL WINAPI -VerifyVersionInfoW( - LPOSVERSIONINFOEXW lpVersionInformation, - DWORD dwTypeMask, - DWORDLONG dwlConditionMask - ) +VerifyVersionInfoW(LPOSVERSIONINFOEXW lpVersionInformation, + DWORD dwTypeMask, + DWORDLONG dwlConditionMask) { - NTSTATUS Status; + NTSTATUS Status; - Status = RtlVerifyVersionInfo((PRTL_OSVERSIONINFOEXW)lpVersionInformation, - dwTypeMask, - dwlConditionMask); - switch(Status) - { - case STATUS_INVALID_PARAMETER: - SetLastError(ERROR_BAD_ARGUMENTS); - return FALSE; + Status = RtlVerifyVersionInfo((PRTL_OSVERSIONINFOEXW)lpVersionInformation, + dwTypeMask, + dwlConditionMask); + switch(Status) + { + case STATUS_INVALID_PARAMETER: + SetLastError(ERROR_BAD_ARGUMENTS); + return FALSE; - case STATUS_REVISION_MISMATCH: - SetLastError(ERROR_OLD_WIN_VERSION); - return FALSE; + case STATUS_REVISION_MISMATCH: + SetLastError(ERROR_OLD_WIN_VERSION); + return FALSE; - default: - /* RtlVerifyVersionInfo shouldn't report any other failure code! */ - ASSERT(NT_SUCCESS(Status)); - return TRUE; - } + default: + /* RtlVerifyVersionInfo shouldn't report any other failure code! */ + ASSERT(NT_SUCCESS(Status)); + return TRUE; + } } @@ -212,27 +203,23 @@ VerifyVersionInfoW( */ BOOL WINAPI -VerifyVersionInfoA( - LPOSVERSIONINFOEXA lpVersionInformation, - DWORD dwTypeMask, - DWORDLONG dwlConditionMask - ) +VerifyVersionInfoA(LPOSVERSIONINFOEXA lpVersionInformation, + DWORD dwTypeMask, + DWORDLONG dwlConditionMask) { - OSVERSIONINFOEXW viex; + OSVERSIONINFOEXW viex; - viex.dwOSVersionInfoSize = sizeof(viex); - viex.dwMajorVersion = lpVersionInformation->dwMajorVersion; - viex.dwMinorVersion = lpVersionInformation->dwMinorVersion; - viex.dwBuildNumber = lpVersionInformation->dwBuildNumber; - viex.dwPlatformId = lpVersionInformation->dwPlatformId; - /* NOTE: szCSDVersion is ignored, we don't need to convert it to unicode */ - viex.wServicePackMajor = lpVersionInformation->wServicePackMajor; - viex.wServicePackMinor = lpVersionInformation->wServicePackMinor; - viex.wSuiteMask = lpVersionInformation->wSuiteMask; - viex.wProductType = lpVersionInformation->wProductType; - viex.wReserved = lpVersionInformation->wReserved; + viex.dwOSVersionInfoSize = sizeof(viex); + viex.dwMajorVersion = lpVersionInformation->dwMajorVersion; + viex.dwMinorVersion = lpVersionInformation->dwMinorVersion; + viex.dwBuildNumber = lpVersionInformation->dwBuildNumber; + viex.dwPlatformId = lpVersionInformation->dwPlatformId; + /* NOTE: szCSDVersion is ignored, we don't need to convert it to unicode */ + viex.wServicePackMajor = lpVersionInformation->wServicePackMajor; + viex.wServicePackMinor = lpVersionInformation->wServicePackMinor; + viex.wSuiteMask = lpVersionInformation->wSuiteMask; + viex.wProductType = lpVersionInformation->wProductType; + viex.wReserved = lpVersionInformation->wReserved; - return VerifyVersionInfoW(&viex, dwTypeMask, dwlConditionMask); + return VerifyVersionInfoW(&viex, dwTypeMask, dwlConditionMask); } - -/* EOF */