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.
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