ReactOS 0.4.15-dev-7788-g1ad9096
version.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/ntdll/rtl/process.c
5 * PURPOSE: Process functions
6 * PROGRAMMER: Ariadne (ariadne@xs4all.nl)
7 * UPDATE HISTORY:
8 * Created 01/11/98
9 */
10
11/* INCLUDES *******************************************************************/
12
13#include <ntdll.h>
14
15#define NDEBUG
16#include <debug.h>
17
18/* FUNCTIONS ******************************************************************/
19
20/* HACK: ReactOS specific changes, see bug-reports CORE-6611 and CORE-4620 (aka. #5003) */
21static VOID NTAPI
23{
27 ULONG ReportAsWorkstation = 0;
31 UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\ReactOS\\Settings\\Version");
32 UNICODE_STRING ValName = RTL_CONSTANT_STRING(L"ReportAsWorkstation");
33
35 &KeyName,
37 NULL,
38 NULL);
39
40 /* Don't change anything if the key doesn't exist */
42 if (NT_SUCCESS(Status))
43 {
44 /* Get the value from the registry and make sure it's a 32-bit value */
46 &ValName,
48 kvpInfo,
49 sizeof(Buffer),
50 &Length);
51 if (NT_SUCCESS(Status) &&
52 (kvpInfo->Type == REG_DWORD) &&
53 (kvpInfo->DataLength == sizeof(ULONG)))
54 {
55 /* Is the value set? */
56 ReportAsWorkstation = *(PULONG)kvpInfo->Data;
57 if ((VersionInformation->wProductType == VER_NT_SERVER) &&
58 (ReportAsWorkstation != 0))
59 {
60 /* It is, modify the product type to report a workstation */
61 VersionInformation->wProductType = VER_NT_WORKSTATION;
62 DPRINT("We modified the reported OS from NtProductServer to NtProductWinNt\n");
63 }
64 }
65
66 /* Close the handle */
68 }
69}
70
71/**********************************************************************
72 * NAME EXPORTED
73 * RtlGetNtProductType
74 *
75 * DESCRIPTION
76 * Retrieves the OS product type.
77 *
78 * ARGUMENTS
79 * ProductType Pointer to the product type variable.
80 *
81 * RETURN VALUE
82 * TRUE if successful, otherwise FALSE
83 *
84 * NOTE
85 * ProductType can be one of the following values:
86 * 1 Workstation (WinNT)
87 * 2 Server (LanmanNT)
88 * 3 Advanced Server (ServerNT)
89 *
90 * REVISIONS
91 * 2000-08-10 ekohl
92 *
93 * @implemented
94 */
97{
98 *ProductType = SharedUserData->NtProductType;
99 return TRUE;
100}
101
102/**********************************************************************
103 * NAME EXPORTED
104 * RtlGetNtVersionNumbers
105 *
106 * DESCRIPTION
107 * Get the version numbers of the run time library.
108 *
109 * ARGUMENTS
110 * pMajorVersion [OUT] Destination for the Major version
111 * pMinorVersion [OUT] Destination for the Minor version
112 * pBuildNumber [OUT] Destination for the Build version
113 *
114 * RETURN VALUE
115 * Nothing.
116 *
117 * NOTES
118 * - Introduced in Windows XP (NT 5.1)
119 * - Since this call didn't exist before XP, we report at least the version
120 * 5.1. This fixes the loading of msvcrt.dll as released with XP Home,
121 * which fails in DLLMain() if the major version isn't 5.
122 *
123 * @implemented
124 */
127 OUT PULONG pMinorVersion,
128 OUT PULONG pBuildNumber)
129{
130 PPEB pPeb = NtCurrentPeb();
131
132 if (pMajorVersion)
133 {
134 *pMajorVersion = pPeb->OSMajorVersion < 5 ? 5 : pPeb->OSMajorVersion;
135 }
136
137 if (pMinorVersion)
138 {
139 if ( (pPeb->OSMajorVersion < 5) ||
140 ((pPeb->OSMajorVersion == 5) && (pPeb->OSMinorVersion < 1)) )
141 *pMinorVersion = 1;
142 else
143 *pMinorVersion = pPeb->OSMinorVersion;
144 }
145
146 if (pBuildNumber)
147 {
148 /* Windows really does this! */
149 *pBuildNumber = (0xF0000000 | pPeb->OSBuildNumber);
150 }
151}
152
153/*
154 * @implemented
155 * @note User-mode version of RtlGetVersion in ntoskrnl/rtl/misc.c
156 */
159{
162
163 if (lpVersionInformation->dwOSVersionInfoSize != sizeof(RTL_OSVERSIONINFOW) &&
164 lpVersionInformation->dwOSVersionInfoSize != sizeof(RTL_OSVERSIONINFOEXW))
165 {
167 }
168
169 lpVersionInformation->dwMajorVersion = Peb->OSMajorVersion;
170 lpVersionInformation->dwMinorVersion = Peb->OSMinorVersion;
171 lpVersionInformation->dwBuildNumber = Peb->OSBuildNumber;
172 lpVersionInformation->dwPlatformId = Peb->OSPlatformId;
173 RtlZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion));
174
175 /* If we have a CSD version string, initialized by Application Compatibility... */
177 {
178 /* ... copy it... */
179 Length = min(wcslen(Peb->CSDVersion.Buffer), ARRAYSIZE(lpVersionInformation->szCSDVersion) - 1);
180 wcsncpy(lpVersionInformation->szCSDVersion, Peb->CSDVersion.Buffer, Length);
181 }
182 else
183 {
184 /* ... otherwise we just null-terminate it */
185 Length = 0;
186 }
187
188 /* Always null-terminate the user CSD version string */
189 lpVersionInformation->szCSDVersion[Length] = UNICODE_NULL;
190
191 if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW))
192 {
193 PRTL_OSVERSIONINFOEXW InfoEx = (PRTL_OSVERSIONINFOEXW)lpVersionInformation;
194 InfoEx->wServicePackMajor = (Peb->OSCSDVersion >> 8) & 0xFF;
195 InfoEx->wServicePackMinor = Peb->OSCSDVersion & 0xFF;
196 InfoEx->wSuiteMask = SharedUserData->SuiteMask & 0xFFFF;
197 InfoEx->wProductType = SharedUserData->NtProductType;
198 InfoEx->wReserved = 0;
199
200 /* HACK: ReactOS specific changes, see bug-reports CORE-6611 and CORE-4620 (aka. #5003) */
201 SetRosSpecificInfo(InfoEx);
202 }
203
204 return STATUS_SUCCESS;
205}
206
207/* EOF */
#define NtCurrentPeb()
Definition: FLS.c:22
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
Definition: bufpool.h:45
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
BOOLEAN NTAPI RtlGetNtProductType(_Out_ PNT_PRODUCT_TYPE ProductType)
Definition: version.c:96
static VOID NTAPI SetRosSpecificInfo(IN OUT PRTL_OSVERSIONINFOEXW VersionInformation)
Definition: version.c:22
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:158
VOID NTAPI RtlGetNtVersionNumbers(OUT PULONG pMajorVersion, OUT PULONG pMinorVersion, OUT PULONG pBuildNumber)
Definition: version.c:126
PPEB Peb
Definition: dllmain.c:27
enum _NT_PRODUCT_TYPE * PNT_PRODUCT_TYPE
FxAutoRegKey hKey
Status
Definition: gdiplustypes.h:25
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_OPENIF
Definition: winternl.h:229
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
if(dx< 0)
Definition: linetemp.h:194
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define min(a, b)
Definition: monoChain.cc:55
#define _Out_
Definition: ms_sal.h:345
NTSYSAPI NTSTATUS NTAPI NtOpenKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: ntapi.c:336
@ KeyValuePartialInformation
Definition: nt_native.h:1182
#define KEY_READ
Definition: nt_native.h:1023
NTSYSAPI NTSTATUS NTAPI NtQueryValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
struct _KEY_VALUE_PARTIAL_INFORMATION KEY_VALUE_PARTIAL_INFORMATION
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3402
#define UNICODE_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define L(x)
Definition: ntvdm.h:50
#define REG_DWORD
Definition: sdbapi.c:596
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
#define SharedUserData
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
USHORT wServicePackMinor
Definition: rtltypes.h:276
UCHAR wProductType
Definition: rtltypes.h:278
USHORT wSuiteMask
Definition: rtltypes.h:277
USHORT wServicePackMajor
Definition: rtltypes.h:275
UNICODE_STRING CSDVersion
Definition: winternl.h:353
ULONG OSMinorVersion
Definition: ntddk_ex.h:301
ULONG OSMajorVersion
Definition: ntddk_ex.h:300
ULONG OSBuildNumber
Definition: ntddk_ex.h:302
ULONG OSPlatformId
Definition: ntddk_ex.h:303
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2699
#define VER_NT_WORKSTATION
#define VER_NT_SERVER
struct _OSVERSIONINFOEXW * PRTL_OSVERSIONINFOEXW
char CHAR
Definition: xmlstorage.h:175