不知对于现在的CPU是否可以通过API函数得到CPU的序列号?
如果不可以,则用什么东西可以唯一标识某个机器(硬盘序列号不可以,因为硬盘序列号能够通过软件修改)?

解决方案 »

  1.   

    可以取得ID号。
    这里有一个示例程序://取得IntelCPU的ID号:void IntelCPUIDDlg::OnButtonCPUID()
    {
       unsigned long s1,s2;
       unsigned char vendor_id[]="------------------";
       CString str1,str2,str3;
      __asm
    {
       xor eax,eax
       cpuid
       mov dword ptr vendor_id,ebx
       mov dword ptr vendor_id[+4],edx
       mov dword ptr vendor_id[+8],ecx
    }
      str1.Format("%s",vendor_id);
      __asm  //取得CPU ID的高32位
    {
       mov eax,01h
       xor edx,edx
       cpuid
       mov s2,eax
    }
    str2.Format("%08X-",s2);__asm //取得CPU ID的低64位
    {
      mov eax,03h
      xor ecx,ecx
      xor edx,edx
      cpuid 
      mov s1,edx
      mov s2,ecx
    }str3.Format("%08X-%08X\n",s1,s2);
    str2+=str3;
    m_editVendor.SetWindowText(str1);
    m_editCPUID.SetWindowText(str2);
    }
      

  2.   

    CPU ID号是不变的,除非换CPU,因此应该可以唯一确定一台机器了。
      

  3.   

    只知道在Intel的CPU有效,不知道AMD的cpu是否支持cpuid这个命令。
    UP
      

  4.   

    还有一些资料:Intel CPU序列号是一个建立在处理器内部的、唯一的、不能被修改的编号。它由96位数字组成。高32位是CPU ID,用来识别CPU类型,同种类型的CPU都一样;低64位每个处理器都不同,唯一地代表了该处理器。就像身份证编码一样,可以用来识别每一个处理器。位了适应这一新特性,Intel在处理器中增加了两条指令(读取和禁止)和一个寄存器位(模式指定寄存器位:Model Specific Register-"MSR")。读取指令扩展了CPUID读取指令。当执行读取指令地时候,可以得到96位地处理器序列号。禁止指令怾禁止对处理器序列号的读取。位了配合CPU序列号的读取和禁止,设置了MSR位。当MSR位为“0”时可以读取CPU序列号;当为“1”的时候,只能读取高32为(即CPU ID),而低64位全部为零。
      对于Intel奔腾III处理器,当其序列号未被禁止时,可以读取它,对于Intel系列其他CPU,只能读出CPU ID的高32位,即表明CPU的类型。
      

  5.   

    AMD的也支持,不过有点不同,可以查一下