获取CPUID

用CPUID指令,首先你可以确定你用的CPU是Intel的。然后执行:

MOV EAX,01H
CPUID

如果返回的EDX中,低18位为1,那么这个CPU就是支持序列号的。此时EAX就是序列号的高32位。这32位对同一型号的CPU是一样的。再执行:

MOV EAX,03H
CPUID

此时的EDX:ECX就是序列号的第64位。 要想关闭这个ID,可执行下列代码:

  MOV ECX,119H
  RDMSR
  OR EAX,00200000H
  WRMSR
  
不过,一旦执行上述代码,cpu 将一直不能取id,直到下次 reset。

// getcpuid.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <conio.h>

int main(int argc, char* argv[])
{
   unsigned long s1,s2;
   unsigned char vendor_id[]="------------";
   char sel;
   printf("Select the function:/n1-------Read CPU id./n2-------Disable CPU id./n");
   sel=getch();
   switch(sel)
   {
   case '1':
      _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
      }
      printf("%s-",vendor_id);
      _asm
      {
         mov eax,01h
            xor edx,edx
            cpuid
            mov s1,edx
            mov s2,eax
      }
      printf("%08X/n%08X-",s1,s2);
      _asm
      {
         mov eax,03h
            xor ecx,ecx
            xor edx,edx
            cpuid
            mov s1,edx
            mov s2,ecx
      }
      printf("%08X-%08X/n",s1,s2);
      break;
   case '2':
      _asm{
         mov ecx,119h
            rdmsr
            or eax,00200000h
            wrmsr
      }
      printf("CPU id is disabled./n");
      break;
   }
   return 0;
}

你可能感兴趣的:(function)