ReactOS  0.4.13-dev-100-gc8611ae
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) */
21 static VOID NTAPI
23 {
27  ULONG ReportAsWorkstation = 0;
28  HANDLE hKey;
29  ULONG Length;
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 */
45  Status = NtQueryValueKey(hKey,
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  DPRINT1("We modified the reported OS from NtProductServer to NtProductWinNt\n");
63  }
64  }
65 
66  /* Close the handle */
67  NtClose(hKey);
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  */
125 VOID NTAPI
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 {
160  ULONG Length;
161  PPEB Peb = NtCurrentPeb();
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 VER_NT_WORKSTATION
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
UCHAR wProductType
Definition: rtltypes.h:274
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING KeyName
Definition: ndis.h:4693
#define IN
Definition: typedefs.h:38
#define TRUE
Definition: types.h:120
PPEB Peb
Definition: dllmain.c:27
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:158
ULONG OSPlatformId
Definition: ntddk_ex.h:303
#define KEY_READ
Definition: nt_native.h:1023
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
char CHAR
Definition: xmlstorage.h:175
LONG NTSTATUS
Definition: precomp.h:26
VOID NTAPI RtlGetNtVersionNumbers(OUT PULONG pMajorVersion, OUT PULONG pMinorVersion, OUT PULONG pBuildNumber)
Definition: version.c:126
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
USHORT wSuiteMask
Definition: rtltypes.h:273
BOOLEAN NTAPI RtlGetNtProductType(PNT_PRODUCT_TYPE ProductType)
Definition: version.c:96
#define OBJ_OPENIF
Definition: winternl.h:229
enum _NT_PRODUCT_TYPE * PNT_PRODUCT_TYPE
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define UNICODE_NULL
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
void * PVOID
Definition: retypes.h:9
static VOID NTAPI SetRosSpecificInfo(IN OUT PRTL_OSVERSIONINFOEXW VersionInformation)
Definition: version.c:22
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)
if(!(yy_init))
Definition: macro.lex.yy.c:714
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3399
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define SharedUserData
ULONG OSBuildNumber
Definition: ntddk_ex.h:302
static const WCHAR L[]
Definition: oid.c:1250
Status
Definition: gdiplustypes.h:24
ULONG OSMinorVersion
Definition: ntddk_ex.h:301
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
#define NtCurrentPeb()
Definition: FLS.c:19
struct _KEY_VALUE_PARTIAL_INFORMATION KEY_VALUE_PARTIAL_INFORMATION
USHORT wServicePackMajor
Definition: rtltypes.h:271
struct _OSVERSIONINFOEXW * PRTL_OSVERSIONINFOEXW
unsigned int * PULONG
Definition: retypes.h:1
#define min(a, b)
Definition: monoChain.cc:55
#define DPRINT1
Definition: precomp.h:8
#define VER_NT_SERVER
NTSYSAPI NTSTATUS NTAPI NtOpenKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: ntapi.c:336
#define OUT
Definition: typedefs.h:39
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
UNICODE_STRING CSDVersion
Definition: winternl.h:353
ULONG OSMajorVersion
Definition: ntddk_ex.h:300
return STATUS_SUCCESS
Definition: btrfs.c:2725
#define REG_DWORD
Definition: sdbapi.c:596
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
USHORT wServicePackMinor
Definition: rtltypes.h:272
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14