//////////////////////////////////////////////////////////////
//Get Harddisk serial number
/////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>WORD    pw[256];
static  DWORD  idt, int_idt;
static  DWORD  Base;
static  WORD    Entry;
#pragma warning (disable:4035) static int inp(WORD rdx)
{
    _asm xor eax, eax
    _asm mov dx, rdx
    _asm in al, dx
}static WORD inpw(WORD rdx)
{
    _asm xor eax, eax
    _asm mov dx, rdx
    _asm in  ax, dx
}static void outp(WORD rdx, int ral)
{
    _asm mov dx, rdx
    _asm mov eax, ral
    _asm out dx, al
}
static int WaitIde()
{
  int  al;
  while ((al=inp(0x1F7))>=0x80) ;
  return al;
}
static void ReadIDE()
{
  int  al;
  int  i;
  WaitIde();
  outp(0x1F6,0xA0);
  al = WaitIde();
  if ((al&0x50)!=0x50) return;
  outp(0x1F6,0xA0);
  outp(0x1F7,0xEC);
  al = WaitIde();
  if ((al&0x58)!=0x58) return;
  for (i=0;i<256;i++) {
      pw[i] = inpw(0x1F0);
  }
}
static void __declspec( naked ) NowInRing0()
{
    _asm {
        push    ebp      
        mov    ebp,esp
        call    ReadIDE
        cli
        mov    ebx, int_idt
        mov    ax, Entry
mov     word ptr [ebx-4], ax
        mov    eax, Base
shr     eax, 16 
mov     [ebx+2], ax
        sti
        leave  
        iretd
    }
}
void GetIDEInfo()
{
    DWORD  dwExcept;
    dwExcept = (DWORD)NowInRing0;
    _asm {
        mov    eax, fs:[0]
    push eax 
        sidt    [esp-02h]  
        pop    ebx            
        mov    idt, ebx
        add    ebx, 0x1C
        mov    int_idt, ebx
        mov    eax, [ebx]  
        mov    [Base], eax
        mov    ax, [ebx-4] 
        mov    [Entry], ax
        cli
        mov    esi, dwExcept
push esi
mov     [ebx-4], si
    shr     esi, 16 
mov     [ebx+2], si 
pop     esi
        sti
        int    3
    }
}
main()
{
    char    s[80];
    register i,j;
    GetIDEInfo();
    for (i=0,j=0;i<10;i++) {
        s[j++]=pw[10+i]>>8;
        s[j++]=pw[10+i]&0xFF;
    }
    s[j] = 0;
    printf("Serial=%s\n", s);
    return 0;
}

解决方案 »

  1.   

    #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
    asm cpuid
    asm mov dword ptr vendor_id,ebx
    asm mov dword ptr vendor_id[+4],edx
    asm mov dword ptr vendor_id[+8],ecx
    printf("%s-",vendor_id);
    asm mov eax,01h
    asm xor edx,edx
    asm cpuid
    asm mov s1,edx
    asm mov s2,eax
    printf("%08X\n%08X-",s1,s2);
    asm mov eax,03h
    asm xor ecx,ecx
    asm xor edx,edx
    asm cpuid
    asm mov s1,edx
    asm 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;
    }
      

  2.   

    http://www.codeguru.com/network/GetMAC.html
    Three ways to get your MAC address.
      

  3.   

    硬盘序列号可用函数:GetVolumeInformation()关于CPU的代码:
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR szHello[MAX_LOADSTRING];
    LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message) 
    {
    case WM_CREATE:
    __asm{     //存于变量time中.
    rdtsc
    mov ecx,offset time
    mov [ecx+0],edx
    mov [ecx+4],eax
    }
        break;
    case WM_COMMAND:
    wmId    = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
    __asm{
        mov eax,0
    cpuid

    mov mycpuid[0],ebx
                            mov mycpuid[4],edx
    mov mycpuid[8],ecx
    }
                  
    sprintf(zzz,"本机器CPU生产厂家为%s",mycpuid);
    MessageBox(hWnd,zzz,"测试结果如下:",MB_OK);
    break;
    case IDM_EXIT:
       DestroyWindow(hWnd);
       break;
    default:
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code here...
    RECT rt;
    GetClientRect(hWnd, &rt);
    DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    case WM_TIMER:
    if(flag==1){
    __asm{
        rdtsc
    mov ebx,offset time
    sub eax,[ebx+4]
    sbb edx,[ebx+0]
    mov ecx,1000000
    div ecx
    mov cpuclock,eax
    }
    flag=0;
    }
    sprintf(zzz,"本机器CPU主频是: %d MHZ",cpuclock);
    TextOut(GetDC(hWnd),200,200,zzz,24);
    break; default:
    return DefWindowProc(hWnd, message, wParam, lParam);
       }
       return 0;
    }
      

  4.   

    http://www.csdn.net/expert/topic/489/489705.xml?temp=.6313898
      

  5.   

    masterz() :
    硬盘ID(硬件ID)的程序有在2000下有问题,运行会出错
    CPUID程序是没有用的,所有机器都一样,CPUID的指令是不能得到CPUID的。
      

  6.   

    其实没有好的方法可以得到CPU ID的,好象INTEL关掉的CPUID的功能!
      

  7.   

    GetVolumeInformation()
    只能获得软系列号,它可以用硬盘克隆软件克隆的
      

  8.   

    http://www.5xsoft.com/data/200109/1108393101.htm