WinXP中如何获取主板Bios的序列号?

解决方案 »

  1.   

    在计算机的BIOS芯片里有一个序列号,即BIOS序列号,据说是每一台计算机都不同的。有些软件就用这个序列号作为一个唯一的标识来使用。而在Windows优化大师中更是可以看到这个序列号,那么,他们是怎么读取的呢?
        不同品牌的计算机有不同的BIOS芯片,这给BIOS序列号的读取造成了一些麻烦。但这个序列号都是存储在物理内存的0x000f0000-0x000fffff这个区域里,具体的地址根据BIOS生产厂家有所不同。
        常见的BIOS生产厂家有AMI,Award,Phoenix;其中Phoenix一般用在IBM的笔记本电脑中。那么怎么鉴别BIOS的生产厂家呢?其实我也不知道有什么简单的标志,只是采取了搜索法,搜索上述内存区域,一旦发现"AMI"这个字符串就认为是AMI的BIOS,依此类推。
        根据试验发现,AMI的序列号地址在0x000ff478,Award的序列号地址在0x000fec71,而Phoenix的序列号不太明确,可能是0x000f6577、0x000f7196、0x000f7550中的一个,而且Windows优化大师也没有给出这种BIOS的序列号。而试验的几种BIOS生产日期都是在0x000ffff5处。
        关于如何读取物理内存的问题,在Win9X和WinNT是完全不同的。    Windows 9X 的方法非常简单。
    ...
    char *pSN=(char *)0x000fec71;
    printf("%s\n",pSN);
    ...//以下函数用以获得计算机BIOS系统信息。
    function GetBios(value: integer): String;
    // 1...Bios Type
    // 2.. Bios Copyright
    // 3.. Bios Date
    // 4.. Bios Extended Info
    // 5.. Bustype
    // 6.. MachineType
    begin
    result:='(unavailable)';
    case value of
    1: result:=String(Pchar(Ptr($FE061)));
    2: result:=String(Pchar(Ptr($FE091)));
    3: result:=String(Pchar(Ptr($FFFF5)));
    4: result:=String(Pchar(Ptr($FEC71)));
    end;
    end;
      

  2.   

    Windows 9X 的方法在很多地方都有了,但在WinXP中无法使用啊。
      

  3.   

    有个WinIO控件可以在NT系统下读取物理内存的
    不过都是C++接口不知道你能不能用
      

  4.   

    用ZwOpenSection打开内核对象\Device\PhysicalMemory再用MapViewOfFile将其映射到进程空间即可成功访问物理内存地址中的数据在NT内核的操作系统下,Ring3层访问物理内存的资料很容易搜索到的查查MSDN也能豁然开朗
      

  5.   

    请问ehom(?!) 具体怎么做啊?
      

  6.   

    下面的代码是C++做的,不知道行不行。
    我对C++不熟,哪位高手帮忙一下。
      给分的,谢了!!!!!
    ------------------------------------
    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;
    }
      

  7.   

    试试以下代码:
    http://www.cdjiafu.com/pph/dispbbs.asp?boardID=14&ID=1102