Office中国论坛/Access中国论坛

标题: 谁知道怎么获取CPU的96位序列号?? [打印本页]

作者: sxb2007    时间: 2014-1-26 17:16
标题: 谁知道怎么获取CPU的96位序列号??
本帖最后由 sxb2007 于 2014-1-26 17:36 编辑

谁知道怎么获取CPU的96位序列号??
今天在网上看了一下关于CPU的序列号问题。才知道有96位。
CPU序列号是一个建立在处理器内部的、唯一的、不能被修改的编号。它由96位数字组成。高32位是CPU ID,用来识别CPU类型。低64位每个处理器都不同,唯一地代表了该处理器。CPU号可以用来识别每一个处理器。为了适应这一新特征,Intel在处理中增加了两条指令(“读取”和“禁止” )和一个寄存器位(模式指定寄存器位:Model Specific Register-“MSR”)。读取指令扩展了CPUID读取指令。当执行读取指令时可以得到96位的处理器序列号。禁止指令可以禁止对处理器序列号的读取。为了配合CPU序列号的读取和禁止,设置了MSR位。当MSR位为“0”时可以读取CPU序列号;当“MSR”位为“1”时只能读取高32位(即CPU ID),而低64位全为零。

CPU号的读取  硬盘的序列号只能采用对硬盘控制器直接操作的方式进行读取,也就是说只能采用CPU的I/O指令操作硬盘控制器,对于CPU号的读取采用了在DELPHI嵌入汇编的方法读取。其读取方法如下:  MOV EAX.01H  如果返回的EDX中,低18位为1,那么这个CPU就是支持序列号的。此时EAX就是序列号的高32位。这32位对同一型号的CPU是一样的。  再执行:  MOV EAX.03H  此时的EDX:ECX就是序列号的第64位。

不知道那位牛人能搞定这个问题

实现代码:
void CWaterSaveDlg::OnBnClickedButton6()
{
    // TODO: 在此添加控件通知处理程序代码
    unsigned long s1,s2;
    unsigned char vendor_id[]="------------";//CPU提供商ID
    CString str1,str2,str3;
    // 以下为获得CPU ID的汇编语言指令
    _asm    // 得到CPU提供商信息
    {  
        xor eax,eax   // 将eax清0
            cpuid         // 获取CPUID的指令
            mov dword ptr vendor_id,ebx
            mov dword ptr vendor_id[+4],edx
            mov dword ptr vendor_id[+8],ecx  
    }
    str1.Format("CPU提供商ID:%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="CPU序列号:" + str2 + str3;
    MessageBox(str2);
}

代码已有了,谁能翻译成VB代码啊!!


作者: sxgaobo    时间: 2014-1-27 14:56
期盼!!!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3