wine-staging/patches/ntoskrnl-Stubs/0013-ntoskrnl.exe-Implement-NtBuildNumber.patch
2018-08-30 09:25:58 +10:00

125 lines
4.1 KiB
Diff

From b91595f9086dae3db6c37067fc31b31a6120c3ba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Tue, 6 Jun 2017 21:08:51 +0200
Subject: [PATCH] ntoskrnl.exe: Implement NtBuildNumber.
---
dlls/ntoskrnl.exe/ntoskrnl.c | 11 +++++++++--
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
dlls/ntoskrnl.exe/tests/driver.c | 29 +++++++++++++++++++++++++++++
3 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 466962a..0fea91b 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -57,6 +57,7 @@ WINE_DECLARE_DEBUG_CHANNEL(plugplay);
BOOLEAN KdDebuggerEnabled = FALSE;
ULONG InitSafeBootMode = 0;
+USHORT NtBuildNumber = 0;
extern LONG CALLBACK vectored_handler( EXCEPTION_POINTERS *ptrs );
@@ -2939,6 +2940,13 @@ NTSTATUS WINAPI IoAcquireRemoveLockEx(PIO_REMOVE_LOCK lock, PVOID tag,
return STATUS_NOT_IMPLEMENTED;
}
+static void ntoskrnl_init(void)
+{
+ LARGE_INTEGER count;
+
+ KeQueryTickCount( &count ); /* initialize the global KeTickCount */
+ NtBuildNumber = NtCurrentTeb()->Peb->OSBuildNumber;
+}
/*****************************************************
* DllMain
@@ -2946,7 +2954,6 @@ NTSTATUS WINAPI IoAcquireRemoveLockEx(PIO_REMOVE_LOCK lock, PVOID tag,
BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
{
static void *handler;
- LARGE_INTEGER count;
switch(reason)
{
@@ -2955,7 +2962,7 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
#if defined(__i386__) || defined(__x86_64__)
handler = RtlAddVectoredExceptionHandler( TRUE, vectored_handler );
#endif
- KeQueryTickCount( &count ); /* initialize the global KeTickCount */
+ ntoskrnl_init();
break;
case DLL_PROCESS_DETACH:
if (reserved) break;
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 63c1b8e..72a9f7f 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -743,7 +743,7 @@
@ stdcall NtAllocateLocallyUniqueId(ptr)
@ stdcall NtAllocateUuids(ptr ptr ptr ptr)
@ stdcall NtAllocateVirtualMemory(long ptr long ptr long long)
-@ stub NtBuildNumber
+@ extern NtBuildNumber
@ stdcall NtClose(long)
@ stdcall NtConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtCreateEvent(ptr long ptr long long)
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index d424396..57aaa28 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -143,6 +143,22 @@ static void winetest_end_todo(void)
#define todo_wine todo_if(running_under_wine)
#define todo_wine_if(is_todo) todo_if((is_todo) && running_under_wine)
+static void *get_proc_address(const char *name)
+{
+ UNICODE_STRING name_u;
+ ANSI_STRING name_a;
+ NTSTATUS status;
+ void *ret;
+
+ RtlInitAnsiString(&name_a, name);
+ status = RtlAnsiStringToUnicodeString(&name_u, &name_a, TRUE);
+ if (status) return NULL;
+
+ ret = MmGetSystemRoutineAddress(&name_u);
+ RtlFreeUnicodeString(&name_u);
+ return ret;
+}
+
static void test_currentprocess(void)
{
PEPROCESS current;
@@ -210,6 +226,18 @@ static void test_load_driver(void)
ok(!ret, "got %#x\n", ret);
}
+static void test_version(void)
+{
+ USHORT *pNtBuildNumber;
+ ULONG build;
+
+ pNtBuildNumber = get_proc_address("NtBuildNumber");
+ ok(!!pNtBuildNumber, "Could not get pointer to NtBuildNumber\n");
+
+ PsGetVersion(NULL, NULL, &build, NULL);
+ ok(*pNtBuildNumber == build, "Expected build number %u, got %u\n", build, *pNtBuildNumber);
+}
+
static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
{
ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
@@ -237,6 +265,7 @@ static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
test_mdl_map();
test_init_funcs();
test_load_driver();
+ test_version();
/* print process report */
if (test_input->winetest_debug)
--
1.9.1