diff --git a/win32/device.c b/win32/device.c
index 6467f1f3406aeb226c49845274820a8f94fb2a03..434785009feeea2b012904a355d95ed219f8c617 100644
--- a/win32/device.c
+++ b/win32/device.c
@@ -25,6 +25,7 @@
 #include "winbase.h"
 #include "winreg.h"
 #include "winerror.h"
+#include "winversion.h"
 #include "file.h"
 #include "process.h"
 #include "mmsystem.h"
@@ -64,6 +65,8 @@ static BOOL DeviceIo_IFSMgr(DWORD dwIoControlCode,
 			      LPDWORD lpcbBytesReturned,
 			      LPOVERLAPPED lpOverlapped);
 
+static DWORD VxDCall_VWin32( DWORD service, CONTEXT *context );
+
 static BOOL DeviceIo_VWin32(DWORD dwIoControlCode, 
 			      LPVOID lpvInBuffer, DWORD cbInBuffer,
 			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
@@ -132,7 +135,7 @@ static const struct VxDInfo VxDList[] =
     { "VXDLDR",   0x0027, NULL, NULL },
     { "NDIS",     0x0028, NULL, NULL },
     { "BIOS_EXT", 0x0029, NULL, NULL },
-    { "VWIN32",   0x002A, NULL, DeviceIo_VWin32 },
+    { "VWIN32",   0x002A, VxDCall_VWin32, DeviceIo_VWin32 },
     { "VCOMM",    0x002B, NULL, NULL },
     { "SPOOLER",  0x002C, NULL, NULL },
     { "WIN32S",   0x002D, NULL, NULL },
@@ -783,6 +786,66 @@ static BOOL DeviceIo_IFSMgr(DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbI
     return retv;
 }
 
+/********************************************************************************
+ *      VxDCall_VWin32
+ *
+ *  Service numbers taken from page 448 of Pietrek's "Windows 95 System
+ *  Progrmaming Secrets".  Parameters from experimentation on real Win98.
+ *
+ */
+
+static DWORD VxDCall_VWin32( DWORD service, CONTEXT *context )
+{
+  switch ( LOWORD(service) )
+    {
+    case 0x0000: /* GetVersion */
+    {
+        DWORD vers = VERSION_GetVersion();
+	switch (vers)
+	{
+	case WIN31:
+	  return(0x0301);  /* Windows 3.1 */
+	  break;
+
+	case WIN95:
+	  return(0x0400);  /* Win95 aka 4.0 */
+	  break;
+
+	case WIN98:
+	  return(0x040a);  /* Win98 aka 4.10 */
+	  break;
+
+	case NT351:
+        case NT40:
+	  ERR("VxDCall when emulating NT???\n");
+	  break;
+
+	default:
+	  WARN("Unknown version %lx\n", vers);
+	  break;
+	}
+
+	return(0x040a); /* default to win98 */
+    }
+    break;
+
+    case 0x002a: /* Int41 dispatch - parm = int41 service number */
+    {
+	DWORD callnum = (DWORD) stack32_pop(context);
+
+	return callnum; /* FIXME: should really call INT_Int41Handler() */
+    }
+    break;
+
+    default:
+      FIXME("Unknown VWin32 service %08lx\n", service);
+      break;
+    }
+
+  return 0xffffffff;
+}
+                         
+
  
 /***********************************************************************
  *           DeviceIo_VWin32