Функция 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, как описано в поле Подпись структуры DESCRIPTION_HEADER в спецификации ACPI (см. спецификацию расширенной конфигурации и интерфейса питания (ACPI). Поэтому используйте PCAF, чтобы указать таблицу FACP, как показано в следующем примере:
retVal = GetSystemFirmwareTable('ACPI', 'PCAF', pBuffer, BUFSIZE);
Дополнительные сведения см. в разделе Примечания функции EnumSystemFirmwareTables .
[out] pFirmwareTableBuffer
Указатель на буфер, который получает запрошенную таблицу встроенного ПО. Если этот параметр имеет значение NULL, возвращаемое значение является требуемым размером буфера.
Дополнительные сведения о содержимом этого буфера см. в разделе Примечания.
[in] BufferSize
Размер буфера pFirmwareTableBuffer в байтах.
Возвращаемое значение
Если функция выполняется успешно, возвращаемое значение — это количество байтов, записанных в буфер. Это значение всегда будет меньше или равно BufferSize.
Если функция завершается сбоем из-за недостаточно большого размера буфера, возвращаемым значением является требуемый размер буфера в байтах. Это значение всегда больше BufferSize.
Если функция завершается сбоем по какой-либо другой причине, возвращаемое значение равно нулю. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Комментарии
Начиная с Windows 10 версии 1803, универсальные приложения для Windows могут получать доступ к данным BIOS управления системой (SMBIOS), объявив ограниченную возможность smbios в манифесте приложения. Дополнительные сведения см. в разделе Доступ к сведениям SMBIOS из универсального приложения для Windows . Из универсального приложения для Windows можно получить доступ только к необработанным таблицам встроенного ПО SMBIOS (RSMB).
По состоянию на Windows Server 2003 с пакетом обновления 1 (SP1) приложения не могут получить доступ к объекту \Device\PhysicalMemory. Доступ к этому объекту ограничен драйверами в режиме ядра. Это изменение влияет на приложения, которые считывают BIOS управления системой (SMBIOS) или другие данные BIOS, хранящиеся в минимальном размере 1 МБ физической памяти. Приложения имеют следующие альтернативы для чтения данных из недостаточной физической памяти:
- Получение свойств SMBIOS с помощью инструментария WMI. В классах Win32 содержится множество отдельных свойств. Вы также можете получить необработанные данные SMBIOS в одном буфере с помощью класса MSSMBios_RawSMBiosTables .
- Используйте функцию 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. Так как изготовители оборудования могут включать таблицы встроенного ПО 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 с пакетом обновления 1 (SP1) [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | sysinfoapi.h (включая Windows.h) |
Библиотека | Kernel32.lib |
DLL | Kernel32.dll |
См. также
Доступ к сведениям SMBIOS из универсального приложения для Windows