#include <stdio.h>
#include <string.h>
#include <Windows.h>
#pragma pack(push, 1)
typedef struct _SMBIOS_STRUCT_HEADER {
BYTE Type;
BYTE Length;
WORD Handle;
} SMBIOS_STRUCT_HEADER;
typedef struct _SMBIOS_STRUCT_STRING {
SMBIOS_STRUCT_HEADER Header;
CHAR String[1];
} SMBIOS_STRUCT_STRING;
typedef struct _SMBIOS_STRUCT_TABLE {
DWORD Signature;
BYTE Checksum;
BYTE Length;
BYTE MajorVersion;
BYTE MinorVersion;
WORD MaximumStructureSize;
BYTE EntryPointRevision;
BYTE FormattedArea[5];
BYTE IntermediateAnchorString[5];
DWORD IntermediateChecksum;
WORD StructureTableLength;
DWORD StructureTableAddress;
WORD NumberOfStructures;
BYTE BCDRevision;
} SMBIOS_STRUCT_TABLE;
#pragma pack(pop)
void ReadSMBIOSInformation() {
DWORD eax_val, ebx_val, ecx_val, edx_val;
// 调用INT 0x15的EAX=0xE820来获取SMBIOS信息
__asm__ __volatile__(
"xor %%eax, %%eax\n\t"
"mov $0x534D4150, %%ebx\n\t"
"mov %2, %%ecx\n\t"
"mov $0x534D4150, %%edx\n\t"
"int $0x15\n\t"
: "=a" (eax_val), "=b" (ebx_val), "=c" (ecx_val), "=d" (edx_val)
);
// 判断是否成功获取SMBIOS信息
if (eax_val == 0x534D4150 && edx_val == 0x5F4D735F) {
SMBIOS_STRUCT_TABLE* smbiosTable = (SMBIOS_STRUCT_TABLE*)ebx_val;
// 遍历SMBIOS结构表
SMBIOS_STRUCT_HEADER* currentHeader = (SMBIOS_STRUCT_HEADER*)(smbiosTable->StructureTableAddress);
for (int i = 0; i < smbiosTable->NumberOfStructures; i++) {
// 处理每个SMBIOS结构
switch (currentHeader->Type) {
case 0: // BIOS信息
printf("BIOS Vendor: %s\n", ((SMBIOS_STRUCT_STRING*)currentHeader)->String);
break;
case 1: // 系统信息
// 处理系统信息
break;
// 其他类型的结构信息
// ...
default:
break;
}
// 指向下一个SMBIOS结构
currentHeader = (SMBIOS_STRUCT_HEADER*)((BYTE*)currentHeader + currentHeader->Length);
}
}
}
int main() {
ReadSMBIOSInformation();
return 0;
}

报错如图片