Share via


Funzione GetSystemFirmwareTable (sysinfoapi.h)

Recupera la tabella del firmware specificata dal provider di tabelle del firmware.

Sintassi

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

Parametri

[in] FirmwareTableProviderSignature

Identificatore del provider di tabelle del firmware a cui deve essere indirizzata la query. Questo parametro può avere uno dei valori seguenti.

Valore Significato
'ACPI' Provider di tabelle del firmware ACPI.
'FIRM' Provider di tabelle del firmware non elaborato.
'RSMB' Provider di tabelle del firmware SMBIOS non elaborato.

[in] FirmwareTableID

Identificatore della tabella del firmware. Questo identificatore è little endian, è necessario invertire i caratteri nella stringa.

Ad esempio, FACP è un provider ACPI, come descritto nel campo Firma della struttura DESCRIPTION_HEADER nella specifica ACPI (vedere La specifica ACPI (Advanced Configuration and Power Interface). Usare quindi 'PCAF' per specificare la tabella FACP, come illustrato nell'esempio seguente:

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

Per altre informazioni, vedere la sezione Osservazioni della funzione EnumSystemFirmwareTables .

[out] pFirmwareTableBuffer

Puntatore a un buffer che riceve la tabella del firmware richiesta. Se questo parametro è NULL, il valore restituito è la dimensione del buffer necessaria.

Per altre informazioni sul contenuto di questo buffer, vedere la sezione Osservazioni.

[in] BufferSize

Dimensioni del buffer pFirmwareTableBuffer , in byte.

Valore restituito

Se la funzione ha esito positivo, il valore restituito corrisponde al numero di byte scritti nel buffer. Questo valore sarà sempre minore o uguale a BufferSize.

Se la funzione ha esito negativo perché il buffer non è sufficientemente grande, il valore restituito è la dimensione del buffer necessaria, in byte. Questo valore è sempre maggiore di BufferSize.

Se la funzione ha esito negativo per qualsiasi altro motivo, il valore restituito è zero. Per informazioni dettagliate sull'errore, chiamare GetLastError.

Commenti

A partire da Windows 10 versione 1803, le app di Windows universali possono accedere alle informazioni DEL BIOS (SMBIOS) di Gestione sistema dichiarando la funzionalità con restrizioni smbios nel manifesto dell'app. Per informazioni dettagliate, vedere Accedere alle informazioni SMBIOS da un'app di Windows universale . È possibile accedere solo alle tabelle del firmware SMBIOS (RSMB) non elaborate da un'app di Windows universale.

A partire da Windows Server 2003 con Service Pack 1 (SP1), le applicazioni non possono accedere all'oggetto \Device\PhysicalMemory. L'accesso a questo oggetto è limitato ai driver in modalità kernel. Questa modifica influisce sulle applicazioni che leggono IL BIOS (SMBIOS) o altri dati BIOS archiviati nella memoria fisica più bassa di 1 MB. Le applicazioni hanno le alternative seguenti per leggere i dati dalla memoria fisica insufficiente:

  • Recuperare le proprietà SMBIOS usando WMI. Molte proprietà singole sono contenute nelle classi Win32. È anche possibile recuperare i dati SMBIOS non elaborati in un singolo buffer usando la classe MSSMBios_RawSMBiosTables .
  • Usare la funzione GetSystemFirmwareTable per leggere la tabella del firmware SMBIOS non elaborata.
Non esiste alcun modo per consentire alle applicazioni di scrivere in memoria fisica insufficiente.

Il provider di tabelle SMBIOS non elaborato ('RSMB') recupera il contenuto della tabella del firmware SMBIOS non elaborato. Il buffer pFirmwareTableBuffer riceve i dati seguenti:

#include <windows.h>

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

Il provider di tabelle del firmware non elaborato ('FIRM') recupera il contenuto dell'intervallo di indirizzi fisico specificato. La funzione restituisce le dimensioni dell'intervallo di indirizzi.

Il provider di tabelle ACPI ('ACPI') recupera il contenuto della tabella ACPI specificata. Poiché gli OEM possono includere tabelle del firmware ACPI non elencate nella specifica ACPI, è necessario chiamare prima EnumSystemFirmwareTables per enumerare tutte le tabelle ACPI attualmente presenti nel sistema.

Per ACPI, se il sistema contiene più tabelle con lo stesso nome, vengono tutte enumerate con EnumSystemFirmwareTables. GetSystemFirmwareTable recupera tuttavia solo la prima tabella nell'elenco con questo nome.

Esempio

Nell'esempio seguente viene illustrato il recupero della tabella 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

Requisiti

Requisito Valore
Client minimo supportato Windows Vista, Windows XP Professional x64 Edition [app desktop | App UWP]
Server minimo supportato Windows Server 2008, Windows Server 2003 con SP1 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione sysinfoapi.h (include Windows.h)
Libreria Kernel32.lib
DLL Kernel32.dll

Vedere anche

Accedere alle informazioni SMBIOS da un'app di Windows universale

EnumSystemFirmwareTables

Funzioni di informazioni di sistema