msvcrt: do not set the windows version to 0.5

Rein Klazes wijn at online.nl
Thu Apr 16 02:10:28 CDT 2009


Fixes bug #15172

Using GetVersionEx instead of GetVersion in msvcrt_init_args() replaces
some error prone bit manipulations by clearer code.
---
 dlls/msvcrt/data.c       |   29 +++++++++++++++++------------
 dlls/msvcrt/tests/data.c |   38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 12 deletions(-)

diff --git a/dlls/msvcrt/data.c b/dlls/msvcrt/data.c
index 886257f..3ed1b1a 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 = { sizeof( OSVERSIONINFOW) };
 
   MSVCRT__acmdln = _strdup( GetCommandLineA() );
   MSVCRT__wcmdln = msvcrt_wstrdupa(MSVCRT__acmdln);
@@ -273,17 +273,22 @@ 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;
+  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..5236c64 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);
 }
 
+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);
 }
-- 
1.6.2.1




More information about the wine-patches mailing list