Rein Klazes : msvcrt: Do not set the windows version to 0.5.

Alexandre Julliard julliard at winehq.org
Mon Apr 20 11:33:12 CDT 2009


Module: wine
Branch: master
Commit: ed20ac877c53ac662e295889b43b36ee9bf5417e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ed20ac877c53ac662e295889b43b36ee9bf5417e

Author: Rein Klazes <wijn at online.nl>
Date:   Thu Apr 16 09:10:28 2009 +0200

msvcrt: Do not set the windows version to 0.5.

---

 dlls/msvcrt/data.c       |   30 ++++++++++++++++++------------
 dlls/msvcrt/tests/data.c |   38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 12 deletions(-)

diff --git a/dlls/msvcrt/data.c b/dlls/msvcrt/data.c
index 886257f..a031f16 100644
--- a/dlls/msvcrt/data.c
+++ b/dlls/msvcrt/data.c
@@ -262,7 +262,7 @@ unsigned int CDECL MSVCRT____setlc_active_func(void)
  */
 void msvcrt_init_args(void)
 {
-  DWORD version;
+  OSVERSIONINFOW osvi;
 
   MSVCRT__acmdln = _strdup( GetCommandLineA() );
   MSVCRT__wcmdln = msvcrt_wstrdupa(MSVCRT__acmdln);
@@ -273,17 +273,23 @@ void msvcrt_init_args(void)
   TRACE("got %s, wide = %s argc=%d\n", debugstr_a(MSVCRT__acmdln),
         debugstr_w(MSVCRT__wcmdln),MSVCRT___argc);
 
-  version = GetVersion();
-  MSVCRT__osver       = version >> 16;
-  MSVCRT__winminor    = version & 0xFF;
-  MSVCRT__winmajor    = (version>>8) & 0xFF;
-  MSVCRT_baseversion = version >> 16;
-  MSVCRT__winver     = ((version >> 8) & 0xFF) + ((version & 0xFF) << 8);
-  MSVCRT_baseminor   = (version >> 16) & 0xFF;
-  MSVCRT_basemajor   = (version >> 24) & 0xFF;
-  MSVCRT_osversion   = version & 0xFFFF;
-  MSVCRT_osminor     = version & 0xFF;
-  MSVCRT_osmajor     = (version>>8) & 0xFF;
+  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
+  GetVersionExW( &osvi );
+  MSVCRT__winver     = (osvi.dwMajorVersion << 8) | osvi.dwMinorVersion;
+  MSVCRT__winmajor   = osvi.dwMajorVersion;
+  MSVCRT__winminor   = osvi.dwMinorVersion;
+  MSVCRT__osver      = osvi.dwBuildNumber;
+  MSVCRT_osversion   = MSVCRT__winver;
+  MSVCRT_osmajor     = MSVCRT__winmajor;
+  MSVCRT_osminor     = MSVCRT__winminor;
+  MSVCRT_baseversion = MSVCRT__osver;
+  MSVCRT_baseminor   = MSVCRT_baseversion & 0xFF;
+  MSVCRT_basemajor   = (MSVCRT_baseversion >> 8) & 0xFF;
+  TRACE( "winver %08x winmajor %08x winminor %08x osver%08x baseversion %08x basemajor %08x baseminor %08x\n",
+          MSVCRT__winver, MSVCRT__winmajor, MSVCRT__winminor, MSVCRT__osver, MSVCRT_baseversion,
+          MSVCRT_basemajor, MSVCRT_baseminor);
+  TRACE( "osversion %08x osmajor %08x osminor %08x\n", MSVCRT_osversion, MSVCRT_osmajor, MSVCRT_osminor);
+
   MSVCRT__HUGE = HUGE_VAL;
   MSVCRT___setlc_active = 0;
   MSVCRT___unguarded_readlc_active = 0;
diff --git a/dlls/msvcrt/tests/data.c b/dlls/msvcrt/tests/data.c
index a981c87..40ff46b 100644
--- a/dlls/msvcrt/tests/data.c
+++ b/dlls/msvcrt/tests/data.c
@@ -67,13 +67,51 @@ static void test_initterm(void)
     initterm_test(&callbacks[0], &callbacks[3], 2);
 }
 
+static void test_initvar( HMODULE hmsvcrt )
+{
+    OSVERSIONINFO osvi = { sizeof(OSVERSIONINFO) };
+    int* (*pp_winver)() =  (int*(*)())GetProcAddress(hmsvcrt, "__p__winver");
+    int* (*pp_winmajor)() =  (int*(*)())GetProcAddress(hmsvcrt, "__p__winmajor");
+    int* (*pp_winminor)() =  (int*(*)())GetProcAddress(hmsvcrt, "__p__winminor");
+    int* (*pp_osver)() =  (int*(*)())GetProcAddress(hmsvcrt, "__p__osver");
+    int winver, winmajor, winminor, osver;
+
+    if( !( pp_winmajor && pp_winminor && pp_winver)) {
+        win_skip("_winver variables are not available\n");
+        return;
+    }
+    winver = *pp_winver();
+    winminor = *pp_winminor();
+    winmajor = *pp_winmajor();
+    GetVersionEx( &osvi);
+    ok( winminor == osvi.dwMinorVersion, "Wrong value for _winminor %02x expected %02x\n",
+            winminor, osvi.dwMinorVersion);
+    ok( winmajor == osvi.dwMajorVersion, "Wrong value for _winmajor %02x expected %02x\n",
+            winmajor, osvi.dwMajorVersion);
+    ok( winver == ((osvi.dwMajorVersion << 8) | osvi.dwMinorVersion),
+            "Wrong value for _winver %02x expected %02x\n",
+            winver, ((osvi.dwMajorVersion << 8) | osvi.dwMinorVersion));
+    if( !pp_osver) {
+        win_skip("_osver variables are not available\n");
+        return;
+    }
+    osver = *pp_osver();
+    ok( osver == (osvi.dwBuildNumber & 0xffff) ||
+            ((osvi.dwBuildNumber >> 24) == osvi.dwMajorVersion &&
+                 ((osvi.dwBuildNumber >> 16) & 0xff) == osvi.dwMinorVersion), /* 95/98/ME */
+            "Wrong value for _osver %04x expected %04x\n",
+            osver, osvi.dwBuildNumber);
+}
+
 START_TEST(data)
 {
     HMODULE hmsvcrt;
+
     hmsvcrt = GetModuleHandleA("msvcrt.dll");
     if (!hmsvcrt)
         hmsvcrt = GetModuleHandleA("msvcrtd.dll");
     if (hmsvcrt)
         p_initterm=(void*)GetProcAddress(hmsvcrt, "_initterm");
     test_initterm();
+    test_initvar(hmsvcrt);
 }




More information about the wine-cvs mailing list