diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index 66a2570..78af43f 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -1944,7 +1944,8 @@ static void pdb_process_types(const struct msc_debug_info* msc_dbg,
         case 19950410:      /* VC 4.0 */
         case 19951122:
         case 19961031:      /* VC 5.0 / 6.0 */
-        case 19990903:
+        case 19990903:      /* VC 7.0 */
+        case 20040203:      /* VC 8.0 */
             break;
         default:
             ERR("-Unknown type info version %d\n", types.version);
@@ -2184,7 +2185,8 @@ static BOOL pdb_process_internal(const struct process* pcs,
         case 0:            /* VC 4.0 */
         case 19960307:     /* VC 5.0 */
         case 19970606:     /* VC 6.0 */
-        case 19990903:
+        case 19990903:     /* VC 7.0 */
+        case 20040203:     /* VC 8.0 */
             break;
         default:
             ERR("-Unknown symbol info version %d %08x\n",
@@ -2194,11 +2196,14 @@ static BOOL pdb_process_internal(const struct process* pcs,
         pdb_process_symbol_imports(pcs, msc_dbg, &symbols, symbols_image, image, pdb_lookup, module_index);
 
         /* Read global symbol table */
-        modimage = pdb_read_file(image, pdb_lookup, symbols.gsym_file);
+        /* only the low word of gsym_file is the file number for the symbols file. On VC 8.0 the high word
+           is always 0x002a, on VC 7.0 its 0x0000. similarly hash1_file and hash2_file the high word values 
+           for VC 7.0 are 0x38a0 and 0x0c05 and for VC 8.0 they are 0x8800 and 0xc267 respectively. */
+        modimage = pdb_read_file(image, pdb_lookup, symbols.gsym_file & 0x0000ffff);
         if (modimage)
         {
             codeview_snarf(msc_dbg, modimage, 0, 
-                           pdb_get_file_size(pdb_lookup, symbols.gsym_file), NULL);
+                           pdb_get_file_size(pdb_lookup, symbols.gsym_file & 0x0000ffff), NULL);
 
             pdb_free(modimage);
         }
@@ -2231,6 +2236,12 @@ static BOOL pdb_process_internal(const struct process* pcs,
 
                 pdb_free(modimage);
             }
+
+            /* PDB files generated from VC 8.0 use a new format for storing linee no information.
+               The <lineno_size> member of PDB_SYMBOL_EX header is 0 but unknown2 has a value. */
+            if (sfile.unknown2 && sfile.lineno_size == 0)
+                FIXME("Line no info is missing.\n");
+
             file_name = (const char*)file + size;
             file_name += strlen(file_name) + 1;
             file = (BYTE*)((DWORD)(file_name + strlen(file_name) + 1 + 3) & ~3);
@@ -2281,6 +2292,9 @@ static BOOL pdb_process_file(const struct process* pcs,
         msc_dbg->module->module.SourceIndexed = TRUE;
         msc_dbg->module->module.Publics = TRUE;
     }
+    else
+       TRACE("failed to load pdb file.\n");
+
     return ret;
 }
 
