Share via


Função GetSystemFirmwareTable (sysinfoapi.h)

Recupera a tabela de firmware especificada do provedor de tabela de firmware.

Sintaxe

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

Parâmetros

[in] FirmwareTableProviderSignature

O identificador do provedor de tabelas de firmware para o qual a consulta deve ser direcionada. Esse parâmetro pode usar um dos valores a seguir.

Valor Significado
'ACPI' O provedor de tabela de firmware do ACPI.
'FIRM' O provedor de tabela de firmware bruto.
'RSMB' O provedor de tabela de firmware SMBIOS bruto.

[in] FirmwareTableID

O identificador da tabela de firmware. Esse identificador é little endian, você deve reverter os caracteres na cadeia de caracteres.

Por exemplo, FACP é um provedor de ACPI, conforme descrito no campo Assinatura da estrutura DESCRIPTION_HEADER na especificação ACPI (consulte a Especificação de ACPI (Advanced Configuration and Power Interface). Portanto, use 'PCAF' para especificar a tabela FACP, conforme mostrado no exemplo a seguir:

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

Para obter mais informações, consulte a seção Comentários da função EnumSystemFirmwareTables .

[out] pFirmwareTableBuffer

Um ponteiro para um buffer que recebe a tabela de firmware solicitada. Se esse parâmetro for NULL, o valor retornado será o tamanho do buffer necessário.

Para obter mais informações sobre o conteúdo desse buffer, consulte a seção Comentários.

[in] BufferSize

O tamanho do buffer pFirmwareTableBuffer , em bytes.

Retornar valor

Se a função for bem-sucedida, o valor retornado será o número de bytes gravados no buffer. Esse valor sempre será menor ou igual a BufferSize.

Se a função falhar porque o buffer não é grande o suficiente, o valor retornado será o tamanho do buffer necessário, em bytes. Esse valor é sempre maior que BufferSize.

Se a função falhar por qualquer outro motivo, o valor retornado será zero. Para obter informações de erro estendidas, chame GetLastError.

Comentários

A partir do Windows 10, versão 1803, os aplicativos Universais do Windows podem acessar as informações do SMBIOS (SYSTEM Management BIOS) declarando a funcionalidade restrita do smbios no manifesto do aplicativo. Consulte Acessar informações do SMBIOS de um aplicativo Universal do Windows para obter detalhes. Somente tabelas de firmware de SMBIOS (RSMB) brutas podem ser acessadas de um aplicativo Universal do Windows.

A partir do Windows Server 2003 com Service Pack 1 (SP1), os aplicativos não podem acessar o objeto \Device\PhysicalMemory. O acesso a esse objeto é limitado a drivers no modo kernel. Essa alteração afeta os aplicativos que leem o SMBIOS (System Management BIOS) ou outros dados bios armazenados no menor 1 MB de memória física. Os aplicativos têm as seguintes alternativas para ler dados de memória física baixa:

  • Recupere as propriedades do SMBIOS usando o WMI. Muitas propriedades individuais estão contidas nas classes Win32. Você também pode recuperar os dados brutos do SMBIOS em um único buffer usando a classe MSSMBios_RawSMBiosTables .
  • Use a função GetSystemFirmwareTable para ler a tabela de firmware SMBIOS bruta.
Não há como os aplicativos gravarem em memória física baixa.

O provedor de tabela SMBIOS bruto ('RSMB') recupera o conteúdo da tabela de firmware SMBIOS bruta. O buffer pFirmwareTableBuffer recebe os seguintes dados:

#include <windows.h>

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

O provedor de tabela de firmware bruto ('FIRM') recupera o conteúdo do intervalo de endereços físicos especificado. A função retorna o tamanho do intervalo de endereços.

O provedor de tabelas ACPI ('ACPI') recupera o conteúdo da tabela ACPI especificada. Como os OEMs podem incluir tabelas de firmware acpi que não estão listadas na especificação acpi, você deve primeiro chamar EnumSystemFirmwareTables para enumerar todas as tabelas ACPI que estão atualmente no sistema.

Para ACPI, se o sistema contiver várias tabelas com o mesmo nome, todas elas serão enumeradas com EnumSystemFirmwareTables. No entanto, GetSystemFirmwareTable recupera apenas a primeira tabela da lista com esse nome.

Exemplos

O exemplo a seguir ilustra a recuperação da tabela 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

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista, Windows XP Professional x64 Edition [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2008, Windows Server 2003 com SP1 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho sysinfoapi.h (inclua Windows.h)
Biblioteca Kernel32.lib
DLL Kernel32.dll

Confira também

Acessar informações do SMBIOS de um aplicativo Universal do Windows

EnumSystemFirmwareTables

Funções de informações do sistema