Compartir a través de


Función GetSystemFirmwareTable (sysinfoapi.h)

Recupera la tabla de firmware especificada del proveedor de tablas de firmware.

Sintaxis

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

Parámetros

[in] FirmwareTableProviderSignature

Identificador del proveedor de tabla de firmware al que se dirige la consulta. Este parámetro puede ser uno de los valores siguientes.

Valor Significado
'ACPI' Proveedor de tabla de firmware ACPI.
'FIRM' Proveedor de tabla de firmware sin formato.
"RSMB" Proveedor de tabla de firmware SMBIOS sin formato.

[in] FirmwareTableID

Identificador de la tabla de firmware. Este identificador es little endian, debe invertir los caracteres de la cadena.

Por ejemplo, FACP es un proveedor ACPI, tal y como se describe en el campo Firma de la estructura DESCRIPTION_HEADER en la especificación ACPI (véase la Especificación advanced configuration and Power Interface (ACPI). Por lo tanto, use "PCAF" para especificar la tabla FACP, como se muestra en el ejemplo siguiente:

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

Para obtener más información, vea la sección Comentarios de la función EnumSystemFirmwareTables .

[out] pFirmwareTableBuffer

Puntero a un búfer que recibe la tabla de firmware solicitada. Si este parámetro es NULL, el valor devuelto es el tamaño de búfer necesario.

Para obtener más información sobre el contenido de este búfer, vea la sección Comentarios.

[in] BufferSize

Tamaño del búfer de pFirmwareTableBuffer , en bytes.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es el número de bytes escritos en el búfer. Este valor siempre será menor o igual que BufferSize.

Si se produce un error en la función porque el búfer no es lo suficientemente grande, el valor devuelto es el tamaño de búfer necesario, en bytes. Este valor siempre es mayor que BufferSize.

Si se produce un error en la función por cualquier otro motivo, el valor devuelto es cero. Para obtener información de error extendida, llame a GetLastError.

Comentarios

A partir de Windows 10, versión 1803, las aplicaciones universales de Windows pueden acceder a la información del BIOS de administración del sistema (SMBIOS) declarando la funcionalidad restringida smbios en el manifiesto de la aplicación. Consulta Obtener acceso a la información de SMBIOS desde una aplicación universal de Windows para obtener más información. Solo se puede acceder a las tablas de firmware SMBIOS (RSMB) sin procesar desde una aplicación universal de Windows.

A partir de Windows Server 2003 con Service Pack 1 (SP1), las aplicaciones no pueden acceder al objeto \Device\PhysicalMemory. El acceso a este objeto se limita a los controladores en modo kernel. Este cambio afecta a las aplicaciones a la lectura del BIOS de administración del sistema (SMBIOS) u otros datos del BIOS almacenados en el menor 1 MB de memoria física. Las aplicaciones tienen las siguientes alternativas para leer datos de memoria física baja:

  • Recupere las propiedades SMBIOS mediante WMI. Muchas propiedades individuales están contenidas en las clases Win32. También puede recuperar los datos SMBIOS sin procesar en un único búfer mediante la clase MSSMBios_RawSMBiosTables .
  • Use la función GetSystemFirmwareTable para leer la tabla de firmware SMBIOS sin procesar.
No hay ninguna manera de que las aplicaciones escriban en memoria física baja.

El proveedor de tablas SMBIOS sin procesar ("RSMB") recupera el contenido de la tabla de firmware SMBIOS sin procesar. El búfer de pFirmwareTableBuffer recibe los datos siguientes:

#include <windows.h>

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

El proveedor de tabla de firmware sin formato ("FIRM") recupera el contenido del intervalo de direcciones físico especificado. La función devuelve el tamaño del intervalo de direcciones.

El proveedor de tabla ACPI ("ACPI") recupera el contenido de la tabla ACPI especificada. Dado que los OEM pueden incluir tablas de firmware ACPI que no aparecen en la especificación ACPI, primero debe llamar a EnumSystemFirmwareTables para enumerar todas las tablas ACPI que están actualmente en el sistema.

Para ACPI, si el sistema contiene varias tablas con el mismo nombre, todas se enumeran con EnumSystemFirmwareTables. Sin embargo, GetSystemFirmwareTable recupera solo la primera tabla de la lista con este nombre.

Ejemplos

En el ejemplo siguiente se muestra cómo recuperar la tabla 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 Value
Cliente mínimo compatible Windows Vista, Windows XP Professional x64 Edition [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2008, Windows Server 2003 con SP1 [aplicaciones de escritorio | Aplicaciones para UWP]
Plataforma de destino Windows
Encabezado sysinfoapi.h (incluye Windows.h)
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

Acceder a la información de SMBIOS desde una aplicación universal de Windows

EnumSystemFirmwareTables

Funciones de información del sistema