Author: hbelusca Date: Mon Mar 16 03:14:16 2015 New Revision: 66735
URL: http://svn.reactos.org/svn/reactos?rev=66735&view=rev Log: [BOOTDATA] - Remove hardcoded registry values: CurrentVersion, CSDVersion and CurrentBuildNumber from HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion. They are computed and stored there by the kernel. - All the versioning is controlled by the two values: CSDReleaseType and CSDVersion in HKLM\SYSTEM\CurrentControlSet\Control\Windows. Currently we target SP1.
[NTDLL] The lpVersionInformation->szCSDVersion string should not be built by RtlGetVersion, but instead retrieved from the Peb->CSDVersion string that in turn is initialized by the NTDLL PE Loader. Normally this is a App-Compatibility-dependent string, but for now we somewhat hardcode it (it is built using the actual Peb->OSCSDVersion number).
[RTL]: Rename some variables "à la NT" and use adequate types (but no code changes otherwise).
[NTOS] - Fix PsGetVersion that should use the CmCSDVersionString variable. This API also returns TRUE if we are in checked build mode (the high byte of NtBuildNumber is flagged). - The kernel should initialize the CurrentVersion, CSDVersion and CurrentBuildNumber registry values (and few other ones) from the two main CSDReleaseType and CSDVersion values. - Fix the ReactOS-specific version+revision display in SOS mode.
CORE-6611 CORE-7889 CORE-8877
Modified: trunk/reactos/boot/bootdata/hivesft.inf trunk/reactos/boot/bootdata/hivesys.inf trunk/reactos/dll/ntdll/ldr/ldrinit.c trunk/reactos/dll/ntdll/ldr/ldrutils.c trunk/reactos/dll/ntdll/rtl/version.c trunk/reactos/lib/rtl/version.c trunk/reactos/ntoskrnl/config/cmdata.c trunk/reactos/ntoskrnl/config/cmsysini.c trunk/reactos/ntoskrnl/ex/init.c trunk/reactos/ntoskrnl/include/internal/ex.h trunk/reactos/ntoskrnl/io/iomgr/iomgr.c trunk/reactos/ntoskrnl/ps/psmgr.c
Modified: trunk/reactos/boot/bootdata/hivesft.inf URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/bootdata/hivesft.inf?r... ============================================================================== --- trunk/reactos/boot/bootdata/hivesft.inf [iso-8859-1] (original) +++ trunk/reactos/boot/bootdata/hivesft.inf [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -154,9 +154,6 @@ HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",,0x00000012
; Version Information -HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentVersion",0x00000000,"5.2" -HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CSDVersion",0x00000000,"Service Pack 2" -HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentBuildNumber",0x00000000,"3790" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","InstallDate",0x00010003,0 HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","ProductName",2,"ReactOS" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","RegDone",0x00000002,""
Modified: trunk/reactos/boot/bootdata/hivesys.inf URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/bootdata/hivesys.inf?r... ============================================================================== --- trunk/reactos/boot/bootdata/hivesys.inf [iso-8859-1] (original) +++ trunk/reactos/boot/bootdata/hivesys.inf [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -1220,6 +1220,7 @@ ; but we can also report as Workstation if some application needs it. HKLM,"SYSTEM\CurrentControlSet\Control\ReactOS\Settings\Version","ReportAsWorkstation",0x00010001,0x00000000 ; Some installers check for SP1 +HKLM,"SYSTEM\CurrentControlSet\Control\Windows","CSDReleaseType",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Control\Windows","CSDVersion",0x00010001,0x00000100
HKLM,"SYSTEM\CurrentControlSet\Control\SecurityProviders","SecurityProviders",2,"schannel.dll"
Modified: trunk/reactos/dll/ntdll/ldr/ldrinit.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/ldr/ldrinit.c?rev... ============================================================================== --- trunk/reactos/dll/ntdll/ldr/ldrinit.c [iso-8859-1] (original) +++ trunk/reactos/dll/ntdll/ldr/ldrinit.c [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -1775,7 +1775,7 @@ /* Check if we failed */ if (!NT_SUCCESS(Status)) { - /* Aassume System32 */ + /* Assume System32 */ LdrpKnownDllObjectDirectory = NULL; RtlInitUnicodeString(&LdrpKnownDllPath, StringBuffer); LdrpKnownDllPath.Length -= sizeof(WCHAR); @@ -2069,6 +2069,40 @@ ProcessExecuteFlags, &ExecuteOptions, sizeof(ULONG)); + + // FIXME: Should be done by Application Compatibility features, + // by reading the registry, etc... + // For now, this is the old code from ntdll!RtlGetVersion(). + RtlInitEmptyUnicodeString(&Peb->CSDVersion, NULL, 0); + if (((Peb->OSCSDVersion >> 8) & 0xFF) != 0) + { + WCHAR szCSDVersion[128]; + ULONG i; + ULONG Length = ARRAYSIZE(szCSDVersion) - 1; + i = _snwprintf(szCSDVersion, Length, + L"Service Pack %d", + ((Peb->OSCSDVersion >> 8) & 0xFF)); + if (i < 0) + { + /* Null-terminate if it was overflowed */ + szCSDVersion[Length] = UNICODE_NULL; + } + + Length *= sizeof(WCHAR); + Peb->CSDVersion.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + Length + sizeof(UNICODE_NULL)); + if (Peb->CSDVersion.Buffer) + { + Peb->CSDVersion.Length = Length; + Peb->CSDVersion.MaximumLength = Length + sizeof(UNICODE_NULL); + + RtlCopyMemory(Peb->CSDVersion.Buffer, + szCSDVersion, + Peb->CSDVersion.MaximumLength); + Peb->CSDVersion.Buffer[Peb->CSDVersion.Length / sizeof(WCHAR)] = UNICODE_NULL; + } + }
/* Check if we had Shim Data */ if (OldShimData)
Modified: trunk/reactos/dll/ntdll/ldr/ldrutils.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/ldr/ldrutils.c?re... ============================================================================== --- trunk/reactos/dll/ntdll/ldr/ldrutils.c [iso-8859-1] (original) +++ trunk/reactos/dll/ntdll/ldr/ldrutils.c [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -204,6 +204,7 @@ /* Zero it out */ RtlInitEmptyUnicodeString(StringIn, NULL, 0); } + BOOLEAN NTAPI LdrpCallInitRoutine(IN PDLL_INIT_ROUTINE EntryPoint,
Modified: trunk/reactos/dll/ntdll/rtl/version.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/rtl/version.c?rev... ============================================================================== --- trunk/reactos/dll/ntdll/rtl/version.c [iso-8859-1] (original) +++ trunk/reactos/dll/ntdll/rtl/version.c [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -69,26 +69,26 @@ }
/********************************************************************** - * NAME EXPORTED - * RtlGetNtProductType + * NAME EXPORTED + * RtlGetNtProductType * * DESCRIPTION - * Retrieves the OS product type. + * Retrieves the OS product type. * * ARGUMENTS - * ProductType Pointer to the product type variable. + * ProductType Pointer to the product type variable. * * RETURN VALUE - * TRUE if successful, otherwise FALSE + * TRUE if successful, otherwise FALSE * * NOTE - * ProductType can be one of the following values: - * 1 Workstation (WinNT) - * 2 Server (LanmanNT) - * 3 Advanced Server (ServerNT) + * ProductType can be one of the following values: + * 1 Workstation (WinNT) + * 2 Server (LanmanNT) + * 3 Advanced Server (ServerNT) * * REVISIONS - * 2000-08-10 ekohl + * 2000-08-10 ekohl * * @implemented */ @@ -100,53 +100,53 @@ }
/********************************************************************** - * NAME EXPORTED - * RtlGetNtVersionNumbers + * NAME EXPORTED + * RtlGetNtVersionNumbers * * DESCRIPTION - * Get the version numbers of the run time library. + * Get the version numbers of the run time library. * * ARGUMENTS - * pdwMajorVersion [OUT] Destination for the Major version - * pdwMinorVersion [OUT] Destination for the Minor version - * pdwBuildNumber [OUT] Destination for the Build version + * pMajorVersion [OUT] Destination for the Major version + * pMinorVersion [OUT] Destination for the Minor version + * pBuildNumber [OUT] Destination for the Build version * * RETURN VALUE - * Nothing. + * 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. + * - 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 LPDWORD pdwMajorVersion, - OUT LPDWORD pdwMinorVersion, - OUT LPDWORD pdwBuildNumber) +RtlGetNtVersionNumbers(OUT PULONG pMajorVersion, + OUT PULONG pMinorVersion, + OUT PULONG pBuildNumber) { PPEB pPeb = NtCurrentPeb();
- if (pdwMajorVersion) - { - *pdwMajorVersion = pPeb->OSMajorVersion < 5 ? 5 : pPeb->OSMajorVersion; - } - - if (pdwMinorVersion) + if (pMajorVersion) + { + *pMajorVersion = pPeb->OSMajorVersion < 5 ? 5 : pPeb->OSMajorVersion; + } + + if (pMinorVersion) { if ( (pPeb->OSMajorVersion < 5) || ((pPeb->OSMajorVersion == 5) && (pPeb->OSMinorVersion < 1)) ) - *pdwMinorVersion = 1; + *pMinorVersion = 1; else - *pdwMinorVersion = pPeb->OSMinorVersion; - } - - if (pdwBuildNumber) + *pMinorVersion = pPeb->OSMinorVersion; + } + + if (pBuildNumber) { /* Windows really does this! */ - *pdwBuildNumber = (0xF0000000 | pPeb->OSBuildNumber); + *pBuildNumber = (0xF0000000 | pPeb->OSBuildNumber); } }
@@ -157,50 +157,51 @@ NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation) { - LONG i, MaxLength; - - if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || - lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) - { - PPEB Peb = NtCurrentPeb(); - - lpVersionInformation->dwMajorVersion = Peb->OSMajorVersion; - lpVersionInformation->dwMinorVersion = Peb->OSMinorVersion; - lpVersionInformation->dwBuildNumber = Peb->OSBuildNumber; - lpVersionInformation->dwPlatformId = Peb->OSPlatformId; - RtlZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion)); - - if(((Peb->OSCSDVersion >> 8) & 0xFF) != 0) - { - MaxLength = (sizeof(lpVersionInformation->szCSDVersion) / sizeof(lpVersionInformation->szCSDVersion[0])) - 1; - i = _snwprintf(lpVersionInformation->szCSDVersion, - MaxLength, - L"Service Pack %d", - ((Peb->OSCSDVersion >> 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 = (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; - } - - return STATUS_INVALID_PARAMETER; + 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 */
Modified: trunk/reactos/lib/rtl/version.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/version.c?rev=66735... ============================================================================== --- trunk/reactos/lib/rtl/version.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/version.c [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -22,14 +22,14 @@
/* FUNCTIONS ****************************************************************/
-static BYTE -RtlpVerGetCondition(IN ULONGLONG dwlConditionMask, - IN DWORD dwTypeBitMask); +static UCHAR +RtlpVerGetCondition(IN ULONGLONG ConditionMask, + IN ULONG TypeMask);
static BOOLEAN -RtlpVerCompare(ULONG left, ULONG right, UCHAR condition) -{ - switch (condition) +RtlpVerCompare(ULONG left, ULONG right, UCHAR Condition) +{ + switch (Condition) { case VER_EQUAL: return (left == right); @@ -56,9 +56,9 @@ IN ULONG TypeMask, IN ULONGLONG ConditionMask) { + NTSTATUS Status; RTL_OSVERSIONINFOEXW ver; - NTSTATUS status; - BOOLEAN comparison; + BOOLEAN Comparison;
/* FIXME: - Check the following special case on Windows (various versions): @@ -68,17 +68,17 @@ */
ver.dwOSVersionInfoSize = sizeof(ver); - status = RtlGetVersion((PRTL_OSVERSIONINFOW)&ver); - if (status != STATUS_SUCCESS) return status; + Status = RtlGetVersion((PRTL_OSVERSIONINFOW)&ver); + if (Status != STATUS_SUCCESS) return Status;
if (!TypeMask || !ConditionMask) return STATUS_INVALID_PARAMETER;
if (TypeMask & VER_PRODUCT_TYPE) { - comparison = RtlpVerCompare(ver.wProductType, + Comparison = RtlpVerCompare(ver.wProductType, VersionInfo->wProductType, RtlpVerGetCondition(ConditionMask, VER_PRODUCT_TYPE)); - if (!comparison) + if (!Comparison) return STATUS_REVISION_MISMATCH; }
@@ -105,19 +105,19 @@
if (TypeMask & VER_PLATFORMID) { - comparison = RtlpVerCompare(ver.dwPlatformId, + Comparison = RtlpVerCompare(ver.dwPlatformId, VersionInfo->dwPlatformId, RtlpVerGetCondition(ConditionMask, VER_PLATFORMID)); - if (!comparison) + if (!Comparison) return STATUS_REVISION_MISMATCH; }
if (TypeMask & VER_BUILDNUMBER) { - comparison = RtlpVerCompare(ver.dwBuildNumber, + Comparison = RtlpVerCompare(ver.dwBuildNumber, VersionInfo->dwBuildNumber, RtlpVerGetCondition(ConditionMask, VER_BUILDNUMBER)); - if (!comparison) + if (!Comparison) return STATUS_REVISION_MISMATCH; }
@@ -130,79 +130,79 @@ * operator for VER_MAJORVERSION supersedes the others for VER_MINORVERSION, * VER_SERVICEPACKMAJOR and VER_SERVICEPACKMINOR). */ - BYTE condition = RtlpVerGetCondition(ConditionMask, TypeMask); - - comparison = TRUE; + UCHAR Condition = RtlpVerGetCondition(ConditionMask, TypeMask); + + Comparison = TRUE; if (TypeMask & VER_MAJORVERSION) { - comparison = RtlpVerCompare(ver.dwMajorVersion, + Comparison = RtlpVerCompare(ver.dwMajorVersion, VersionInfo->dwMajorVersion, - condition); + Condition); do_next_check = (ver.dwMajorVersion == VersionInfo->dwMajorVersion) && - ((condition != VER_EQUAL) || comparison); + ((Condition != VER_EQUAL) || Comparison); } if ((TypeMask & VER_MINORVERSION) && do_next_check) { - comparison = RtlpVerCompare(ver.dwMinorVersion, + Comparison = RtlpVerCompare(ver.dwMinorVersion, VersionInfo->dwMinorVersion, - condition); + Condition); do_next_check = (ver.dwMinorVersion == VersionInfo->dwMinorVersion) && - ((condition != VER_EQUAL) || comparison); + ((Condition != VER_EQUAL) || Comparison); } if ((TypeMask & VER_SERVICEPACKMAJOR) && do_next_check) { - comparison = RtlpVerCompare(ver.wServicePackMajor, + Comparison = RtlpVerCompare(ver.wServicePackMajor, VersionInfo->wServicePackMajor, - condition); + Condition); do_next_check = (ver.wServicePackMajor == VersionInfo->wServicePackMajor) && - ((condition != VER_EQUAL) || comparison); + ((Condition != VER_EQUAL) || Comparison); } if ((TypeMask & VER_SERVICEPACKMINOR) && do_next_check) { - comparison = RtlpVerCompare(ver.wServicePackMinor, + Comparison = RtlpVerCompare(ver.wServicePackMinor, VersionInfo->wServicePackMinor, - condition); - } - - if (!comparison) + Condition); + } + + if (!Comparison) return STATUS_REVISION_MISMATCH; }
return STATUS_SUCCESS; }
-static BYTE -RtlpVerGetCondition(IN ULONGLONG dwlConditionMask, - IN DWORD dwTypeBitMask) -{ - BYTE bConditionMask = 0; - - if (dwTypeBitMask & VER_PRODUCT_TYPE) - bConditionMask |= dwlConditionMask >> (7 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_SUITENAME) - bConditionMask |= dwlConditionMask >> (6 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_PLATFORMID) - bConditionMask |= dwlConditionMask >> (3 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_BUILDNUMBER) - bConditionMask |= dwlConditionMask >> (2 * VER_NUM_BITS_PER_CONDITION_MASK); +static UCHAR +RtlpVerGetCondition(IN ULONGLONG ConditionMask, + IN ULONG TypeMask) +{ + UCHAR Condition = 0; + + if (TypeMask & VER_PRODUCT_TYPE) + Condition |= ConditionMask >> (7 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_SUITENAME) + Condition |= ConditionMask >> (6 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_PLATFORMID) + Condition |= ConditionMask >> (3 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_BUILDNUMBER) + Condition |= ConditionMask >> (2 * VER_NUM_BITS_PER_CONDITION_MASK); /* * We choose here the lexicographical order on the 4D space * {(Major ; Minor ; SP Major ; SP Minor)} to select the * appropriate comparison operator. * Therefore the following 'else if' instructions must be in this order. */ - else if (dwTypeBitMask & VER_MAJORVERSION) - bConditionMask |= dwlConditionMask >> (1 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_MINORVERSION) - bConditionMask |= dwlConditionMask >> (0 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_SERVICEPACKMAJOR) - bConditionMask |= dwlConditionMask >> (5 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_SERVICEPACKMINOR) - bConditionMask |= dwlConditionMask >> (4 * VER_NUM_BITS_PER_CONDITION_MASK); - - bConditionMask &= VER_CONDITION_MASK; - - return bConditionMask; + else if (TypeMask & VER_MAJORVERSION) + Condition |= ConditionMask >> (1 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_MINORVERSION) + Condition |= ConditionMask >> (0 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_SERVICEPACKMAJOR) + Condition |= ConditionMask >> (5 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_SERVICEPACKMINOR) + Condition |= ConditionMask >> (4 * VER_NUM_BITS_PER_CONDITION_MASK); + + Condition &= VER_CONDITION_MASK; + + return Condition; }
/* @@ -210,39 +210,39 @@ */ ULONGLONG NTAPI -VerSetConditionMask(IN ULONGLONG dwlConditionMask, - IN DWORD dwTypeBitMask, - IN BYTE bConditionMask) +VerSetConditionMask(IN ULONGLONG ConditionMask, + IN ULONG TypeMask, + IN UCHAR Condition) { ULONGLONG ullCondMask;
- if (dwTypeBitMask == 0) - return dwlConditionMask; - - bConditionMask &= VER_CONDITION_MASK; - - if (bConditionMask == 0) - return dwlConditionMask; - - ullCondMask = bConditionMask; - if (dwTypeBitMask & VER_PRODUCT_TYPE) - dwlConditionMask |= ullCondMask << (7 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_SUITENAME) - dwlConditionMask |= ullCondMask << (6 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_SERVICEPACKMAJOR) - dwlConditionMask |= ullCondMask << (5 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_SERVICEPACKMINOR) - dwlConditionMask |= ullCondMask << (4 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_PLATFORMID) - dwlConditionMask |= ullCondMask << (3 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_BUILDNUMBER) - dwlConditionMask |= ullCondMask << (2 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_MAJORVERSION) - dwlConditionMask |= ullCondMask << (1 * VER_NUM_BITS_PER_CONDITION_MASK); - else if (dwTypeBitMask & VER_MINORVERSION) - dwlConditionMask |= ullCondMask << (0 * VER_NUM_BITS_PER_CONDITION_MASK); - - return dwlConditionMask; + if (TypeMask == 0) + return ConditionMask; + + Condition &= VER_CONDITION_MASK; + + if (Condition == 0) + return ConditionMask; + + ullCondMask = Condition; + if (TypeMask & VER_PRODUCT_TYPE) + ConditionMask |= ullCondMask << (7 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_SUITENAME) + ConditionMask |= ullCondMask << (6 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_SERVICEPACKMAJOR) + ConditionMask |= ullCondMask << (5 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_SERVICEPACKMINOR) + ConditionMask |= ullCondMask << (4 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_PLATFORMID) + ConditionMask |= ullCondMask << (3 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_BUILDNUMBER) + ConditionMask |= ullCondMask << (2 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_MAJORVERSION) + ConditionMask |= ullCondMask << (1 * VER_NUM_BITS_PER_CONDITION_MASK); + else if (TypeMask & VER_MINORVERSION) + ConditionMask |= ullCondMask << (0 * VER_NUM_BITS_PER_CONDITION_MASK); + + return ConditionMask; }
/* EOF */
Modified: trunk/reactos/ntoskrnl/config/cmdata.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmdata.c?re... ============================================================================== --- trunk/reactos/ntoskrnl/config/cmdata.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/config/cmdata.c [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -699,6 +699,14 @@ },
{ + L"Windows", + L"CSDReleaseType", + &CmNtCSDReleaseType, + NULL, + NULL + }, + + { L"Nls\Language", L"Default", CmDefaultLanguageId,
Modified: trunk/reactos/ntoskrnl/config/cmsysini.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmsysini.c?... ============================================================================== --- trunk/reactos/ntoskrnl/config/cmsysini.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/config/cmsysini.c [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -2079,27 +2079,30 @@ NTAPI CmpSetVersionData(VOID) { + NTSTATUS Status; OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING KeyName; UNICODE_STRING ValueName; UNICODE_STRING ValueData; + ANSI_STRING TempString; HANDLE SoftwareKeyHandle = NULL; HANDLE MicrosoftKeyHandle = NULL; HANDLE WindowsNtKeyHandle = NULL; HANDLE CurrentVersionKeyHandle = NULL; - WCHAR Buffer[128]; - NTSTATUS Status; - - /* Open the 'CurrentVersion' key */ - RtlInitUnicodeString(&KeyName, - L"\REGISTRY\MACHINE\SOFTWARE"); - + WCHAR Buffer[128]; // Buffer large enough to contain a full ULONG in decimal representation, + // and the full 'CurrentType' string. + + /* + * Open the 'HKLM\Software\Microsoft\Windows NT\CurrentVersion' key + * (create the intermediate subkeys if needed). + */ + + RtlInitUnicodeString(&KeyName, L"\REGISTRY\MACHINE\SOFTWARE"); InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, NULL, NULL); - Status = NtCreateKey(&SoftwareKeyHandle, KEY_CREATE_SUB_KEY, &ObjectAttributes, @@ -2113,16 +2116,12 @@ return; }
- /* Open the 'CurrentVersion' key */ - RtlInitUnicodeString(&KeyName, - L"Microsoft"); - + RtlInitUnicodeString(&KeyName, L"Microsoft"); InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, SoftwareKeyHandle, NULL); - Status = NtCreateKey(&MicrosoftKeyHandle, KEY_CREATE_SUB_KEY, &ObjectAttributes, @@ -2133,19 +2132,15 @@ if (!NT_SUCCESS(Status)) { DPRINT1("Failed to create key %wZ (Status: %08lx)\n", &KeyName, Status); - goto done; - } - - /* Open the 'CurrentVersion' key */ - RtlInitUnicodeString(&KeyName, - L"Windows NT"); - + goto Quit; + } + + RtlInitUnicodeString(&KeyName, L"Windows NT"); InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, MicrosoftKeyHandle, NULL); - Status = NtCreateKey(&WindowsNtKeyHandle, KEY_CREATE_SUB_KEY, &ObjectAttributes, @@ -2156,19 +2151,15 @@ if (!NT_SUCCESS(Status)) { DPRINT1("Failed to create key %wZ (Status: %08lx)\n", &KeyName, Status); - goto done; - } - - /* Open the 'CurrentVersion' key */ - RtlInitUnicodeString(&KeyName, - L"CurrentVersion"); - + goto Quit; + } + + RtlInitUnicodeString(&KeyName, L"CurrentVersion"); InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, WindowsNtKeyHandle, NULL); - Status = NtCreateKey(&CurrentVersionKeyHandle, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, &ObjectAttributes, @@ -2179,30 +2170,22 @@ if (!NT_SUCCESS(Status)) { DPRINT1("Failed to create key %wZ (Status: %08lx)\n", &KeyName, Status); - goto done; - } - - /* Set the 'CurrentType' value */ - RtlInitUnicodeString(&ValueName, - L"CurrentType"); - -#ifdef CONFIG_SMP - wcscpy(Buffer, L"Multiprocessor"); -#else - wcscpy(Buffer, L"Uniprocessor"); -#endif - - wcscat(Buffer, L" "); - -#if (DBG == 1) - wcscat(Buffer, L"Checked"); -#else - wcscat(Buffer, L"Free"); -#endif - - RtlInitUnicodeString(&ValueData, - Buffer); - + goto Quit; + } + + /* Set the 'CurrentVersion' value */ + RtlInitUnicodeString(&ValueName, L"CurrentVersion"); + NtSetValueKey(CurrentVersionKeyHandle, + &ValueName, + 0, + REG_SZ, + CmVersionString.Buffer, + CmVersionString.Length + sizeof(WCHAR)); + + /* Set the 'CurrentBuildNumber' value */ + RtlInitUnicodeString(&ValueName, L"CurrentBuildNumber"); + RtlInitEmptyUnicodeString(&ValueData, Buffer, sizeof(Buffer)); + RtlIntegerToUnicodeString(NtBuildNumber & 0xFFFF, 10, &ValueData); NtSetValueKey(CurrentVersionKeyHandle, &ValueName, 0, @@ -2210,7 +2193,88 @@ ValueData.Buffer, ValueData.Length + sizeof(WCHAR));
-done:; + /* Set the 'BuildLab' value */ + RtlInitUnicodeString(&ValueName, L"BuildLab"); + RtlInitAnsiString(&TempString, NtBuildLab); + Status = RtlAnsiStringToUnicodeString(&ValueData, &TempString, FALSE); + if (NT_SUCCESS(Status)) + { + NtSetValueKey(CurrentVersionKeyHandle, + &ValueName, + 0, + REG_SZ, + ValueData.Buffer, + ValueData.Length + sizeof(WCHAR)); + } + + /* Set the 'CurrentType' value */ + RtlInitUnicodeString(&ValueName, L"CurrentType"); + + swprintf(Buffer, L"%s %s", +#ifdef CONFIG_SMP + L"Multiprocessor" +#else + L"Uniprocessor" +#endif + , +#if (DBG == 1) + L"Checked" +#else + L"Free" +#endif + ); + RtlInitUnicodeString(&ValueData, Buffer); + NtSetValueKey(CurrentVersionKeyHandle, + &ValueName, + 0, + REG_SZ, + ValueData.Buffer, + ValueData.Length + sizeof(WCHAR)); + + /* Set the 'CSDVersion' value */ + RtlInitUnicodeString(&ValueName, L"CSDVersion"); + if (CmCSDVersionString.Length != 0) + { + NtSetValueKey(CurrentVersionKeyHandle, + &ValueName, + 0, + REG_SZ, + CmCSDVersionString.Buffer, + CmCSDVersionString.Length + sizeof(WCHAR)); + } + else + { + NtDeleteValueKey(CurrentVersionKeyHandle, &ValueName); + } + + /* Set the 'CSDBuildNumber' value */ + RtlInitUnicodeString(&ValueName, L"CSDBuildNumber"); + if (CmNtSpBuildNumber != 0) + { + RtlInitEmptyUnicodeString(&ValueData, Buffer, sizeof(Buffer)); + RtlIntegerToUnicodeString(CmNtSpBuildNumber, 10, &ValueData); + NtSetValueKey(CurrentVersionKeyHandle, + &ValueName, + 0, + REG_SZ, + ValueData.Buffer, + ValueData.Length + sizeof(WCHAR)); + } + else + { + NtDeleteValueKey(CurrentVersionKeyHandle, &ValueName); + } + + /* Set the 'SystemRoot' value */ + RtlInitUnicodeString(&ValueName, L"SystemRoot"); + NtSetValueKey(CurrentVersionKeyHandle, + &ValueName, + 0, + REG_SZ, + NtSystemRoot.Buffer, + NtSystemRoot.Length + sizeof(WCHAR)); + +Quit: /* Close the keys */ if (CurrentVersionKeyHandle != NULL) NtClose(CurrentVersionKeyHandle);
Modified: trunk/reactos/ntoskrnl/ex/init.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/init.c?rev=6673... ============================================================================== --- trunk/reactos/ntoskrnl/ex/init.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ex/init.c [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -41,9 +41,9 @@ /* NT Version Info */ ULONG NtMajorVersion = VER_PRODUCTMAJORVERSION; ULONG NtMinorVersion = VER_PRODUCTMINORVERSION; -#if DBG +#if DBG /* Checked Build */ ULONG NtBuildNumber = VER_PRODUCTBUILD | 0xC0000000; -#else +#else /* Free Build */ ULONG NtBuildNumber = VER_PRODUCTBUILD; #endif
@@ -920,10 +920,10 @@ ULONG PerfMemUsed; PLDR_DATA_TABLE_ENTRY NtosEntry; PMESSAGE_RESOURCE_ENTRY MsgEntry; - ANSI_STRING CsdString; + ANSI_STRING CSDString; size_t Remaining = 0; PCHAR RcEnd = NULL; - CHAR VersionBuffer [65]; + CHAR VersionBuffer[65];
/* Validate Loader */ if (!ExpIsLoaderValid(LoaderBlock)) @@ -1076,17 +1076,11 @@ /* Setup initial system settings */ CmGetSystemControlValues(LoaderBlock->RegistryBase, CmControlVector);
- /* Load static defaults for Service Pack 1 and add our SVN revision */ - /* Format of CSD : SPMajor - SPMinor */ - CmNtCSDVersion = 0x100 | (KERNEL_VERSION_BUILD_HEX << 16); - CmNtCSDReleaseType = 0; - - /* Set Service Pack data for Service Pack 1 */ + /* Set the Service Pack Number and add it to the CSD Version number if needed */ CmNtSpBuildNumber = VER_PRODUCTBUILD_QFE; - if (!(CmNtCSDVersion & 0xFFFF0000)) - { - /* Check the release type */ - if (CmNtCSDReleaseType == 1) CmNtSpBuildNumber |= VER_PRODUCTBUILD_QFE << 16; + if (((CmNtCSDVersion & 0xFFFF0000) == 0) && (CmNtCSDReleaseType == 1)) + { + CmNtCSDVersion |= (VER_PRODUCTBUILD_QFE << 16); }
/* Add loaded CmNtGlobalFlag value */ @@ -1140,22 +1134,22 @@ if (NT_SUCCESS(Status)) { /* Setup the string */ - RtlInitAnsiString(&CsdString, (PCHAR)MsgEntry->Text); + RtlInitAnsiString(&CSDString, (PCHAR)MsgEntry->Text);
/* Remove trailing newline */ - while ((CsdString.Length > 0) && - ((CsdString.Buffer[CsdString.Length - 1] == '\r') || - (CsdString.Buffer[CsdString.Length - 1] == '\n'))) + while ((CSDString.Length > 0) && + ((CSDString.Buffer[CSDString.Length - 1] == '\r') || + (CSDString.Buffer[CSDString.Length - 1] == '\n'))) { /* Skip the trailing character */ - CsdString.Length--; + CSDString.Length--; }
/* Fill the buffer with version information */ Status = RtlStringCbPrintfA(Buffer, sizeof(Buffer), "%Z %u%c", - &CsdString, + &CSDString, (CmNtCSDVersion & 0xFF00) >> 8, (CmNtCSDVersion & 0xFF) ? 'A' + (CmNtCSDVersion & 0xFF) - 1 : @@ -1197,7 +1191,7 @@ }
/* Check if we have an RC number */ - if (CmNtCSDVersion & 0xFFFF0000) + if ((CmNtCSDVersion & 0xFFFF0000) && (CmNtCSDReleaseType == 1)) { /* Check if we have no version data yet */ if (!(*Buffer)) @@ -1223,10 +1217,12 @@ }
/* Add the version format string */ + /* ReactOS specific: Append also the revision number */ Status = RtlStringCbPrintfA(RcEnd, Remaining, - "r%u", - /*(CmNtCSDVersion & 0xFFFF0000) >> 16*/ + "v.%u" + " r%u", + (CmNtCSDVersion & 0xFFFF0000) >> 16, KERNEL_VERSION_BUILD_HEX); if (!NT_SUCCESS(Status)) { @@ -1236,9 +1232,9 @@ }
/* Now setup the final string */ - RtlInitAnsiString(&CsdString, Buffer); + RtlInitAnsiString(&CSDString, Buffer); Status = RtlAnsiStringToUnicodeString(&CmCSDVersionString, - &CsdString, + &CSDString, TRUE); if (!NT_SUCCESS(Status)) {
Modified: trunk/reactos/ntoskrnl/include/internal/ex.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/e... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/ex.h [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/include/internal/ex.h [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -9,9 +9,6 @@ extern ULONG ExpLastTimeZoneBias; extern POBJECT_TYPE ExEventPairObjectType; extern POBJECT_TYPE _ExEventObjectType, _ExSemaphoreObjectType; -extern ULONG NtBuildNumber; -extern ULONG NtMajorVersion; -extern ULONG NtMinorVersion; extern FAST_MUTEX ExpEnvironmentLock; extern ERESOURCE ExpFirmwareTableResource; extern LIST_ENTRY ExpFirmwareTableProviderListHead; @@ -20,9 +17,8 @@ extern ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset; extern ULONG ExpUnicodeCaseTableDataOffset; extern PVOID ExpNlsSectionPointer; -extern CHAR NtBuildLab[]; -extern ULONG CmNtCSDVersion; extern ULONG NtGlobalFlag; +extern UNICODE_STRING NtSystemRoot; extern ULONG ExpInitializationPhase; extern ULONG ExpAltTimeZoneBias; extern LIST_ENTRY ExSystemLookasideListHead; @@ -32,6 +28,19 @@ extern LIST_ENTRY ExpPagedLookasideListHead; extern KSPIN_LOCK ExpNonPagedLookasideListLock; extern KSPIN_LOCK ExpPagedLookasideListLock; + +/* + * NT/Cm Version Info variables + */ +extern ULONG NtMajorVersion; +extern ULONG NtMinorVersion; +extern ULONG NtBuildNumber; +extern ULONG CmNtSpBuildNumber; +extern ULONG CmNtCSDVersion; +extern ULONG CmNtCSDReleaseType; +extern UNICODE_STRING CmVersionString; +extern UNICODE_STRING CmCSDVersionString; +extern CHAR NtBuildLab[];
#ifdef _WIN64 #define HANDLE_LOW_BITS (PAGE_SHIFT - 4)
Modified: trunk/reactos/ntoskrnl/io/iomgr/iomgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/iomgr.c?r... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/iomgr.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/iomgr/iomgr.c [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -30,7 +30,6 @@ POBJECT_TYPE IoDeviceObjectType = NULL; POBJECT_TYPE IoFileObjectType = NULL; extern POBJECT_TYPE IoControllerObjectType; -extern UNICODE_STRING NtSystemRoot; BOOLEAN IoCountOperations = TRUE; ULONG IoReadOperationCount = 0; LARGE_INTEGER IoReadTransferCount = {{0, 0}};
Modified: trunk/reactos/ntoskrnl/ps/psmgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ps/psmgr.c?rev=667... ============================================================================== --- trunk/reactos/ntoskrnl/ps/psmgr.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ps/psmgr.c [iso-8859-1] Mon Mar 16 03:14:16 2015 @@ -43,7 +43,7 @@ PVOID PspSystemDllEntryPoint;
UNICODE_STRING PsNtDllPathName = - RTL_CONSTANT_STRING(L"\SystemRoot\system32\ntdll.dll"); + RTL_CONSTANT_STRING(L"\SystemRoot\System32\ntdll.dll");
PHANDLE_TABLE PspCidTable;
@@ -658,28 +658,23 @@ */ BOOLEAN NTAPI -PsGetVersion(IN PULONG MajorVersion OPTIONAL, - IN PULONG MinorVersion OPTIONAL, - IN PULONG BuildNumber OPTIONAL, - IN PUNICODE_STRING CSDVersion OPTIONAL) +PsGetVersion(OUT PULONG MajorVersion OPTIONAL, + OUT PULONG MinorVersion OPTIONAL, + OUT PULONG BuildNumber OPTIONAL, + OUT PUNICODE_STRING CSDVersion OPTIONAL) { if (MajorVersion) *MajorVersion = NtMajorVersion; if (MinorVersion) *MinorVersion = NtMinorVersion; - if (BuildNumber) *BuildNumber = NtBuildNumber; + if (BuildNumber ) *BuildNumber = NtBuildNumber & 0x3FFF;
if (CSDVersion) { - CSDVersion->Length = 0; - CSDVersion->MaximumLength = 0; - CSDVersion->Buffer = NULL; -#if 0 CSDVersion->Length = CmCSDVersionString.Length; - CSDVersion->MaximumLength = CmCSDVersionString.Maximum; + CSDVersion->MaximumLength = CmCSDVersionString.MaximumLength; CSDVersion->Buffer = CmCSDVersionString.Buffer; -#endif - } - - /* Check the High word */ + } + + /* Return TRUE if this is a Checked Build */ return (NtBuildNumber >> 28) == 0xC; }