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結構的簽章欄位所述, (請參閱進 階設定和 Power Interface (ACPI) 規格。 因此,使用 'PCAF' 來指定 FACP 數據表,如下列範例所示:
retVal = GetSystemFirmwareTable('ACPI', 'PCAF', pBuffer, BUFSIZE);
如需詳細資訊,請參閱 EnumSystemFirmwareTables 函式的一節。
[out] pFirmwareTableBuffer
接收所要求韌體數據表之緩衝區的指標。 如果此參數為 NULL,則傳回值是所需的緩衝區大小。
如需有關此緩衝區內容的詳細資訊,請參閱一節。
[in] BufferSize
pFirmwareTableBuffer 緩衝區的大小,以位元組為單位。
傳回值
如果函式成功,傳回值就是寫入緩衝區的位元元組數。 此值一律小於或等於 BufferSize。
如果函式因為緩衝區不夠大而失敗,則傳回值是所需的緩衝區大小,以位元組為單位。 此值一律大於 BufferSize。
如果函式因任何其他原因而失敗,則傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
備註
從 1803 版 Windows 10 開始,通用 Windows 應用程式可以藉由在應用程式指令清單中宣告 smbios 受限制的功能,來存取系統管理 BIOS (SMBIOS) 資訊。 如需詳細資訊 ,請參閱從通用 Windows 應用程式存取 SMBIOS 資訊 。 只有原始SMBIOS (RSMB) 韌體資料表才能從通用 Windows 應用程式存取。
自 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 Edition [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows Server 2008、Windows Server 2003 SP1 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | sysinfoapi.h (包含 Windows.h) |
程式庫 | Kernel32.lib |
DLL | Kernel32.dll |