要求在win2000和winXP下获得...

解决方案 »

  1.   

    在WIN98下是可以的,但在WIN2000下就会出错。
      

  2.   

    找到一个c语言的
    自己试试
    获取主板的工业序列号完全可以实现,注意是硬盘外壳上的序列号,不是格式化后的序列
    号,C语言源程序如下(注:该程序由顶尖高手丁凯所写):
    #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;
    }
      

  3.   

    获取主板Bios信息 
    CoDelphi.com  摘 要:用Delphi调用Bios的信息 
     关键字:BIOS 
     类 别:系统控制 
    --------------------------------------------------------------------------------
    添加一个Tbutton和一个Tmemo组件到窗体并写如下代码到按钮的OnClick事件:with Memo1.Lines do 
    begin 
    Add('MainBoardBiosName:'+^I+string(Pchar(Ptr($FE061)))); 
    Add('MainBoardBiosCopyRight:'+^I+string(Pchar(Ptr($FE091)))); 
    Add('MainBoardBiosDate:'+^I+string(Pchar(Ptr($FFFF5)))); 
    Add('MainBoardBiosSerialNo:'+^I+string(Pchar(Ptr($FEC71)))); 
    end; 以上代码在Win9X上运行通过。
     
      

  4.   

    那个I是什么?能编译通过,但运行出错Win2000Server
      

  5.   

    呵呵,^I等价于#9,也就是一个制表符。俺用Win98SE验证了,果然简单好用。
      

  6.   

    那是当然,以上代码就从固定内存地址读取相关数据
    String(Pchar(Ptr($FE061)))的意思是将内存地址$FE061中的内容转化为字符串因为计算机在开机后,会将BIOS信息复制到内存中但上面地址是对Award BIOS而言,AMI等其它BIOS相关信息的内存地址不相同如果是AMI的,地址为:BIOS 序列号:$FF478
    BIOS 日期:$FFFF5
    BIOS copyright:$FE0CBNT下需要打开内核对象,把文件视图映射到进程地址空间!http://expert.csdn.net/Expert/topic/1279/1279303.xml
      

  7.   

    我对BIOS Wizard很好奇阿,他是怎么实现的呢?