Skip to content

Commit

Permalink
[WINVER] Display compatibility information
Browse files Browse the repository at this point in the history
Also don't hardcode the OS name.
  • Loading branch information
TAN-Gaming committed Jan 24, 2025
1 parent 205eadc commit d1f97e9
Show file tree
Hide file tree
Showing 7 changed files with 192 additions and 9 deletions.
10 changes: 8 additions & 2 deletions base/applications/winver/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@

add_executable(winver winver.c winver.rc)
list(APPEND SOURCE
osinfo.c
winver.c
winver_p.h)

add_executable(winver ${SOURCE} winver.rc)
set_module_type(winver win32gui UNICODE)
add_importlibs(winver shell32 comctl32 msvcrt kernel32)
add_importlibs(winver advapi32 user32 shell32 comctl32 msvcrt kernel32)
add_pch(winver winver_p.h SOURCE)
add_cd_file(TARGET winver DESTINATION reactos/system32 FOR all)
7 changes: 7 additions & 0 deletions base/applications/winver/lang/en-US.rc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

STRINGTABLE
BEGIN
IDS_OSINFO_COMPAT_FORMAT "Reporting NT %s (Build %s%s)"
IDS_OSINFO_SPK_FORMAT ": %s"
END
119 changes: 119 additions & 0 deletions base/applications/winver/osinfo.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/*
* PROJECT: ReactOS Version Program
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Retrieve OS name and simple compatibility information
* COPYRIGHT: Copyright 2025 Thamatip Chitpong <[email protected]>
*/

#include "winver_p.h"

#define OSINFO_KEY L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"

static
VOID
Winver_GetRegValueString(
_In_ HKEY hKey,
_In_ LPCWSTR lpValue,
_Out_ LPWSTR lpBuffer,
_In_ DWORD cchSize)
{
DWORD dwType, dwSize;
LSTATUS lError;

/* NOTE: Reserved space for a NULL terminator */
dwSize = (cchSize - 1) * sizeof(WCHAR);
lError = RegQueryValueExW(hKey, lpValue, NULL, &dwType, (LPBYTE)lpBuffer, &dwSize);
if (lError != ERROR_SUCCESS || dwType != REG_SZ)
{
/* Return empty string on failure */
lpBuffer[0] = UNICODE_NULL;
return;
}

/* Ensure the returned string is NULL terminated */
lpBuffer[cchSize - 1] = UNICODE_NULL;
}

static
VOID
Winver_GetFormattedSpkInfo(
_In_ HKEY hKey,
_Out_ LPWSTR lpBuffer,
_In_ DWORD cchSize)
{
WCHAR szRegValue[48];
WCHAR szFormat[16] = L"";

Winver_GetRegValueString(hKey, L"CSDVersion", szRegValue, _countof(szRegValue));
if (!*szRegValue)
{
/* Return empty string on failure */
lpBuffer[0] = UNICODE_NULL;
return;
}

LoadStringW(GetModuleHandleW(NULL),
IDS_OSINFO_SPK_FORMAT,
szFormat,
_countof(szFormat));

StringCchPrintfW(lpBuffer, cchSize, szFormat, szRegValue);
}

static
VOID
Winver_FormatCompatInfo(
_Inout_ PWINVER_OS_INFO OSInfo)
{
WCHAR szFormat[64] = L"";

/* Required info must be valid */
if (!*(OSInfo->szNtVersion) || !*(OSInfo->szNtBuild))
return;

LoadStringW(GetModuleHandleW(NULL),
IDS_OSINFO_COMPAT_FORMAT,
szFormat,
_countof(szFormat));

/* NOTE: Service pack info is optional */
StringCchPrintfW(OSInfo->szCompatInfo, _countof(OSInfo->szCompatInfo), szFormat,
OSInfo->szNtVersion,
OSInfo->szNtBuild,
OSInfo->szNtSpk);
}

BOOL
Winver_GetOSInfo(
_Out_ PWINVER_OS_INFO OSInfo)
{
HKEY hKey;
LSTATUS lError;

lError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
OSINFO_KEY,
0,
KEY_QUERY_VALUE,
&hKey);
if (lError != ERROR_SUCCESS)
return FALSE;

/* OS name */
Winver_GetRegValueString(hKey, L"ProductName", OSInfo->szName, _countof(OSInfo->szName));
if (!*(OSInfo->szName))
{
/* This info must be valid */
RegCloseKey(hKey);
return FALSE;
}

/* Compatibility information */
Winver_GetRegValueString(hKey, L"CurrentVersion", OSInfo->szNtVersion, _countof(OSInfo->szNtVersion));
Winver_GetRegValueString(hKey, L"CurrentBuildNumber", OSInfo->szNtBuild, _countof(OSInfo->szNtBuild));
Winver_GetFormattedSpkInfo(hKey, OSInfo->szNtSpk, _countof(OSInfo->szNtSpk));
Winver_FormatCompatInfo(OSInfo);

RegCloseKey(hKey);

return TRUE;
}
4 changes: 4 additions & 0 deletions base/applications/winver/resource.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#pragma once

#define IDS_OSINFO_COMPAT_FORMAT 1
#define IDS_OSINFO_SPK_FORMAT 2
17 changes: 10 additions & 7 deletions base/applications/winver/winver.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,12 @@
* FILE: base/applications/winver/winver.c
*/

#include <stdarg.h>
#include <windef.h>
#include <winbase.h>
#include <winuser.h>
#include <commctrl.h>
#include <shellapi.h>
#include "winver_p.h"

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
INITCOMMONCONTROLSEX iccx;
WINVER_OS_INFO OSInfo;

UNREFERENCED_PARAMETER(hInstance);
UNREFERENCED_PARAMETER(hPrevInstance);
Expand All @@ -25,5 +21,12 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
iccx.dwICC = ICC_STANDARD_CLASSES | ICC_WIN95_CLASSES;
InitCommonControlsEx(&iccx);

return ShellAboutW(NULL, L"ReactOS", NULL, NULL);
if (!Winver_GetOSInfo(&OSInfo))
{
/* OS info is not available, display the default contents */
StringCchCopyW(OSInfo.szName, _countof(OSInfo.szName), L"ReactOS");
OSInfo.szCompatInfo[0] = UNICODE_NULL;
}

return ShellAboutW(NULL, OSInfo.szName, OSInfo.szCompatInfo, NULL);
}
9 changes: 9 additions & 0 deletions base/applications/winver/winver.rc
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,18 @@
#include <windef.h>
#include <winuser.h>

#include "resource.h"

#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Version Program"
#define REACTOS_STR_INTERNAL_NAME "winver"
#define REACTOS_STR_ORIGINAL_FILENAME "winver.exe"
#include <reactos/version.rc>

#include <reactos/manifest_exe.rc>

/* UTF-8 */
#pragma code_page(65001)

#ifdef LANGUAGE_EN_US
#include "lang/en-US.rc"
#endif
35 changes: 35 additions & 0 deletions base/applications/winver/winver_p.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* PROJECT: ReactOS Version Program
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Main header
* COPYRIGHT: Copyright 2025 Thamatip Chitpong <[email protected]>
*/

#pragma once

#include <stdarg.h>
#include <stdlib.h>

#include <windef.h>
#include <winbase.h>
#include <winreg.h>
#include <winuser.h>
#include <commctrl.h>
#include <shellapi.h>

#include <strsafe.h>

#include "resource.h"

typedef struct _WINVER_OS_INFO
{
WCHAR szName[64];
WCHAR szNtVersion[16];
WCHAR szNtBuild[16];
WCHAR szNtSpk[64];
WCHAR szCompatInfo[256];
} WINVER_OS_INFO, *PWINVER_OS_INFO;

BOOL
Winver_GetOSInfo(
_Out_ PWINVER_OS_INFO OSInfo);

0 comments on commit d1f97e9

Please sign in to comment.