GetSystemFirmwareTable 函数 (sysinfoapi.h)

从固件表提供程序检索指定的固件表。

语法

UINT GetSystemFirmwareTable(
  [in]  DWORD FirmwareTableProviderSignature,
  [in]  DWORD FirmwareTableID,
  [out] PVOID pFirmwareTableBuffer,
  [in]  DWORD BufferSize
);

参数

[in] FirmwareTableProviderSignature

查询将定向到的固件表提供程序的标识符。 此参数的取值可为下列值之一:

含义
“ACPI” ACPI 固件表提供程序。
'FIRM' 原始固件表提供程序。
'RSMB' 原始 SMBIOS 固件表提供程序。

[in] FirmwareTableID

固件表的标识符。 此标识符是小尾号,必须反转字符串中的字符。

例如,FACP 是 ACPI 提供程序,如 ACPI 规范中DESCRIPTION_HEADER结构的签名字段中所述 (请参阅 高级配置和电源接口 (ACPI) 规范。 因此,请使用“PCAF”指定 FACP 表,如以下示例所示:

retVal = GetSystemFirmwareTable('ACPI', 'PCAF', pBuffer, BUFSIZE);

有关详细信息,请参阅 EnumSystemFirmwareTables 函数的“备注”部分。

[out] pFirmwareTableBuffer

指向接收请求的固件表的缓冲区的指针。 如果此参数为 NULL,则返回值为所需的缓冲区大小。

有关此缓冲区内容的详细信息,请参阅“备注”部分。

[in] BufferSize

pFirmwareTableBuffer 缓冲区的大小(以字节为单位)。

返回值

如果函数成功,则返回值为写入缓冲区的字节数。 此值将始终小于或等于 BufferSize

如果函数因缓冲区不够大而失败,则返回值为所需的缓冲区大小(以字节为单位)。 此值始终大于 BufferSize

如果函数因任何其他原因而失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

注解

从 Windows 10 版本 1803 开始,通用 Windows 应用可以通过在应用清单中声明 smbios 受限功能来访问系统管理 BIOS (SMBIOS) 信息。 有关详细信息 ,请参阅从通用 Windows 应用访问 SMBIOS 信息 。 只能从通用 Windows 应用访问原始 SMBIOS (RSMB) 固件表。

从 Windows Server 2003 Service Pack 1 (SP1) ,应用程序无法访问 \Device\PhysicalMemory 对象。 对此对象的访问仅限于内核模式驱动程序。 此更改会影响应用程序读取系统管理 BIOS (SMBIOS) 或其他存储在最低 1MB 物理内存中的 BIOS 数据。 应用程序使用以下替代方法从低物理内存中读取数据:

  • 使用 WMI 检索 SMBIOS 属性。 Win32 类中包含许多单独的属性。 还可以使用 MSSMBios_RawSMBiosTables 类检索单个缓冲区中的原始 SMBIOS 数据。
  • 使用 GetSystemFirmwareTable 函数读取原始 SMBIOS 固件表。
应用程序无法写入低物理内存。

原始 SMBIOS 表提供程序 ('RSMB') 检索原始 SMBIOS 固件表的内容。 pFirmwareTableBuffer 缓冲区接收以下数据:

#include <windows.h>

struct RawSMBIOSData
{
    BYTE    Used20CallingMethod;
    BYTE    SMBIOSMajorVersion;
    BYTE    SMBIOSMinorVersion;
    BYTE    DmiRevision;
    DWORD   Length;
    BYTE    SMBIOSTableData[];
};

原始固件表提供程序 ('FIRM') 检索指定物理地址范围的内容。 函数返回地址范围的大小。

ACPI 表提供程序 ('ACPI') 检索指定 ACPI 表的内容。 由于 OEM 可以包含 ACPI 规范中未列出的 ACPI 固件表,因此应首先调用 EnumSystemFirmwareTables 来枚举系统上当前的所有 ACPI 表。

对于 ACPI,如果系统包含多个具有相同名称的表,则它们都使用 EnumSystemFirmwareTables 进行枚举。 但是, GetSystemFirmwareTable 仅检索列表中具有此名称的第一个表。

示例

以下示例演示如何检索 SMBIOS 表。

DWORD error = ERROR_SUCCESS;
DWORD smBiosDataSize = 0;
RawSMBIOSData* smBiosData = NULL; // Defined in this link
DWORD bytesWritten = 0;

// Query size of SMBIOS data.
smBiosDataSize = GetSystemFirmwareTable('RSMB', 0, NULL, 0);

// Allocate memory for SMBIOS data
smBiosData = (RawSMBIOSData*) HeapAlloc(GetProcessHeap(), 0, smBiosDataSize);
if (!smBiosData) {
    error = ERROR_OUTOFMEMORY;
    goto exit;
}

// Retrieve the SMBIOS table
bytesWritten = GetSystemFirmwareTable('RSMB', 0, smBiosData, smBiosDataSize);

if (bytesWritten != smBiosDataSize) {
    error = ERROR_INVALID_DATA;
    goto exit;
}

// Process the SMBIOS data and free the memory under an exit label

要求

要求
最低受支持的客户端 Windows Vista、Windows XP Professional x64 版本 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2008、Windows Server 2003 SP1 [桌面应用 |UWP 应用]
目标平台 Windows
标头 sysinfoapi.h (包括 Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

从通用 Windows 应用访问 SMBIOS 信息

EnumSystemFirmwareTables

系统信息函数