Rearrange winver detection code and cache the winver value we
determined in the PDB to speed up.

diff --git a/misc/version.c b/misc/version.c
index 827fa9b..e4bec93 100644
--- a/misc/version.c
+++ b/misc/version.c
@@ -122,6 +122,106 @@
 }
 
 
+WINDOWS_VERSION VERSION_GetImageVersion(PDB *pdb)
+{
+    PIMAGE_NT_HEADERS peheader;
+
+	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 (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;
+	}
+	else
+	{
+		peheader = PE_HEADER(pdb->exe_modref->module);
+#define OPTHD peheader->OptionalHeader
+
+		TRACE(ver, "%02x.%02x/%02x.%02x/%02x.%02x/%02x.%02x\n",
+			  OPTHD.MajorLinkerVersion,
+			  OPTHD.MinorLinkerVersion,
+			  OPTHD.MajorOperatingSystemVersion,
+			  OPTHD.MinorOperatingSystemVersion,
+			  OPTHD.MajorImageVersion,
+			  OPTHD.MinorImageVersion,
+			  OPTHD.MajorSubsystemVersion,
+			  OPTHD.MinorSubsystemVersion);
+
+        switch (OPTHD.MajorSubsystemVersion)
+		{
+			case 4:
+				switch (OPTHD.MajorOperatingSystemVersion)
+				{
+					case 5:
+						return NT40; /* FIXME: this is NT 5, isn't it ? */
+					case 4:
+						if ((OPTHD.MajorImageVersion == 0) &&
+							(OPTHD.SectionAlignment == 4096))
+							return WIN95;
+						else
+							return NT40;
+					case 1:
+						return WIN95;
+					default:
+						return WIN95; /* FIXME ? */
+				}
+			case 3:
+				/* 3.1x versions */
+				if (OPTHD.MinorSubsystemVersion <= 11)
+				{
+					if (OPTHD.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI)
+						return NT351; /* FIXME: NT 3.1 */
+					else
+						return WIN31;
+				}
+				else
+				{
+					/* NT 3.51 */
+					if (OPTHD.MinorSubsystemVersion == 50)
+						return NT351;
+					else
+					if (OPTHD.MinorSubsystemVersion == 51)
+						return NT351;
+				}
+			default:
+				ERR(ver,"unknown subsystem version: %04x.%04x, please report.\n",
+					OPTHD.MajorSubsystemVersion,
+					OPTHD.MinorSubsystemVersion );
+				return defaultWinVersion;
+		}
+#undef OPTHD
+	}
+}
+
+
+/**********************************************************************
+ *
+ * Check the version of COMDLG32, SHELL32, COMCTL32 and CTL3D32.
+ * Not functional yet.
+ */
+DWORD VERSION_GetLinkedDllVersion(PDB *pdb)
+{
+	WINE_MODREF *wm;
+    WORD VersionCounter[NB_WINDOWS_VERSIONS];
+
+    memset(VersionCounter, 0, sizeof(VersionCounter));
+
+	VersionCounter[WIN95] = 1;
+	for ( wm = PROCESS_Current()->modref_list; wm; wm=wm->next ) {
+	    if (!(lstrncmpiA(wm->modname, "CTL3D32", 7)))
+			VersionCounter[WIN95]++;
+	}
+
+	return MAKELONG(WIN95, VersionCounter[WIN95]);
+}
+
+
 /**********************************************************************
  *         VERSION_GetVersion
  *
@@ -136,6 +236,7 @@
  * 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 ;)
+ * 5.12/5.00/5.00/4.00		comctl32.dll	NT4 / IE 5.0
  * 6.00/5.00/5.00/4.00						NT 4 driver update (strange numbers)
  * 
  * Common versions:
@@ -147,67 +248,22 @@
  */
 WINDOWS_VERSION VERSION_GetVersion(void)
 {
-    PIMAGE_NT_HEADERS peheader;	
     PDB *pdb = PROCESS_Current();
+    DWORD DllVer;
 
     if (versionForced) /* user has overridden any sensible checks */
         return defaultWinVersion;
-    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 (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(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 (pdb->winver == 0xffff) /* to be determined */
         {
-            if ((peheader->OptionalHeader.MajorImageVersion == 0) &&
-                (peheader->OptionalHeader.SectionAlignment == 4096))
-                return WIN95;
-	    return NT40;
-        }
-        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)
-    {
-        /* 3.1x versions */
-        if (peheader->OptionalHeader.MinorSubsystemVersion <= 11)
-        {
-            if (peheader->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI)
-                return NT351; /* FIXME: NT 3.1 */
+		DllVer = 0/*VERSION_GetLinkedDllVersion(pdb)*/;
+		if (HIWORD(DllVer) > 1)
+			pdb->winver = LOWORD(DllVer);
             else
-		  return WIN31;
+			pdb->winver = VERSION_GetImageVersion(pdb);
         }
-        /* NT 3.51 */
-        if (peheader->OptionalHeader.MinorSubsystemVersion == 50) return NT351;
-        if (peheader->OptionalHeader.MinorSubsystemVersion == 51) return NT351;
-    }
-    if (peheader->OptionalHeader.MajorSubsystemVersion)
-	ERR(ver,"unknown subsystem version: %04x.%04x, please report.\n",
-	    peheader->OptionalHeader.MajorSubsystemVersion,
-	    peheader->OptionalHeader.MinorSubsystemVersion );
-    return defaultWinVersion;
+
+	return pdb->winver;
 }