问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用VC++读取BIOS的版本号等信息。奖励100分

发布网友 发布时间:2022-04-22 06:23

我来回答

1个回答

热心网友 时间:2023-12-18 08:18

可能需要ddk,否则有些结构可能没有,可以回帖我补上

#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <RegStr.h>
#include <winioctl.h>
#include <ntddndis.h>

//结构定义
typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING,*PUNICODE_STRING;

typedef struct _OBJECT_ATTRIBUTES
{
ULONG Length; // 长度 18h
HANDLE RootDirectory; // 00000000
PUNICODE_STRING ObjectName; // 指向对象名的指针
ULONG Attributes; // 对象属性00000040h
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES;

typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;

typedef DWORD (__stdcall *ZWOS )( PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES);
typedef DWORD (__stdcall *ZWMV )( HANDLE,HANDLE,PVOID,ULONG,ULONG,PLARGE_INTEGER,PSIZE_T,DWORD,ULONG,ULONG);
typedef DWORD (__stdcall *ZWUMV )( HANDLE,PVOID);

/*====================================================================
函数 : FindAwardBios
功能 : 获取Award 系列的Bios序列号
输入 : TSystemInfo& tSystemInfo [OUT]
输出 : TSystemInfo
返回 : FALSE 表示获取失败
======================================================================*/
UINT FindAwardBios( BYTE** ppBiosAddr )
{
BYTE* pBiosAddr = * ppBiosAddr + 0xEC71;
BYTE szBiosData[128];

::CopyMemory( szBiosData, pBiosAddr, 127 );
szBiosData[127] = 0;

int iLen = lstrlen( ( char* )szBiosData );
if( iLen > 0 && iLen < 128 )
{
//AWard: 07/08/2002-i845G-ITE8712-JF69VD0CC-00
//Phoenix-Award: 03/12/2002-sis645-p4s333

if( szBiosData[2] == '/' && szBiosData[5] == '/' )
{
BYTE* p = szBiosData;
while( * p )
{
if( * p < ' ' || * p >= 127 )
{
break;
}
++ p;
}

if( * p == 0 )
{
* ppBiosAddr = pBiosAddr;
return ( UINT )iLen;
}
}
}
return 0;
}

/*====================================================================
函数 : FindAmiBios
功能 : 获取Ami 系列的Bios序列号
输入 : TSystemInfo& tSystemInfo [OUT]
输出 : TSystemInfo
返回 : FALSE 表示获取失败
======================================================================*/
UINT FindAmiBios( BYTE** ppBiosAddr )
{
BYTE* pBiosAddr = * ppBiosAddr + 0xF478;

BYTE szBiosData[128];
::CopyMemory( szBiosData, pBiosAddr, 127 );
szBiosData[127] = 0;

int iLen = lstrlen( ( char* )szBiosData );
if( iLen > 0 && iLen < 128 )
{
// Example: "AMI: 51-2300-000000-00101111-030199-"
if( szBiosData[2] == '-' && szBiosData[7] == '-' )
{
BYTE* p = szBiosData;
while( * p )
{
if( * p < ' ' || * p >= 127 )
{
break;
}
++ p;
}
if( * p == 0 )
{
* ppBiosAddr = pBiosAddr;
return ( UINT )iLen;
}
}
}

return 0;
}

/*====================================================================
函数 : FindPhoenixBios
功能 : 获取Phoenix 系列的Bios序列号
输入 : TSystemInfo& tSystemInfo [OUT]
输出 : TSystemInfo
返回 : FALSE 表示获取失败
======================================================================*/
UINT FindPhoenixBios( BYTE** ppBiosAddr )
{
UINT uOffset[3] = { 0x6577, 0x7196, 0x7550 };
for( UINT i = 0; i < 3; ++ i )
{
BYTE* pBiosAddr = * ppBiosAddr + uOffset[i];
BYTE szBiosData[128];
::CopyMemory( szBiosData, pBiosAddr, 127 );
szBiosData[127] = 0;

int iLen = lstrlen( ( char* )szBiosData );
if( iLen > 0 && iLen < 128 )
{
// Example: Phoenix "NITELT0.86B.0044.P11.9910111055"
if ( szBiosData[7] == '.' && szBiosData[11] == '.' )
{
BYTE* p = szBiosData;
while( * p )
{
if( * p < ' ' || * p >= 127 )
{
break;
}
++ p;
}
if( * p == 0 )
{
* ppBiosAddr = pBiosAddr;
return ( UINT )iLen;
}
}
}
}

return 0;
}

/*====================================================================
函数 : GetBiosSerialNum
功能 : 获取Bios序列号
输入 : TSystemInfo& tSystemInfo [OUT]
输出 : TSystemInfo
返回 : FALSE 表示获取失败
======================================================================*/
BOOL GetBiosSerialNum(TSystemInfo& tSystemInfo)
{
SIZE_T ssize;
LARGE_INTEGER so;
so.LowPart=0x000f0000;
so.HighPart=0x00000000;
ssize=0xffff;

wchar_t strPH[30]= L"\\device\\physicalmemory";

DWORD ba=0;
UNICODE_STRING struniph;
struniph.Buffer=strPH;
struniph.Length=0x2c;
struniph.MaximumLength =0x2e;
OBJECT_ATTRIBUTES obj_ar;
obj_ar.Attributes =64;
obj_ar.Length =24;
obj_ar.ObjectName=&struniph;
obj_ar.RootDirectory=0;
obj_ar.SecurityDescriptor=0;
obj_ar.SecurityQualityOfService =0;

HMODULE hinstLib = LoadLibrary("ntdll.dll");
ZWOS ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection");
ZWMV ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection");
ZWUMV ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection");

//调用函数,对物理内存进行映射
HANDLE hSection;
if( 0 == ZWopenS(&hSection,4,&obj_ar) &&
0 == ZWmapV(
( HANDLE )hSection, //打开Section时得到的句柄
( HANDLE )0xFFFFFFFF, //将要映射进程的句柄,
&ba, //映射的基址
0,
0xFFFF, //分配的大小
&so, //物理内存的地址
&ssize, //指向读取内存块大小的指针
1, //子进程的可继承性设定
0, //分配类型
2 //保护类型
)
)
//执行后会在当前进程的空间开辟一段64k的空间,并把f000:0000到f000:ffff处的内容映射到这里
//映射的基址由ba返回,如果映射不再有用,应该用ZwUnmapViewOfSection断开映射
{
BYTE* pBiosSerial = ( BYTE* )ba;
UINT uBiosSerialLen = FindAwardBios( &pBiosSerial );
if( uBiosSerialLen == 0U )
{
uBiosSerialLen = FindAmiBios( &pBiosSerial );
if( uBiosSerialLen == 0U )
{
uBiosSerialLen = FindPhoenixBios( &pBiosSerial );
}
}

if( uBiosSerialLen != 0U )
{
tSystemInfo.Append((u8*)"BIOS=", 5);
::CopyMemory( tSystemInfo.szInfo+5, pBiosSerial, uBiosSerialLen );
tSystemInfo.dwRealSize = uBiosSerialLen+5;
}
else
{
printf("BIOS: not support!\n");
return FALSE;
}

ZWunmapV( ( HANDLE )0xFFFFFFFF, ( void* )ba );

printf("BIOS: %s\n", (s8*)tSystemInfo.szInfo);

return TRUE;
}

printf("BIOS: not supported!\n");
return FALSE;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2198香辣虾是什么意思 虾什么梗 肖战 刻纸制作需要哪些步骤 好玩的生存游戏手游(好玩的生存游戏手游推荐) 北京电脑职业培训学校都有哪些北京电脑培训班都有哪些 欧盟商标注册需要提供什么资料? 怎么注册欧盟商标?需要准备哪些材料? 5g手机有什么好处 5g手机大概多少钱 口水臭是什么原因呢? 口水臭是什么原因 口水臭怎么改善 在Delphi中访问其他单元公共方法的语法是什么? 打开premiere pro cs5出现 loadlibraryEx startup.... 我电脑老是弹出下面的提示,我该怎么办? 动态连接库能加载 但是出现127错误 找不到指定的程序 电脑系统故障 安装sql时,load library在sqlsut.dll上失败怎么办? 注册COM(ActiveX)控件失败:C:\Windows\system32\ms... 全民k歌出现loadlibrary failed with error127,怎... 安装程序提示:注册COM(ActiveX)控件失败:C:\........ 电脑运行 minecraft 出现Loadlibrary failed with ... win7运行minecraft或PokeMMO时出现Loadlibrary fai... 新买的夏普液晶电视,自己动手安装好了后电视也能... 夏普电视安卓系统4.4和5.0什么区别 夏普lcd60lx850a不到两年黑屏的吗 看着看着就什么... 夏普06e移动数据怎么开 魅族mx3左下角出现安全模式 怎样才能退出 手机中有电脑的病毒 夏普s2中间home键是可以按键下去吗 夏普手机如何识别u盘 太极符号的意义 启动premiere pro cs4时提示 “无法定位程序输入点... 我在用delphi2007打开一个delphi工程文件的时候,出... VB禁止alt和ctrl怎麽做。要代码、、 全民k歌,打不开,出现了这个,loadlibrary failed... 求助,GetProcAddress 失败,GetLastError 返回127... NBA都有哪些球星戴过面具? 吉诺比利是怎样的一位运动员? 吉诺比利那么厉害,为什么在马刺是第六人的身份? 吉诺比利 吉诺比利是阿根廷球员,他是NBA最强阿根廷球员吗? 外地人在达州买房需要哪些手续? NBA有史以来,哪些球星的假动作最为逼真? 吉诺比利究竟是一个什么样的球员,为 515新政策后,达州户籍在成都买房需要哪些条件? 想买针式打印机在仓库里用,打印仓库单据用什么打... 想在达州市买房,哪里的房子好呢 吉诺比利不能融入马刺,为什么波波维奇还能容忍他? 打印机是针式打印机。仓库用四联打印纸,那么纸张... 达州买房有哪些贷款方式 选择贷款方式有什么原则 吉诺比利入选2022届名人堂,他在职业生涯还获得过...