Поделиться через


Функция 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

EnumSystemFirmwareTables

Функции сведений о системе