在线等待,如何得到主板BIOS的序列号,谢谢!

解决方案 »

  1.   

    随便搜索的,贴出来 ,不知道行不行,没有看~ 
    --------------------------------------------
    下面这篇是以前收集的,觉得应该有帮助。Windows 2000 下通过访问物理地址取主机唯一信息
    Author: sinister
    Email: [email protected]
    Homepage:http://www.whitecell.org 
    在9x下取得主版序列号非常简单,但此方法在NT/2K下行不通。还好NT/2K下 
    提供了 \Device\PhysicalMemory 设备,通过它可以得到物理地址。在9x下 
    通过访问地址 FEC71H 可以得到主板序列号。NT/2K下虽不保证是主板序列号, 
    但经过多台机器反复测试,此地址的值是不变且唯一的。下面是我 DRIVE 中 
    取主机唯一信息的代码,错误之处还望各位指正。 代码:BOOLEAN MainBoardBiosSerialNo()
    {HANDLE physmem;
    UNICODE_STRING physmemString;
    OBJECT_ATTRIBUTES attributes;
    WCHAR physmemName[] = L"\\Device\\PhysicalMemory";NTSTATUS ntStatus;
    DWORD RAdd = 0xFEC71;
    DWORD LAdd = 100;
    DWORD OAdd;
    DWORD i;
    RtlInitUnicodeString( &physmemString, physmemName );InitializeObjectAttributes( &attributes, 
    &physmemString,
    OBJ_CASE_INSENSITIVE,
    NULL, 
    NULL
    );
    ntStatus = ZwOpenSection( &physmem, 
    SECTION_MAP_READ, 
    &attributes
    );if( !NT_SUCCESS( ntStatus ))

    DbgPrint("ZwOpenSection() is error\n");
    return FALSE;
    }DbgPrint("ZwOpenSection() is OK\n");if (!MapView(physmem,&RAdd,&LAdd,&OAdd))

    DbgPrint("MapView() is error\n");
    return FALSE;
    }DbgPrint("MapView() is OK\n");for ( i = 0; i < LAdd; i ++)
    {
    DbgPrint("%x",*(PUCHAR)(OAdd + i));}ntStatus = ZwUnmapViewOfSection( (HANDLE) -1, (PVOID) OAdd );if( !NT_SUCCESS(ntStatus))
    {
    DbgPrint("Unable to unmap view");
    return FALSE;

    return TRUE;
    }
    BOOLEAN MapView( HANDLE HPMemory,DWORD *dwAddress,DWORD *dwLength,DWORD *dwVAddress )
    {
    NTSTATUS Status;
    PHYSICAL_ADDRESS ViewBaseAddress;*dwVAddress = 0;
    ViewBaseAddress.QuadPart = (ULONGLONG) (*dwAddress);Status = ZwMapViewOfSection ( HPMemory,
    (HANDLE) -1,
    (PVOID)dwVAddress,
    0,
    *dwLength,
    &ViewBaseAddress,
    dwLength,
    ViewShare,
    0,
    PAGE_READONLY
    );if( !NT_SUCCESS( Status ))
    {
    return FALSE;
    }return TRUE;
    }
      

  2.   

    再贴一个http://www.5iv.net/data/web5008/20050227/20050227__3011239.html 我没有验证的~
      

  3.   

    使用WINIO库.
    HANDLE hPhyMem;
    PBYTE lpInfo = MapPhysToLin((PBYTE)0xf0000,65536,&hPhyMem);
    CString string;
    string.Format ( "Bois序列号:%s" , lpInfo+0xec71);
    MessageBox ( string ) ;
      

  4.   

    系统的SN被写在DMI表的Type 1中,当然DMI表中还有很多信息。去找一个DMI的规范,先搞清楚DMI再说。PS,在windows的cmd中,用debug就可以查看DMI表。操作如下:
    -s F000:0 FFFF "_SM_"
    F000:71C0   (这是我的电脑上的值,每台机器应该有所不同)
    -d f000:71c0
    ...........  (此处省略n个字节)
    (说明:上面表从开始处偏移0x18处的一个字是DMI表的偏移量,0x1A处的一个字是DMI表的段地址)
    (本人电脑上是10 00 0E 00,那么DMI Offset:0010,DMI Segment:E000,记住段地址的构成方法噢)
    -d e000:0010
    (看看吧!这就是整个系统的信息啊!这里的系统不是指OS,而是硬件系统。DMI表很大,多d几次吧!)
    (具体这些数据都是什么意思,这里就不讲了,还挺复杂的,下个DMI规范看看就明白了)注,如果是有人用的电脑是ATI芯片组的话,运气就不这么好了,因为DMI表被放在了只在保护模式中才能访问的地址空间了,debug无能为力了。
    要想写程序得到DMI表的话,就要想办法如何访问内存地址,用winio是个简单的方法,其实winio也是用的\\Device\\PhysicalMemory,只是做了封装而已。
      

  5.   

    读出bios后怎么读主板BIOS的序列号呢?
      

  6.   

    通过string.Format ( "Bois序列号:%s" , lpInfo+0xec71);
    方式得到的结果是“怦?YJQ? ?傝?Y囿u”,而不是网上其他文章里的格式i815-ITE87X2-6A69RPQRS-00
    非常好,好像是乱码
      

  7.   

    是ibm bios的问题,amd的结果正确
      

  8.   

    我上面介绍的方法是通用的,这是计算机界的标准,不论是ibm、还是hp、还是nec等等,所有公司都必须遵循这个标准。之所以:
    ------------------------
    通过string.Format ( "Bois序列号:%s" , lpInfo+0xec71);
    方式得到的结果是“怦?YJQ? ?傝?Y囿u”,而不是网上其他文章里的格式i815-ITE87X2-6A69RPQRS-00
    非常好,好像是乱码
    ------------------------
    是ibm bios的问题,amd的结果正确
    ------------------------
    就是因为那些bios都是按照DMI规范来填DMI表的,但具体的数值有所不同罢了!
      

  9.   

    ibm机器在0x6f8d 而dell的机器又不同
      

  10.   

    http://www.phoenix.com/NR/rdonlyres/51EEA1E6-20C1-4FA2-A3D8-AD8E45335C47/0/specssmbios.pdf
      

  11.   

    谢谢,我已经看过了,但对如何编程读取还是不明白,而且我用debug显示的信息也好像不太对我的地址显示00 c0 f7 1f 我用-d 1ff7:c000显示都是0
      

  12.   

    我对你所说“要想写程序得到DMI表的话,就要想办法如何访问内存地址,用winio是个简单的方法,其实winio也是用的\\Device\\PhysicalMemory,只是做了封装而已。”不太明白,用winio  HANDLE hPhyMem;
    PBYTE lpInfo = MapPhysToLin((PBYTE)0xf0000,65536,&hPhyMem);
    CString string;
    string.Format ( "Bois序列号:%s" , lpInfo+0xec71);但是ibm的偏移不是0xed71
      

  13.   

    呵呵!忘记说明了:
    显示的地址的后两个字节为0? 00的形式时,才能构成段地址,方法是000?左移12位构成段地址?000。而当不是这种形式时,debug就无能为力了。比如00 c0 f7 1f,这时的地址是32位的1ff7c000。用winio应该可以读的到。
      

  14.   

    win32中读取DMI的通用方法如下:
    1.在内存地址[0x000f0000,0x000fffff]的范围内搜索"_SM_"的地址,例如得到结果为0x000f71c0。
    2.取地址0x000f71c0+0x18处的一个双字,例如0x1ff7c000。
    3.这个地址0x1ff7c000,就是DMI表的起始地址。然后根据DMI规范对DMI表进行分析,得到你所想要的信息。