home *** CD-ROM | disk | FTP | other *** search
- /*
- SpeedswitchXP V1.4
- - Windows XP CPU Frequency Control for Notebooks -
-
- Copyright(c) 2002-2004 Christian Diefer
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2 as
- published by the Free Software Foundation.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
- #include "stdafx.h"
- #include "SpeedswitchXP.h"
- #include "CPUData.h"
- #include "cpuid.h"
- #include "speed.h"
-
- // CCPUData dialog
-
- IMPLEMENT_DYNAMIC(CCPUData, CDialog)
- CCPUData::CCPUData(CWnd* pParent /*=NULL*/)
- : CDialog(CCPUData::IDD, pParent)
- , m_szSupportsCPUID(_T(""))
- , m_szVendor(_T(""))
- , m_szFeatures(_T(""))
- , m_iMaxIDVal(0)
- , m_szManufacturer(_T(""))
- , m_iFamily(0)
- , m_iModel(0)
- , m_iStepping(0)
- , m_iFType(0)
- , m_szMaxExLevel(_T(""))
- , m_szExCPUName(_T(""))
- , m_szExFeatures(_T(""))
- , m_iBrandID(0)
- , m_szBrandStr(_T(""))
- , m_szExFeatures2(_T(""))
- , m_szFlags(_T(""))
- { }
-
- CCPUData::~CCPUData()
- { }
-
- void CCPUData::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- DDX_Text(pDX, IDC_EDIT1, m_szSupportsCPUID);
- DDX_Text(pDX, IDC_EDIT4, m_szVendor);
- DDX_Text(pDX, IDC_EDIT5, m_szFeatures);
- DDX_Text(pDX, IDC_EDIT6, m_iMaxIDVal);
- DDX_Text(pDX, IDC_EDIT7, m_szManufacturer);
- DDX_Text(pDX, IDC_EDIT9, m_iFamily);
- DDX_Text(pDX, IDC_EDIT10, m_iModel);
- DDX_Text(pDX, IDC_EDIT11, m_iStepping);
- DDX_Text(pDX, IDC_EDIT13, m_iFType);
- DDX_Text(pDX, IDC_EDIT14, m_szMaxExLevel);
- DDX_Text(pDX, IDC_EDIT15, m_szExCPUName);
- DDX_Text(pDX, IDC_EDIT2, m_szExFeatures);
- DDX_Text(pDX, IDC_EDIT8, m_iBrandID);
- DDX_Text(pDX, IDC_EDIT12, m_szBrandStr);
- DDX_Text(pDX, IDC_EDIT19, m_szExFeatures2);
- DDX_Text(pDX, IDC_EDIT3, m_szFlags);
- DDX_Control(pDX, IDC_EDIT3, m_eFeatures);
- }
-
- BEGIN_MESSAGE_MAP(CCPUData, CDialog)
- END_MESSAGE_MAP()
-
- // CCPUData message handlers
-
- BOOL CCPUData::OnInitDialog()
- {
- CDialog::OnInitDialog();
- return TRUE;
- }
-
- void CCPUData::setVars()
- {
- init();
- getCPUType();
-
- m_szExCPUName = cpuStr;
- m_szVendor = vendorID;
- m_iFType = typid;
- m_iFamily = familyid;
- m_iModel = modelid;
- m_iStepping = steppingid;
- m_szSupportsCPUID = (supportsCPUID ? "Yes" : "No");
- m_iMaxIDVal = maxIDVal;
- m_iBrandID = brandID & 255;
- m_szBrandStr = brandStr;
-
- char text[64];
- wsprintf( text, "0x%08x", features );
- m_szFeatures = text;
-
- wsprintf( text, "0x%08x", exfeatures );
- m_szExFeatures = text;
-
- wsprintf( text, "0x%08x", exfeatures2 );
- m_szExFeatures2 = text;
-
- if( exlevel >= 0x80000000 )
- wsprintf( text, "0x%08x", exlevel );
- else
- strcpy( text, "---" );
- m_szMaxExLevel = text;
-
- memset( &lf, 0, sizeof(LOGFONT) );
-
- // CFont* pFont = m_eFeatures.GetFont();
- // if( pFont != NULL )
- // pFont->GetObject( sizeof(LOGFONT), &lf );
- // else
- // ::GetObject( GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf );
-
- lf.lfHeight = -13;
- lf.lfWidth = 0;
- lf.lfEscapement = 0;
- lf.lfOrientation = 0;
- lf.lfWeight = 400;
- lf.lfItalic = 0;
- lf.lfUnderline = 0;
- lf.lfStrikeOut = 0;
- lf.lfCharSet = 0;
- lf.lfOutPrecision = 1;
- lf.lfClipPrecision = 2;
- lf.lfQuality = 1;
- lf.lfPitchAndFamily = 49;
- strcpy( lf.lfFaceName, "Courier" );
-
- mf.DeleteObject();
- mf.CreateFontIndirect( &lf );
- m_eFeatures.SetFont( &mf, true );
- m_eFeatures.SetLimitText( 64000 );
-
- *flagText = '\0';
-
- if( f_fpu ) Message( "FPU - Floating Point Unit" );
- if( f_vme ) Message( "VME - V86 Mode Extensions" );
- if( f_de ) Message( "DE - Debug Extensions" );
- if( f_pse ) Message( "PSE - Page Size Extensions" );
- if( f_tsc ) Message( "TSC - Timestamp Counter" );
- if( f_msr ) Message( "MSR - Model Specific Registers" );
- if( f_pae ) Message( "PAE - Physical Address Extensions" );
- if( f_mce ) Message( "MCE - Machine Check Exception" );
- if( f_c8x ) Message( "C8X - CMPXCHG8B Instruction" );
- if( f_apic ) Message( "APIC - Local APIC" );
- if( f_sep ) Message( "SEP - Fast System Call" );
- if( f_mtrr ) Message( "MTRR - Memory Type Range Registers" );
- if( f_pge ) Message( "PGE - Page Global Enable" );
- if( f_mca ) Message( "MCA - Machine Check Architecture" );
- if( f_cmov ) Message( "CMOV - CMOV Instructions" );
- if( f_pse36 ) Message( "PSE36 - 36bit Page Size Extensions" );
- if( f_psn ) Message( "PSN - Processor Serial Number" );
- if( f_mmx ) Message( "MMX - MMX Instructions" );
-
- switch( vendor )
- {
- case 0: m_szManufacturer = "Intel";
- if( f_acpi ) Message( "ACPI - ACPI Support" );
- if( f_pat ) Message( "PAT - Page Attribute Table" );
- if( f_fxsr ) Message( "FXSR - FXSAVE/FXRSTOR Instructions" );
- if( f_sse ) Message( "SSE - SSE Instructions" );
- if( f_sse2 ) Message( "SSE2 - SSE2 Instructions" );
- if( f_ss ) Message( "SS - Self Snoop" );
- if( f_htt ) Message( "HTT - Hyperthreading Technology" );
- if( f_tm ) Message( "TM - Thermal Monitoring" );
- if( f_ia64 ) Message( "IA64 - IA64 Instructions" );
- break;
-
- case 1: m_szManufacturer = "AMD";
- if( f_fsc ) Message( "FSC - Fast System Call" );
- if( f_fcmov ) Message( "FCMOV - FCMOV Instruction" );
- if( f_mmxext ) Message( "MMXE - Extended MMX Instructions" );
- if( f_sse ) Message( "SSE - SSE Instructions" );
- if( f_sse2 ) Message( "SSE2 - SSE2 Instructions" );
- if( f_3dnowext ) Message( "3DNE - Extended 3DNow! Instructions" );
- if( f_3dnow ) Message( "3DNOW - 3DNow! Instructions" );
- break;
-
- case 2: m_szManufacturer = "Cyrix";
- if( f_cxmmx ) Message( "CXMMX - Cyrix MMX Instructions" );
- break;
-
- case 3: m_szManufacturer = "Transmeta";
- break;
-
- case 4: m_szManufacturer = "Centaur";
- if( f_3dnow ) Message( "3DNOW - 3DNow! Instructions" );
- break;
-
- case 5: m_szManufacturer = "Rise";
- break;
-
- case 6: m_szManufacturer = "UMC";
- break;
-
- case 7: m_szManufacturer = "NexGen";
- break;
-
- default:m_szManufacturer = "Unknown";
- break;
- }
-
- m_szFlags = flagText;
- }
-
- void CCPUData::getCPUType()
- {
- cpuType = wincpuid();
- supportsCPUID = wincpuidsupport();
-
- switch( cpuType & (CLONE_MASK-1) )
- {
- case 0: strcpy( cpuStr, "8086" );
- break;
-
- case 1: strcpy( cpuStr, "80186" );
- break;
-
- case 2: strcpy( cpuStr, "80286" );
- break;
-
- case 3: strcpy( cpuStr, "80386" );
- break;
-
- case 4: strcpy( cpuStr, "80486" );
- break;
-
- case 5: strcpy( cpuStr, "Pentium" );
- break;
-
- case 6: strcpy( cpuStr, "Pentium Pro" );
- break;
-
- case 15:strcpy( cpuStr, "Pentium 4" );
- break;
-
- default:strcpy( cpuStr, "Unknown" );
- break;
- }
-
- familyid = cpuType & (CLONE_MASK-1);
-
- if( !supportsCPUID )
- return;
-
- getCPUFeatures();
-
- typid = (family & (3<<12))>>12;
- familyid = (family&(15<<8))>>8;
- modelid = (family&(15<<4))>>4;
- steppingid = family&15;
-
- f_fpu = features & 1;
- f_vme = features & 2;
- f_de = features & 4;
- f_pse = features & 8;
- f_tsc = features & 16;
- f_msr = features & 32;
- f_pae = features & 64;
- f_mce = features & 128;
- f_c8x = features & (1<<8);
- f_apic = features & (1<<9);
- f_sep = features & (1<<11);
- f_mtrr = features & (1<<12);
- f_pge = features & 8192;
- f_mca = features & 16384;
- f_cmov = features & 32768;
- f_pse36 = features & (1<<17);
- f_psn = features & (1<<18);
- f_mmx = features & (1<<23);
-
- if( !stricmp((char*)vendorID,"GenuineIntel") )
- {
- vendor = 0; // Intel
- f_pat = features & (1<<16);
- f_acpi = features & (1<<22);
- f_fxsr = features & (1<<24);
- f_sse = features & (1<<25);
- f_sse2 = features & (1<<26);
- f_ss = features & (1<<27);
- f_htt = features & (1<<28);
- f_tm = features & (1<<29);
- f_ia64 = features & (1<<30);
- identifyIntel();
- }
- else if( !stricmp((char*)vendorID,"AuthenticAMD") )
- {
- vendor = 1; // AMD
- f_fsc = features & (1<<10);
- f_fcmov = features & (1<<16);
- f_mmxext = features & (1<<22);
- f_sse = features & (1<<25);
- f_sse2 = features & (1<<26);
- // f_3dnowext = features & (1<<30);
- // f_3dnow = features & (1<<31);
- identifyAMD();
- }
- else if( !stricmp((char*)vendorID,"CyrixInstead") )
- {
- vendor = 2; // Cyrix
- f_cxmmx = features & (1<<24);
- }
- else if( !stricmp((char*)vendorID,"GenuineTMx86") )
- {
- vendor = 3; // Transmeta
- }
- else if( !stricmp((char*)vendorID,"CentaurHauls") )
- {
- vendor = 4; // Centaur
- f_3dnow = features & (1<<31);
- }
- else if( !stricmp((char*)vendorID,"RISERISERISE") )
- {
- vendor = 5; // Rise
- }
- else if( !stricmp((char*)vendorID,"UMC UMC UMC ") )
- {
- vendor = 6; // UMC
- }
- else if( !stricmp((char*)vendorID,"NexGenDriven") )
- {
- vendor = 7; // NexGen
- }
-
- DWORD exl;
-
- __asm {
- pushad
- mov eax,0x80000000
- CPU_ID
- mov dword ptr exl,eax
- popad
- }
-
- exlevel = exl;
-
- if( exlevel>=0x80000001 && vendor==1 ) // nur bei AMD
- {
- DWORD amdflags;
-
- __asm {
- pushad
- mov eax, 0x80000001
- CPU_ID
- mov dword ptr amdflags, edx
- popad
- }
-
- exfeatures2 = amdflags;
-
- f_3dnow = amdflags & (1<<31);
- f_3dnowext = amdflags & (1<<30);
- }
-
- if( exlevel >= 0x80000004 )
- {
- DWORD pstr[12];
-
- __asm {
- pushad
- mov eax, 0x80000002
- CPU_ID
- mov dword ptr pstr, eax
- mov dword ptr pstr+4, ebx
- mov dword ptr pstr+8, ecx
- mov dword ptr pstr+12, edx
- mov eax, 0x80000003
- CPU_ID
- mov dword ptr pstr+16, eax
- mov dword ptr pstr+20, ebx
- mov dword ptr pstr+24, ecx
- mov dword ptr pstr+28, edx
- mov eax, 0x80000004
- CPU_ID
- mov dword ptr pstr+32, eax
- mov dword ptr pstr+36, ebx
- mov dword ptr pstr+40, ecx
- mov dword ptr pstr+44, edx
- popad
- }
-
- strcpy( cpuStr, (char*)pstr );
- }
- }
-
- void CCPUData::identifyIntel()
- {
- switch( familyid )
- {
- case 4: switch( modelid )
- {
- case 0:
- case 1: strcpy( cpuStr, "80486DX" );
- break;
-
- case 2: strcpy( cpuStr, "80486SX" );
- break;
-
- case 3: strcpy( cpuStr, "80487/DX2/DX2 Overdrive" );
- break;
-
- case 4: strcpy( cpuStr, "80486SL" );
- break;
-
- case 5: strcpy( cpuStr, "80486SX2" );
- break;
-
- case 6: strcpy( cpuStr, "80486DX (write-back)" );
- break;
-
- case 7: strcpy( cpuStr, "80486DX4/DX4 Overdrive" );
- break;
-
- default:strcpy( cpuStr, "Unknown 80486" );
- break;
- }
- break;
-
- case 5: switch( modelid )
- {
- case 1: if( typid == 1 )
- strcpy( cpuStr, "Pentium OverDrive (60,66)" );
- else
- strcpy( cpuStr, "Pentium (60,66)" );
- break;
-
- case 2: if( typid == 1 )
- strcpy( cpuStr, "Pentium (75,90,100,120,133,150,166,200)" );
- else
- strcpy( cpuStr, "Pentium OverDrive (75,90,100,120,133,150,166,200)" );
- break;
-
- case 3: strcpy( cpuStr, "Pentium Overdrive (for 80486)" );
- break;
-
- case 4: if( typid == 1 )
- strcpy( cpuStr, "Pentium OverDrive MMC (75,90,100,120,133)" );
- else
- strcpy( cpuStr, "Pentium MMX (166,200)" );
- break;
-
- default:strcpy( cpuStr, "Unknown Pentium" );
- break;
- }
- break;
-
- case 6: switch( modelid )
- {
- case 0: strcpy( cpuStr, "Pentium Pro (A-Step)" );
- break;
-
- case 1: strcpy( cpuStr, "Pentium Pro" );
- break;
-
- case 3: if( typid == 1 )
- strcpy( cpuStr, "Pentium II OverDrive" );
- else
- strcpy( cpuStr, "Pentium II (Klamath)" );
- break;
-
- case 5: strcpy( cpuStr, "Pentium II/Pentium II Xeon/Celeron (0.25╡m)" );
- break;
-
- case 6: strcpy( cpuStr, "Celeron (model 6)" );
- break;
-
- case 7: strcpy( cpuStr, "Pentium III/Pentium III Xeon (0.25╡m)" );
- break;
-
- case 8: strcpy( cpuStr, "Pentium III/Pentium III Xeon/Celeron (Coppermine)" );
- break;
-
- case 9: strcpy( cpuStr, "Pentium-M (Banias)" );
- break;
-
- case 10:strcpy( cpuStr, "Pentium III/PIII Xeon (Coppermine)" );
- break;
-
- case 11:strcpy( cpuStr, "Pentium III (Tualatin)" );
- break;
-
- default:strcpy( cpuStr, "Unknown Pentium Pro/II/III" );
- break;
- }
- break;
-
- case 15:switch( modelid )
- {
- case 0: strcpy( cpuStr, "Pentium 4 Willamette" );
- break;
-
- case 1: strcpy( cpuStr, "Pentium 4 Willamette" );
- break;
-
- case 2: strcpy( cpuStr, "Pentium 4 Northwood" );
- break;
-
- case 3: strcpy( cpuStr, "Pentium 4 Prescott" );
- break;
-
- default:strcpy( cpuStr, "Unknown Pentium 4" );
- break;
- }
- break;
-
- default:strcpy( cpuStr, "Unknown Intel CPU" );
- break;
- }
-
- char* bstr = "";
-
- switch( brandID & 255 )
- {
- case 0: brandStr = "---";
- break;
-
- case 1: bstr = "Celeron (Coppermine)";
- break;
-
- case 2: bstr = "Pentium III (Coppermine)";
- break;
-
- case 3: bstr = "Celeron/Pentium III Xeon (Coppermine)";
- break;
-
- case 4: bstr = "Pentium III (Tualatin)";
- break;
-
- case 6: bstr = "Mobile Pentium III-M (Tualatin)";
- break;
-
- case 7: bstr = "Mobile Celeron (Tualatin)";
- break;
-
- case 8: if( family == 0xf24 )
- bstr = "Mobile Celeron 4 (Northwood)";
- else
- bstr = "Pentium 4 (Willamette)";
- break;
-
- case 9: bstr = "Pentium 4 (Northwood)";
- break;
-
- case 10:bstr = "Celeron 4 (Willamette)";
- break;
-
- case 11:bstr = "Pentium 4 Xeon (Northwood/Willamette)";
- break;
-
- case 12:bstr = "Pentium 4 Xeon MP (Northwood)";
- break;
-
- case 14:bstr = "Mobile Pentium 4-M (Northwood)";
- break;
-
- case 15:if( family == 0xf27 )
- bstr = "Mobile Celeron 4 (Northwood)";
- else
- bstr = "Mobile Pentium 4-M (Northwood)";
- break;
-
- case 22:bstr = "Pentium-M (Banias)";
- break;
-
- default:brandStr = "---";
- break;
- }
-
- if( *bstr )
- {
- strcpy( cpuStr, bstr );
- brandStr = bstr;
- }
- }
-
- void CCPUData::identifyAMD()
- {
- switch( familyid )
- {
- case 4: switch( modelid )
- {
- case 3: strcpy( cpuStr, "486DX/2" );
- break;
-
- case 7: strcpy( cpuStr, "486DX/2-WB" );
- break;
-
- case 8: strcpy( cpuStr, "486DX/4" );
- break;
-
- case 9: strcpy( cpuStr, "486DX/4-WB" );
- break;
-
- case 14:strcpy( cpuStr, "Am5x86-WT" );
- break;
-
- case 15:strcpy( cpuStr, "Am5x86-WB" );
- break;
-
- default:strcpy( cpuStr, "Unknown 486/5x86 CPU" );
- break;
- }
- break;
-
- case 5: switch( modelid )
- {
- case 0: strcpy( cpuStr, "K5/SSA5 (PR75...PR100)" );
- break;
-
- case 1: strcpy( cpuStr, "K5 (PR120/PR133)" );
- break;
-
- case 2: strcpy( cpuStr, "K5 (PR150/PR166)" );
- break;
-
- case 3: strcpy( cpuStr, "K5 (PR200)" );
- break;
-
- case 6: strcpy( cpuStr, "K6 (166...233MHz)" );
- break;
-
- case 7: strcpy( cpuStr, "K6 (266...300MHz)" );
- break;
-
- case 8: strcpy( cpuStr, "K6-2 w/ 3DNow!" );
- break;
-
- case 9: strcpy( cpuStr, "K6-3 w/ 3DNow!" );
- break;
-
- case 13:strcpy( cpuStr, "K6-2+ / K6-III+ w/ 3DNow!" );
- break;
-
- default:strcpy( cpuStr, "Unknown K6 CPU" );
- break;
- }
- break;
-
- case 6: switch( modelid )
- {
- case 0:
- case 1: strcpy( cpuStr, "Athlon (25um)" );
- break;
-
- case 2: strcpy( cpuStr, "Athlon (18um)" );
- break;
-
- case 3: strcpy( cpuStr, "Duron" );
- break;
-
- case 4: strcpy( cpuStr, "Athlon (Thunderbird)" );
- break;
-
- case 6: strcpy( cpuStr, "Athlon (Palomino)" );
- break;
-
- case 7: strcpy( cpuStr, "Duron (Morgan)" );
- break;
-
- default:strcpy( cpuStr, "Unknown Athlon" );
- break;
- }
- break;
-
- default:strcpy( cpuStr, "Unknown AMD CPU" );
- break;
- }
- }
-
- void CCPUData::identifyCyrix()
- {
- switch( familyid )
- {
- case 4: switch( modelid )
- {
- case 4: strcpy( cpuStr, "MediaGX" );
- break;
-
- default:strcpy( cpuStr, "Unknown Cyrix CPU" );
- break;
- }
- break;
-
- case 5: switch( modelid )
- {
- case 2: strcpy( cpuStr, "6x86/6x86L" );
- break;
-
- case 4: strcpy( cpuStr, "MediaGX MMX enh." );
- break;
-
- default:strcpy( cpuStr, "Unknown Cyrix CPU" );
- break;
- }
- break;
-
- case 6: switch( modelid )
- {
- case 0: strcpy( cpuStr, "m II" );
- break;
-
- case 5: strcpy( cpuStr, "VIA Cyrix M2 core" );
- break;
-
- case 6: strcpy( cpuStr, "WinChip C5A" );
- break;
-
- case 7: strcpy( cpuStr, "WinChip C5B" );
- break;
-
- default:strcpy( cpuStr, "Unknown Cyrix CPU" );
- break;
- }
- break;
-
- default:strcpy( cpuStr, "Unknown Cyrix CPU" );
- break;
- }
- }
-
- void CCPUData::init()
- {
- features = 0;
- exfeatures = 0;
- typid = 0;
- modelid = 0;
- steppingid = 0;
- *vendorID = '\0';
- vendor = -1;
- maxIDVal = 0;
- exlevel = 0;
- brandID = 0;
- exfeatures2 = 0;
- brandStr = "";
-
- f_fpu = f_vme = f_de = f_pse = f_tsc = f_msr = f_pae = f_mce = f_c8x = f_apic = f_sep =
- f_mtrr = f_pge = f_mca = f_cmov = f_pse36 = f_psn = f_mmx = f_pat = f_fxsr = f_sse = f_sse2 =
- f_fsc = f_fcmov = f_mmxext = f_3dnowext = f_3dnow = f_cxmmx = f_ss = f_htt = f_tm = f_ia64 =
- f_acpi = FALSE;
- }
-
- void CCPUData::getCPUFeatures()
- {
- DWORD cpuff = 0;
- DWORD cpuffext = 0;
- DWORD bid = 0;
- DWORD fam = 0;
- BYTE vid[16] = "------------";
- DWORD maxl = 0;
-
- __asm {
- pushad
- xor eax,eax
- CPU_ID
- mov dword ptr vid,ebx
- mov dword ptr vid[+4],edx
- mov dword ptr vid[+8],ecx
- mov dword ptr maxl,eax
-
- cmp eax,1
- jl end_cpuff
- xor eax,eax
- inc eax
- CPU_ID
- mov cpuff,edx
- mov cpuffext,ecx
- mov bid,ebx
- mov fam,eax
-
- end_cpuff:
- popad
- }
-
- strcpy( vendorID, (char*)vid );
- family = fam;
- brandID = bid;
- features = cpuff;
- exfeatures = cpuffext;
- maxIDVal = maxl;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- void CCPUData::Message( LPCTSTR lpszMessage )
- {
- strcat( flagText, lpszMessage );
- strcat( flagText, "\r\n" );
- }
-
-