rt

解决方案 »

  1.   

    用bcb写的,大致差不多,调用汇编!
    以前收集的资料:
    //------CPUID Instruction Demo Program------------
    #include 
    #include 
    #pragma hdrstop
    //------------------------------------------------
    #pragma inline
    #pragma argsused
    int main(int argc, char **argv)
    {
    char OEMString[13];int iEAXValue,iEBXValue,iECXValue,iEDXValue;
    _asm {
    mov eax,0
    cpuid
    mov DWORD PTR OEMString,ebx
    mov DWORD PTR OEMString+4,edx
    mov DWORD PTR OEMString+8,ecx
    mov BYTE PTR OEMString+12,0
    }cout< < "This CPU 's OEM String is:"< < OEMString< < endl;_asm {
    mov eax,1
    cpuid
    mov iEAXValue,eax
    mov iEBXValue,ebx
    mov iECXValue,ecx
    mov iEDXValue,edx
    }if(iEDXValue&0x800000)
    cout < < "This is MMX CPU"< < endl;
    else
    cout < < "None MMX Support."< < endl;int iCPUFamily=(0xf00 & iEAXValue) > >8;
    cout < < "CPU Family is:"< < iCPUFamily< < endl;_asm{
    mov eax,2
    CPUID
    }
    if(_AL==1)
    cout < < "Pentium Pro or Pentium II Found";getch();
    return 0;
    }
      

  2.   

    // test.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include "tchar.h"
    #include "windows.h"int main(int argc, char* argv[])
    {
     DWORD dwOldFlag, dwFlag;
     TCHAR m_szCPUName[1024];
     TCHAR m_szOEMString[1024];
     DWORD m_nFamily;
     DWORD m_nType,m_nModel;
     bool m_bFPU,m_bPSN,m_bMMX;
     DWORD m_dwSerialNumber[3];
     _asm
     {
      pushfd
       //保存老的eflag
       mov edx, [esp]
       mov dwOldFlag, edx
       //修改eflag
       xor DWORD PTR [esp], 0x200000
       popfd
       
       //得到新的eflag
       pushfd
       pop eax
       mov dwFlag, eax
       
       //恢复eflag
       push edx
       popfd
     }
     if(dwOldFlag == dwFlag)  // 386
     {
      lstrcpy(m_szOEMString, _T("80386"));
      lstrcpy(m_szCPUName, _T("80386"));
      m_nFamily=3;
      m_nType=0;//PROCESSOR_TYPE_OEM;
      m_nModel=0;
     }
     else
     {
      // OEM String
      ::ZeroMemory(m_szOEMString, sizeof(m_szOEMString));
      DWORD dwTemp=(DWORD)m_szOEMString;
      DWORD dwTemp2, dwTemp3;
      _asm
      {
       XOR EAX, EAX
        CPUID
        MOV EDI, dwTemp
        MOV EAX, EBX
        shr eax, 16
    #ifdef UNICODE
        mov [EDI+0*2], bl
        mov [EDI+1*2], bh
        mov [EDI+2*2], al
        mov [EDI+3*2], ah
    #else
        mov [EDI+0], bl
        mov [EDI+1], bh
        mov [EDI+2], al
        mov [EDI+3], ah
    #endif
        MOV EAX, EDX
        shr eax, 16
    #ifdef UNICODE
        mov [EDI+4*2], dl
        mov [EDI+5*2], dh
        mov [EDI+6*2], al
        mov [EDI+7*2], ah
    #else
        mov [EDI+4], dl
        mov [EDI+5], dh
        mov [EDI+6], al
        mov [EDI+7], ah
    #endif
        MOV EAX, ECX
        shr eax, 16
    #ifdef UNICODE
        mov [EDI+8*2], cl
        mov [EDI+9*2], ch
        mov [EDI+10*2], al
        mov [EDI+11*2], ah
    #else
        mov [EDI+8], cl
        mov [EDI+9], ch
        mov [EDI+10], al
        mov [EDI+11], ah
    #endif
      }
      //CPU Type
      _asm
      {
       mov eax, 1
        cpuid
        mov dwTemp, eax
        mov dwTemp2, edx
      }
    #pragma pack(push,1)
      typedef struct tagPROCESSORVERSIONINFO
      {
       unsigned long SteppingID : 4;
       unsigned long Model : 4;
       unsigned long Family : 4;
       unsigned long Type : 2;
       unsigned long Reserve1 : 2;
       unsigned long ExtendModel : 4;
       unsigned long ExtendFamily : 8;
       unsigned long Reserve2 : 4;
      }PROCESSORVERSIONINFO, FAR * LPPROCESSORVERSIONINFO;
    #pragma pack(pop)
      LPPROCESSORVERSIONINFO pinfo=(LPPROCESSORVERSIONINFO)&dwTemp;
      m_nFamily=pinfo->Family;
      m_nFamily+=pinfo->ExtendFamily * 16;
      m_nModel=pinfo->Model;
      m_nModel+=pinfo->ExtendModel * 16;
      m_nType=pinfo->Type;
      if((dwTemp2 & 1) ==1)
       m_bFPU=true;
      else
       m_bFPU=false;
      dwTemp2=dwTemp2>>18;
      if((dwTemp2 & 1) ==1)
       m_bPSN=true;
      else
       m_bPSN=false;
      dwTemp2=dwTemp2>>5;
      if((dwTemp2 & 1) ==1)
       m_bMMX=true;
      else
       m_bMMX=false;
      //取序列号
      if(m_bPSN)
      {
       _asm
       {
        mov eax, 0x01
         cpuid
         mov dwTemp3, eax
         mov eax, 0x03
         cpuid
         mov dwTemp2, edx
         mov dwTemp, ecx
       }
       m_dwSerialNumber[2]=dwTemp3;
       m_dwSerialNumber[1]=dwTemp2;
       m_dwSerialNumber[0]=dwTemp;
      }
      //取cache和tlb信息
      if(m_nFamily>5)
      {
       _asm
       {
        mov eax, 2
         cpuid
       }
      }
      if(lstrcmp(m_szOEMString, _T("CyrixInstead"))==0) //Cyrix
      {
       if(m_nFamily==4)
        lstrcpy(m_szCPUName, _T("MediaGX"));
       else if(m_nFamily==5)
       {
        if(m_nModel==2)
         lstrcpy(m_szCPUName, _T("6x86"));
        else if(m_nModel==4)
         lstrcpy(m_szCPUName, _T("GXm"));
        else
         lstrcpy(m_szCPUName, _T("Unknown"));
       }
       else if(m_nFamily==6)
        lstrcpy(m_szCPUName, _T("6x86MX"));
       else
        lstrcpy(m_szCPUName, _T("Unknown"));
      }
      else if(lstrcmp(m_szOEMString, _T("NexGenDriven"))==0) // NexGen
      {
       if(m_nFamily==5)
        lstrcpy(m_szCPUName, _T("Nx586"));
       else
        lstrcpy(m_szCPUName, _T("Unknown"));
      }
      else if(lstrcmp(m_szOEMString, _T("UMC UMC UMC"))==0) // UMC
      {
       if(m_nFamily==4)
       {
        if(m_nModel==1)
         lstrcpy(m_szCPUName, _T("U5D"));
        else if(m_nModel==2)
         lstrcpy(m_szCPUName, _T("U5S"));
        else
         lstrcpy(m_szCPUName, _T("Unknown"));
       }
       else
        lstrcpy(m_szCPUName, _T("Unknown"));
      }
      else if(lstrcmp(m_szOEMString, _T("AuthenticAMD"))==0) // AMD
      {
       if(m_nFamily==4)
       {
        if(m_nModel==3)
         lstrcpy(m_szCPUName, _T("486DX2WT"));
        else if(m_nModel==7)
         lstrcpy(m_szCPUName, _T("486DX2WB"));
        else if(m_nModel==8)
         lstrcpy(m_szCPUName, _T("486DX4WT"));
        else if(m_nModel==9)
         lstrcpy(m_szCPUName, _T("486DX4WB"));
        else if(m_nModel==0x0e)
         lstrcpy(m_szCPUName, _T("5x86WT"));
        else if(m_nModel==0x0f)
         lstrcpy(m_szCPUName, _T("5x86WB"));
        else
         lstrcpy(m_szCPUName, _T("486"));
       }
       else if(m_nFamily==5)
       {
        if(m_nModel==0)
         lstrcpy(m_szCPUName, _T("K5/SS"));
        else if(m_nModel==1 || m_nModel==2 || m_nModel==3)
         lstrcpy(m_szCPUName, _T("K5"));
        else if(m_nModel==6 || m_nModel==7)
         lstrcpy(m_szCPUName, _T("K6"));
        else if(m_nModel==8)
         lstrcpy(m_szCPUName, _T("K6-2"));
        else if(m_nModel==9)
         lstrcpy(m_szCPUName, _T("K6-III"));
        else
         lstrcpy(m_szCPUName, _T("K5/K6"));
       }
       else if(m_nFamily==6)
       {
        if(m_nModel==0)
         lstrcpy(m_szCPUName, _T("K7 stylebook"));
        else
         lstrcpy(m_szCPUName, _T("K7"));
       }
       else
        lstrcpy(m_szCPUName, _T("Unknown"));
      }
      else if(lstrcmp(m_szOEMString, _T("CentaurHauls"))==0) // IDT
      {
       if(m_nFamily==5)
       {
        if(m_nModel==4)
         lstrcpy(m_szCPUName, _T("WinChip C6"));
        else if(m_nModel==8)
         lstrcpy(m_szCPUName, _T("WinChip 2"));
        else
         lstrcpy(m_szCPUName, _T("Unknown"));
       }
       else
        lstrcpy(m_szCPUName, _T("Unknown"));
      }
      else if(lstrcmp(m_szOEMString, _T("RiseRiseRise"))==0) // Rise
      {
       if(m_nFamily==5)
       {
        if(m_nModel==0)
         lstrcpy(m_szCPUName, _T("mP6"));
        else
         lstrcpy(m_szCPUName, _T("Unknown"));
       }
       else
        lstrcpy(m_szCPUName, _T("Unknown"));
      }
      else if(lstrcmp(m_szOEMString, _T("GenuineIntel"))==0) // Intel
      {
       if(m_nFamily==4)
       {
        if(m_nModel==0 || m_nModel==1)
         lstrcpy(m_szCPUName, _T("486DX"));
        else if(m_nModel==2)
         lstrcpy(m_szCPUName, _T("486SX"));
        else if(m_nModel==3)
         lstrcpy(m_szCPUName, _T("486DX2"));
        else if(m_nModel==4)
         lstrcpy(m_szCPUName, _T("486SL"));
        else if(m_nModel==5)
         lstrcpy(m_szCPUName, _T("486SX2"));
        else if(m_nModel==7)
         lstrcpy(m_szCPUName, _T("486DX2_WB"));
        else if(m_nModel==8)
         lstrcpy(m_szCPUName, _T("486DX4"));
        else
         lstrcpy(m_szCPUName, _T("486"));
       }
       else if(m_nFamily==5)
       {
        if(m_nModel==1)
         lstrcpy(m_szCPUName, _T("PentiumP5"));
        else if(m_nModel==2)
         lstrcpy(m_szCPUName, _T("PentiumP54C"));
        else if(m_nModel==3)
         lstrcpy(m_szCPUName, _T("Pentiumi486"));
        else if(m_nModel==4)
         lstrcpy(m_szCPUName, _T("PentiumMMX"));
        else if(m_nModel==5)
         lstrcpy(m_szCPUName, _T("PentiumDX4"));
        else if(m_nModel==6)
         lstrcpy(m_szCPUName, _T("Pentium OverDrive P5"));
        else
         lstrcpy(m_szCPUName, _T("Pentium"));
       }
       else if(m_nFamily==6)
       {
        if(m_nModel==1)
         lstrcpy(m_szCPUName, _T("PentiumPro OverDrive P6"));
        else if(m_nModel==3)
         lstrcpy(m_szCPUName, _T("Pentiumi II"));
        else if(m_nModel==5)
         lstrcpy(m_szCPUName, _T("Celeron"));
        else if(m_nModel==6)
         lstrcpy(m_szCPUName, _T("CeleronA"));
        else if(m_nModel==7)
         lstrcpy(m_szCPUName, _T("PentiumIII"));
        else
         lstrcpy(m_szCPUName, _T("PentiumPro"));
       }
       else if(m_nFamily==7)
       {
        lstrcpy(m_szCPUName, _T("Pentium 4"));
       }
       else
        lstrcpy(m_szCPUName, _T("Unknown"));
      }
     }
     
     
     return 0;

      

  3.   

    不知道你想得到哪些信息?有三种途径:
    1.直接内嵌汇编代码,使用CPUID指令
    2.访问注册表:\\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SYSTEM\CentralProcessor
    3.使用WMI方法,这种方法最复杂,但内容最全,关于使用,你可以在MSDN中查阅
      

  4.   

    同意使用WMI方法,这是Windows 系统管理的标准。