+++ /dev/null
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS system libraries
- * FILE: lib/ntdll/rtl/process.c
- * PURPOSE: Process functions
- * PROGRAMMER: Ariadne (ariadne@xs4all.nl)
- * UPDATE HISTORY:
- * Created 01/11/98
- */
-
-/* INCLUDES *******************************************************************/
-
-#include <ntdll.h>
-
-#define NDEBUG
-#include <debug.h>
-
-/* 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
- * RtlGetNtProductType
- *
- * DESCRIPTION
- * Retrieves the OS product type.
- *
- * ARGUMENTS
- * ProductType Pointer to the product type variable.
- *
- * RETURN VALUE
- * TRUE if successful, otherwise FALSE
- *
- * NOTE
- * ProductType can be one of the following values:
- * 1 Workstation (WinNT)
- * 2 Server (LanmanNT)
- * 3 Advanced Server (ServerNT)
- *
- * REVISIONS
- * 2000-08-10 ekohl
- *
- * @implemented
- */
-BOOLEAN NTAPI
-RtlGetNtProductType(PNT_PRODUCT_TYPE ProductType)
-{
- *ProductType = SharedUserData->NtProductType;
- return TRUE;
-}
-
-/**********************************************************************
- * NAME EXPORTED
- * RtlGetNtVersionNumbers
- *
- * DESCRIPTION
- * Get the version numbers of the run time library.
- *
- * ARGUMENTS
- * pMajorVersion [OUT] Destination for the Major version
- * pMinorVersion [OUT] Destination for the Minor version
- * pBuildNumber [OUT] Destination for the Build version
- *
- * RETURN VALUE
- * Nothing.
- *
- * NOTES
- * - Introduced in Windows XP (NT 5.1)
- * - Since this call didn't exist before XP, we report at least the version
- * 5.1. This fixes the loading of msvcrt.dll as released with XP Home,
- * which fails in DLLMain() if the major version isn't 5.
- *
- * @implemented
- */
-VOID NTAPI
-RtlGetNtVersionNumbers(OUT PULONG pMajorVersion,
- OUT PULONG pMinorVersion,
- OUT PULONG pBuildNumber)
-{
- PPEB pPeb = NtCurrentPeb();
-
- if (pMajorVersion)
- {
- *pMajorVersion = pPeb->OSMajorVersion < 5 ? 5 : pPeb->OSMajorVersion;
- }
-
- if (pMinorVersion)
- {
- if ( (pPeb->OSMajorVersion < 5) ||
- ((pPeb->OSMajorVersion == 5) && (pPeb->OSMinorVersion < 1)) )
- *pMinorVersion = 1;
- else
- *pMinorVersion = pPeb->OSMinorVersion;
- }
-
- if (pBuildNumber)
- {
- /* Windows really does this! */
- *pBuildNumber = (0xF0000000 | pPeb->OSBuildNumber);
- }
-}
-
-/*
- * @implemented
- * @note User-mode version of RtlGetVersion in ntoskrnl/rtl/misc.c
- */
-NTSTATUS NTAPI
-RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
-{
- ULONG Length;
- PPEB Peb = NtCurrentPeb();
-
- if (lpVersionInformation->dwOSVersionInfoSize != sizeof(RTL_OSVERSIONINFOW) &&
- lpVersionInformation->dwOSVersionInfoSize != sizeof(RTL_OSVERSIONINFOEXW))
- {
- return STATUS_INVALID_PARAMETER;
- }
-
- lpVersionInformation->dwMajorVersion = Peb->OSMajorVersion;
- lpVersionInformation->dwMinorVersion = Peb->OSMinorVersion;
- lpVersionInformation->dwBuildNumber = Peb->OSBuildNumber;
- lpVersionInformation->dwPlatformId = Peb->OSPlatformId;
- RtlZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion));
-
- /* If we have a CSD version string, initialized by Application Compatibility... */
- if (Peb->CSDVersion.Length && Peb->CSDVersion.Buffer && Peb->CSDVersion.Buffer[0] != UNICODE_NULL)
- {
- /* ... copy it... */
- Length = min(wcslen(Peb->CSDVersion.Buffer), ARRAYSIZE(lpVersionInformation->szCSDVersion) - 1);
- wcsncpy(lpVersionInformation->szCSDVersion, Peb->CSDVersion.Buffer, Length);
- }
- else
- {
- /* ... otherwise we just null-terminate it */
- Length = 0;
- }
-
- /* Always null-terminate the user CSD version string */
- lpVersionInformation->szCSDVersion[Length] = UNICODE_NULL;
-
- 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;
-}
-
-/* EOF */