Alexandre Julliard : ntdll: Retrieve Wine version strings through NtQuerySystemInformation().
Alexandre Julliard
julliard at winehq.org
Mon Apr 5 16:28:23 CDT 2021
Module: wine
Branch: master
Commit: 985bd97c2bb0a161f9cae370ae1893f2b0554ffd
URL: https://source.winehq.org/git/wine.git/?a=commit;h=985bd97c2bb0a161f9cae370ae1893f2b0554ffd
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Apr 5 13:05:44 2021 +0200
ntdll: Retrieve Wine version strings through NtQuerySystemInformation().
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/ntdll.spec | 6 +++---
dlls/ntdll/unix/loader.c | 48 ++----------------------------------------------
dlls/ntdll/unix/system.c | 18 ++++++++++++++++++
dlls/ntdll/version.c | 37 +++++++++++++++++++++++++++++++++++++
include/winternl.h | 4 +++-
5 files changed, 63 insertions(+), 50 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index c8622ba21f4..cbb45f50dff 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -1623,9 +1623,9 @@
@ cdecl -syscall __wine_locked_recvmsg(long ptr long)
# Version
-@ cdecl -syscall wine_get_version()
-@ cdecl -syscall wine_get_build_id()
-@ cdecl -syscall wine_get_host_version(ptr ptr)
+@ cdecl wine_get_version()
+@ cdecl wine_get_build_id()
+@ cdecl wine_get_host_version(ptr ptr)
# Filesystem
@ cdecl -syscall wine_nt_to_unix_file_name(ptr ptr ptr long)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 9c6d58d94ee..c13055a5549 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -51,9 +51,6 @@
#ifdef HAVE_SYS_RESOURCE_H
# include <sys/resource.h>
#endif
-#ifdef HAVE_SYS_UTSNAME_H
-#include <sys/utsname.h>
-#endif
#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h>
#endif
@@ -335,48 +332,6 @@ static void init_paths( char *argv[] )
}
-/*********************************************************************
- * wine_get_version
- */
-const char * CDECL wine_get_version(void)
-{
- return PACKAGE_VERSION;
-}
-
-
-/*********************************************************************
- * wine_get_build_id
- */
-const char * CDECL wine_get_build_id(void)
-{
- extern const char wine_build[];
- return wine_build;
-}
-
-
-/*********************************************************************
- * wine_get_host_version
- */
-void CDECL wine_get_host_version( const char **sysname, const char **release )
-{
-#ifdef HAVE_SYS_UTSNAME_H
- static struct utsname buf;
- static BOOL init_done;
-
- if (!init_done)
- {
- uname( &buf );
- init_done = TRUE;
- }
- if (sysname) *sysname = buf.sysname;
- if (release) *release = buf.release;
-#else
- if (sysname) *sysname = "";
- if (release) *release = "";
-#endif
-}
-
-
static void preloader_exec( char **argv )
{
if (use_preloader)
@@ -2107,7 +2062,8 @@ static void check_command_line( int argc, char *argv[] )
}
if (!strcmp( argv[1], "--version" ))
{
- printf( "%s\n", wine_get_build_id() );
+ extern const char wine_build[];
+ printf( "%s\n", wine_build );
exit(0);
}
}
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c
index 56f31e4147f..2b316095f4a 100644
--- a/dlls/ntdll/unix/system.c
+++ b/dlls/ntdll/unix/system.c
@@ -40,6 +40,9 @@
#ifdef HAVE_SYS_SYSCTL_H
# include <sys/sysctl.h>
#endif
+#ifdef HAVE_SYS_UTSNAME_H
+# include <sys/utsname.h>
+#endif
#ifdef HAVE_MACHINE_CPU_H
# include <machine/cpu.h>
#endif
@@ -2809,6 +2812,21 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class,
ret = STATUS_SUCCESS;
break;
+ /* Wine extensions */
+
+ case SystemWineVersionInformation:
+ {
+ static const char version[] = PACKAGE_VERSION;
+ extern const char wine_build[];
+ struct utsname buf;
+
+ uname( &buf );
+ len = strlen(version) + strlen(wine_build) + strlen(buf.sysname) + strlen(buf.release) + 4;
+ snprintf( info, size, "%s%c%s%c%s%c%s", version, 0, wine_build, 0, buf.sysname, 0, buf.release );
+ if (size < len) ret = STATUS_INFO_LENGTH_MISMATCH;
+ break;
+ }
+
default:
FIXME( "(0x%08x,%p,0x%08x,%p) stub\n", class, info, size, ret_size );
diff --git a/dlls/ntdll/version.c b/dlls/ntdll/version.c
index 740d8403f5e..cde340cca1d 100644
--- a/dlls/ntdll/version.c
+++ b/dlls/ntdll/version.c
@@ -207,6 +207,41 @@ static const struct { WCHAR name[12]; WINDOWS_VERSION ver; } version_names[] =
/* initialized to null so that we crash if we try to retrieve the version too early at startup */
static const RTL_OSVERSIONINFOEXW *current_version;
+static char wine_version[256];
+
+/*********************************************************************
+ * wine_get_version
+ */
+const char * CDECL wine_get_version(void)
+{
+ return wine_version;
+}
+
+
+/*********************************************************************
+ * wine_get_build_id
+ */
+const char * CDECL wine_get_build_id(void)
+{
+ const char *p = wine_version;
+ p += strlen(p) + 1; /* skip version */
+ return p;
+}
+
+
+/*********************************************************************
+ * wine_get_host_version
+ */
+void CDECL wine_get_host_version( const char **sysname, const char **release )
+{
+ const char *p = wine_version;
+ p += strlen(p) + 1; /* skip version */
+ p += strlen(p) + 1; /* skip build id */
+ if (sysname) *sysname = p;
+ p += strlen(p) + 1;
+ if (release) *release = p;
+}
+
/**********************************************************************
* get_nt_registry_version
@@ -430,6 +465,8 @@ void version_init(void)
const WCHAR *p, *appname = NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer;
WCHAR appversion[MAX_PATH+20];
+ NtQuerySystemInformation( SystemWineVersionInformation, wine_version, sizeof(wine_version), NULL );
+
current_version = &VersionData[WIN7];
RtlOpenCurrentUser( KEY_ALL_ACCESS, &root );
diff --git a/include/winternl.h b/include/winternl.h
index 9e6bde25569..298ebbc2d36 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -1693,7 +1693,9 @@ typedef enum _SYSTEM_INFORMATION_CLASS {
SystemDifRemovePluginVerificationOnDriver = 220,
SystemShadowStackInformation = 221,
SystemBuildVersionInformation = 222,
- SystemInformationClassMax
+#ifdef __WINESRC__
+ SystemWineVersionInformation = 1000,
+#endif
} SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS;
typedef enum _THREADINFOCLASS {
More information about the wine-cvs
mailing list