Improved VERSION_GetVersion.

diff --git a/misc/version.c b/misc/version.c
index 5795542..827fa9b 100644
--- a/misc/version.c
+++ b/misc/version.c
@@ -124,32 +124,81 @@
 
 /**********************************************************************
  *         VERSION_GetVersion
+ *
+ * Some version data:
+ * linker/OS/image/subsys	Name			Intended for
+ *
+ * 2.39/1.00/0.00/3.10		freecell.exe	Win32s (any version)
+ * 2.55/1.00/0.00/4.00		acrord32.exe	Win32s, Win95 supported (?)
+ * 
+ * 2.50/1.00/4.00/4.00		winhlp32.exe	Win32s 1.30
+ * 4.20/4.00/1.00/4.00		Asuslm.exe		Win95 (Aaargh !)
+ * 5.12/4.00/1.07/4.00      clikfixi.exe    NT 4 (service pack files)
+ * 3.10/4.00/4.00/4.00		PLUMBING.EXE	NT
+ * ?.??/4.00/97.01/4.00		sse.exe			huh ?? (damn crackerz ;)
+ * 6.00/5.00/5.00/4.00						NT 4 driver update (strange numbers)
+ * 
+ * Common versions:
+ * x.xx/1.00/0.00/3.10						Win32s (any version ?)
+ * 2.xx/1.00/0.00/4.00						Win95 (Microsoft/system files) 
+ * x.xx/4.00/0.00/4.00						Win95 (most applications !)
+ * x.xx/4.00/4.00/4.00						NT 4 (most apps)
+ * x.xx/5.00/5.00/4.00						NT 4 newer files / NT 5 ??
  */
 WINDOWS_VERSION VERSION_GetVersion(void)
 {
     PIMAGE_NT_HEADERS peheader;	
+    PDB *pdb = PROCESS_Current();
 
     if (versionForced) /* user has overridden any sensible checks */
         return defaultWinVersion;
-    if (!PROCESS_Current()->exe_modref)
+    if (!pdb->exe_modref)
     {
         /* HACK: if we have loaded a PE image into this address space,
          * we are probably using thunks, so Win95 is our best bet
          */
-        if (PROCESS_Current()->modref_list) return WIN95;
-        return WIN31; /* FIXME: hmm, look at DDB.version ? */
+        if (pdb->modref_list) return WIN95;
+
+        /* FIXME: hmm, do anything else ?
+           TDB.version doesn't help here
+           as it always holds version 3.10 */
+        return WIN31;
     }
-    peheader = PE_HEADER(PROCESS_Current()->exe_modref->module);
-    if (peheader->OptionalHeader.MajorSubsystemVersion == 4) {
-        /* FIXME: check probably not 100% good, verify with win98 too */
+    peheader = PE_HEADER(pdb->exe_modref->module);
+
+    TRACE(ver, "%02x.%02x/%02x.%02x/%02x.%02x/%02x.%02x\n",
+          peheader->OptionalHeader.MajorLinkerVersion,
+          peheader->OptionalHeader.MinorLinkerVersion,
+          peheader->OptionalHeader.MajorOperatingSystemVersion,
+          peheader->OptionalHeader.MinorOperatingSystemVersion,
+          peheader->OptionalHeader.MajorImageVersion,
+          peheader->OptionalHeader.MinorImageVersion,
+          peheader->OptionalHeader.MajorSubsystemVersion,
+          peheader->OptionalHeader.MinorSubsystemVersion);
+
+    if (peheader->OptionalHeader.MajorSubsystemVersion == 4)
+    {
 	if (peheader->OptionalHeader.MajorOperatingSystemVersion == 4)
+        {
+            if ((peheader->OptionalHeader.MajorImageVersion == 0) &&
+                (peheader->OptionalHeader.SectionAlignment == 4096))
+                return WIN95;
 	    return NT40;
-        return WIN95;
+        }
+        if (peheader->OptionalHeader.MajorOperatingSystemVersion == 1) return WIN95;
+        if (peheader->OptionalHeader.MajorOperatingSystemVersion == 5)
+            return NT40; /* FIXME: this is NT 5, isn't it ? */
     }
     if (peheader->OptionalHeader.MajorSubsystemVersion == 3)
     {
-        /* Win3.10 */
-        if (peheader->OptionalHeader.MinorSubsystemVersion <= 11) return WIN31;
+        /* 3.1x versions */
+        if (peheader->OptionalHeader.MinorSubsystemVersion <= 11)
+        {
+            if (peheader->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI)
+                return NT351; /* FIXME: NT 3.1 */
+            else
+		  return WIN31;
+        }
         /* NT 3.51 */
         if (peheader->OptionalHeader.MinorSubsystemVersion == 50) return NT351;
         if (peheader->OptionalHeader.MinorSubsystemVersion == 51) return NT351;