Index: Processor.cs
===================================================================
--- Processor.cs	(revision 1006)
+++ Processor.cs	(working copy)
@@ -162,25 +162,107 @@
 			*flags32 = ecx;
 			flags = (ProcessorFeatureFlags)flags64;
 		}
-		
-		internal unsafe static CString8* GetVendorName ()
-		{
-			UInt32 ebx = 0, ecx = 0, edx = 0;
 
-			// Vendor Name
-			Asm.XOR(R32.EAX, R32.EAX);
-			Asm.CPUID();
-			Asm.MOV(&ebx, R32.EBX);
-			Asm.MOV(&edx, R32.EDX);
-			Asm.MOV(&ecx, R32.ECX);
+        internal unsafe static CString8* GetVendorName()
+        {
+            UInt32 ebx = 0, ecx = 0, edx = 0;
 
-			textBuffer->Clear();
-			textBuffer->AppendSubstring((byte*)&ebx, 0, 4);
-			textBuffer->AppendSubstring((byte*)&edx, 0, 4);
-			textBuffer->AppendSubstring((byte*)&ecx, 0, 4);
-			return CString8.Copy(textBuffer->buffer);
-		}
+            // Vendor Name
+            Asm.XOR(R32.EAX, R32.EAX);
+            Asm.CPUID();
+            Asm.MOV(&ebx, R32.EBX);
+            Asm.MOV(&edx, R32.EDX);
+            Asm.MOV(&ecx, R32.ECX);
 
+            textBuffer->Clear();
+            textBuffer->AppendSubstring((byte*)&ebx, 0, 4);
+            textBuffer->AppendSubstring((byte*)&edx, 0, 4);
+            textBuffer->AppendSubstring((byte*)&ecx, 0, 4);
+            return CString8.Copy(textBuffer->buffer);
+        }
+
+        internal unsafe static CString8* GetIntelFamilyName()
+        {
+            UInt32 family;
+            UInt32 eax = 0;
+
+            // Family Name
+
+            Asm.XOR(R32.EAX, R32.EAX);
+            Asm.INC(R32.EAX);
+            Asm.CPUID();
+            Asm.MOV(&eax, R32.EAX);
+
+            family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0x0F);
+
+            switch (family)
+            {
+                case 0x4:
+                    return CString8.Copy("Intel Family 486");
+                case 0x5:
+                    return CString8.Copy("Intel Family 586");
+                case 0x6:
+                    return CString8.Copy("Intel Family 686");
+                case 0x7:
+                    return CString8.Copy("Intel Family Itanium");
+                case 0xF:
+                    return CString8.Copy("Intel Family Extended");
+                default:
+                    return CString8.Copy("Unknown Intel Family");
+            }
+        }
+
+        internal unsafe static CString8* GetIntelModelName()
+        {
+            UInt32 family, model;
+            UInt32 eax = 0;
+
+            // Model Name
+
+            Asm.XOR(R32.EAX, R32.EAX);
+            Asm.INC(R32.EAX);
+            Asm.CPUID();
+            Asm.MOV(&eax, R32.EAX);
+
+            model = ((eax >> 4) & 0x0F) | ((eax >> 12) & 0x0F);
+            family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0x0F);
+
+            switch (family)
+            {
+                case 0x4:
+                    return CString8.Copy("Intel 486");
+                case 0x5:
+                    return CString8.Copy("Intel 586");
+                case 0x6:
+                    switch (model)
+                    {
+                        case 0x1:
+                            return CString8.Copy("Intel Pentium Pro");
+                        case 0x3:
+                            return CString8.Copy("Intel Pentium II");
+                        case 0x5:
+                        case 0x6:
+                            return CString8.Copy("Intel Celeron");
+                        case 0x7:
+                        case 0x8:
+                        case 0xA:
+                        case 0xB:
+                            return CString8.Copy("Intel Pentium III");
+                        case 0x9:
+                        case 0xD:
+                            return CString8.Copy("Intel Pentium M");
+                         default:
+                            return CString8.Copy("Unknown Intel P6 Family");
+                     }
+                case 0x7:
+                    return CString8.Copy("Intel Itanium");
+                case 0xF:
+                    return CString8.Copy("Intel Extended");
+                default:
+                    return CString8.Copy("Unknown Intel Family");
+            }
+        }
+
 		internal unsafe static CString8* GetBrandName()
 		{
 			UInt32 eax = 0, ebx = 0, ecx = 0, edx = 0;
@@ -195,7 +277,8 @@
 			if ((ebx & 0xff) == 0)
 			{
 				return CString8.Copy("Unknown");
-			} else
+			} 
+            else
 			{
 				textBuffer->Clear();
 				for (uint i = 0x80000002; i <= 0x80000004; i++)
@@ -259,19 +342,31 @@
 				UInt32 model;
 				
 				textBuffer = StringBuilder.CREATE((uint)(20));
-				vendorName	= GetVendorName ();
-				brandName	= GetBrandName ();
 
+                vendorName	= GetVendorName ();
+				brandName = GetBrandName ();
+
 				GetProcessorInfo(out stepping, out family, out model, out featureFlags);
 
 				if (0 != (featureFlags & ProcessorFeatureFlags.IA64))
 					archType	= ProcessorType.IA64;
 				else
 					archType	= ProcessorType.IA32;
-							
-				familyName = CString8.Copy("Not implemented yet");
-				modelName = CString8.Copy("Not implemented yet");
 
+
+                if (vendorName == CString8.Copy("GenuineIntel"))
+                {
+                    familyName = GetIntelFamilyName();
+                    modelName = GetIntelModelName();
+                }
+                else
+                {
+                    familyName = CString8.Copy("Not implemented yet");
+                    modelName = CString8.Copy("Not implemented yet");
+                }
+				
+				
+
 				ulong flags = ((ulong)featureFlags) & ((ulong)ProcessorFeatureFlags.ReservedFlagsMask);
 				uint featureCount = MemoryUtil.BitCount(flags);
 
