ReactOS 0.4.17-dev-1281-g065abb3
versionlie.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: KSE 'VersionLie' shim implementation
5 * COPYRIGHT: Copyright 2026 Mark Jansen (mark.jansen@reactos.org)
6 * Copyright 2026 Adam Słaboń (asaillen@protonmail.com)
7 */
8
9/*
10 * Some drivers refuse to load when the kernel reports a version that they do
11 * not know about. For example, DriverEntry of the XP / 2003 x64 NVIDIA driver
12 * (nv4_mini.sys) fails when PsGetVersion returns a major version above 5.
13 * These shims report a fixed version to the shimmed driver.
14 */
15
16#include <ntoskrnl.h>
17#include <initguid.h>
18
19#define NDEBUG
20#include <debug.h>
21
22DEFINE_GUID(KseWin2k3VersionLieGuid, 0xb120afe6, 0x7bdd, 0x4672, 0xa9, 0x90, 0x00, 0xb1, 0x3d, 0x50, 0x78, 0x05);
23
24typedef struct _KSE_VERSION_LIE
25{
32
33static KSE_VERSION_LIE KseWin2k3VersionLie = { 5, 2, 3790, 2, RTL_CONSTANT_STRING(L"Service Pack 2") };
34
35static NTSTATUS
38 IN PKSE_VERSION_LIE VersionLie)
39{
42
43 /* Let the kernel fill in the fields that are not faked */
45 if (!NT_SUCCESS(Status))
46 return Status;
47
48 lpVersionInformation->dwMajorVersion = VersionLie->MajorVersion;
49 lpVersionInformation->dwMinorVersion = VersionLie->MinorVersion;
50 lpVersionInformation->dwBuildNumber = VersionLie->BuildNumber;
52
53 RtlZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion));
55 VersionLie->CSDVersion.Buffer,
56 min(VersionLie->CSDVersion.Length, sizeof(lpVersionInformation->szCSDVersion) - sizeof(WCHAR)));
57
58 if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW))
59 {
61 InfoEx->wServicePackMajor = VersionLie->ServicePackMajor;
62 InfoEx->wServicePackMinor = 0;
63 }
64
65 return STATUS_SUCCESS;
66}
67
68static BOOLEAN
73 OUT PUNICODE_STRING CSDVersion OPTIONAL,
74 IN PKSE_VERSION_LIE VersionLie)
75{
76 if (MajorVersion) *MajorVersion = VersionLie->MajorVersion;
77 if (MinorVersion) *MinorVersion = VersionLie->MinorVersion;
78 if (BuildNumber ) *BuildNumber = VersionLie->BuildNumber;
79 if (CSDVersion ) *CSDVersion = VersionLie->CSDVersion;
80
81 /* Still report whether this is a checked build */
82 return PsGetVersion(NULL, NULL, NULL, NULL);
83}
84
85static NTSTATUS
88{
90}
91
92static BOOLEAN
97 OUT PUNICODE_STRING CSDVersion OPTIONAL)
98{
100}
101
103 { KseHookFunction, { "RtlGetVersion" }, (PVOID)(ULONG_PTR)KseWin2k3RtlGetVersion },
104 { KseHookFunction, { "PsGetVersion" }, (PVOID)(ULONG_PTR)KseWin2k3PsGetVersion },
106};
107
111};
112
114 { sizeof(KSE_SHIM), &KseWin2k3VersionLieGuid, L"KmWin2k3VersionLie", NULL, NULL, NULL, KseWin2k3VersionLieShimCollections },
115};
116
117CODE_SEG("INIT")
119NTAPI
121{
123 ULONG n;
124
125 for (n = 0; n < RTL_NUMBER_OF(KseVersionLieShims); n++)
126 {
128 if (!NT_SUCCESS(Status))
129 {
130 DPRINT1("KSE: Unable to register %S shim (0x%lx)\n", KseVersionLieShims[n].ShimName, Status);
131 Result = Status;
132 }
133 }
134
135 return Result;
136}
#define CODE_SEG(...)
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:182
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
#define L(x)
Definition: resources.c:13
#define PsGetVersion(a, b, c, d)
Definition: env_spec_w32.h:83
ULONG BuildNumber
Definition: ros_glue.cpp:6
ULONG MajorVersion
Definition: ros_glue.cpp:4
ULONG MinorVersion
Definition: ros_glue.cpp:5
Status
Definition: gdiplustypes.h:24
GLdouble n
Definition: glext.h:7729
#define KseCollectionInvalid
Definition: kse.h:38
#define KseHookInvalid
Definition: kse.h:13
#define KseCollectionNtExport
Definition: kse.h:34
struct _KSE_SHIM KSE_SHIM
#define KseHookFunction
Definition: kse.h:11
NTSTATUS NTAPI KseRegisterShim(_In_ PKSE_SHIM Shim, _In_ PVOID Ignored, _In_ ULONG Flags)
Definition: kse.c:467
#define min(a, b)
Definition: monoChain.cc:55
#define VER_PLATFORM_WIN32_NT
Definition: rtltypes.h:246
NTSTATUS NTAPI KseVersionLieInitialize(VOID)
Definition: versionlie.c:120
static NTSTATUS NTAPI KseWin2k3RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: versionlie.c:87
static KSE_HOOK KseWin2k3VersionLieHooksNT[]
Definition: versionlie.c:102
static NTSTATUS KseCommonRtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation, IN PKSE_VERSION_LIE VersionLie)
Definition: versionlie.c:36
static BOOLEAN KseCommonPsGetVersion(OUT PULONG MajorVersion OPTIONAL, OUT PULONG MinorVersion OPTIONAL, OUT PULONG BuildNumber OPTIONAL, OUT PUNICODE_STRING CSDVersion OPTIONAL, IN PKSE_VERSION_LIE VersionLie)
Definition: versionlie.c:69
static KSE_SHIM KseVersionLieShims[]
Definition: versionlie.c:113
struct _KSE_VERSION_LIE KSE_VERSION_LIE
static KSE_HOOK_COLLECTION KseWin2k3VersionLieShimCollections[]
Definition: versionlie.c:108
static BOOLEAN NTAPI KseWin2k3PsGetVersion(OUT PULONG MajorVersion OPTIONAL, OUT PULONG MinorVersion OPTIONAL, OUT PULONG BuildNumber OPTIONAL, OUT PUNICODE_STRING CSDVersion OPTIONAL)
Definition: versionlie.c:94
struct _KSE_VERSION_LIE * PKSE_VERSION_LIE
static KSE_VERSION_LIE KseWin2k3VersionLie
Definition: versionlie.c:33
short WCHAR
Definition: pedump.c:58
unsigned short USHORT
Definition: pedump.c:61
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
#define STATUS_SUCCESS
Definition: shellext.h:65
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
Definition: kse.h:22
Definition: kse.h:92
UNICODE_STRING CSDVersion
Definition: versionlie.c:30
ULONG MinorVersion
Definition: versionlie.c:27
USHORT ServicePackMajor
Definition: versionlie.c:29
ULONG MajorVersion
Definition: versionlie.c:26
USHORT wServicePackMinor
Definition: rtltypes.h:276
USHORT wServicePackMajor
Definition: rtltypes.h:275
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
_In_ DWORD _In_ int _In_ int _In_opt_ LPNLSVERSIONINFO lpVersionInformation
Definition: winnls.h:1278
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
struct _OSVERSIONINFOEXW * PRTL_OSVERSIONINFOEXW