Bagikan melalui


Fungsi GetSystemFirmwareTable (sysinfoapi.h)

Mengambil tabel firmware yang ditentukan dari penyedia tabel firmware.

Sintaks

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

Parameter

[in] FirmwareTableProviderSignature

Pengidentifikasi penyedia tabel firmware tempat kueri akan diarahkan. Parameter ini bisa menjadi salah satu nilai berikut.

Nilai Makna
'ACPI' Penyedia tabel firmware ACPI.
'FIRM' Penyedia tabel firmware mentah.
'RSMB' Penyedia tabel firmware SMBIOS mentah.

[in] FirmwareTableID

Pengidentifikasi tabel firmware. Pengidentifikasi ini adalah little endian, Anda harus membalikkan karakter dalam string.

Misalnya, FACP adalah penyedia ACPI, seperti yang dijelaskan di bidang Tanda Tangan struktur DESCRIPTION_HEADER dalam spesifikasi ACPI (lihat Spesifikasi Konfigurasi Tingkat Lanjut dan Power Interface (ACPI). Oleh karena itu, gunakan 'PCAF' untuk menentukan tabel FACP, seperti yang ditunjukkan dalam contoh berikut:

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

Untuk informasi selengkapnya, lihat bagian Keterangan dari fungsi EnumSystemFirmwareTables .

[out] pFirmwareTableBuffer

Penunjuk ke buffer yang menerima tabel firmware yang diminta. Jika parameter ini ADALAH NULL, nilai yang dikembalikan adalah ukuran buffer yang diperlukan.

Untuk informasi selengkapnya tentang konten buffer ini, lihat bagian Keterangan.

[in] BufferSize

Ukuran buffer pFirmwareTableBuffer , dalam byte.

Nilai kembali

Jika fungsi berhasil, nilai yang dikembalikan adalah jumlah byte yang ditulis ke buffer. Nilai ini akan selalu kurang dari atau sama dengan BufferSize.

Jika fungsi gagal karena buffer tidak cukup besar, nilai yang dikembalikan adalah ukuran buffer yang diperlukan, dalam byte. Nilai ini selalu lebih besar dari BufferSize.

Jika fungsi gagal karena alasan lain, nilai yang dikembalikan adalah nol. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.

Keterangan

Dimulai dengan Windows 10, versi 1803, aplikasi Universal Windows dapat mengakses informasi SYSTEM Management BIOS (SMBIOS) dengan mendeklarasikan kemampuan terbatas smbios dalam manifes aplikasi. Lihat Mengakses informasi SMBIOS dari Aplikasi Universal Windows untuk detailnya. Hanya tabel firmware SMBIOS (RSMB) mentah yang dapat diakses dari aplikasi Universal Windows.

Pada Windows Server 2003 dengan Paket Layanan 1 (SP1), aplikasi tidak dapat mengakses objek \Device\PhysicalMemory. Akses ke obyek ini terbatas pada driver mode kernel. Perubahan ini memengaruhi aplikasi yang membaca System Management BIOS (SMBIOS) atau data BIOS lainnya yang disimpan dalam memori fisik 1MB terendah. Aplikasi memiliki alternatif berikut untuk membaca data dari memori fisik rendah:

  • Ambil properti SMBIOS menggunakan WMI. Banyak properti individu terkandung dalam kelas Win32. Anda juga dapat mengambil data SMBIOS mentah dalam satu buffer menggunakan kelas MSSMBios_RawSMBiosTables .
  • Gunakan fungsi GetSystemFirmwareTable untuk membaca tabel firmware SMBIOS mentah.
Tidak ada cara bagi aplikasi untuk menulis ke memori fisik rendah.

Penyedia tabel SMBIOS mentah ('RSMB') mengambil konten tabel firmware SMBIOS mentah. Buffer pFirmwareTableBuffer menerima data berikut:

#include <windows.h>

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

Penyedia tabel firmware mentah ('FIRM') mengambil konten rentang alamat fisik yang ditentukan. Fungsi mengembalikan ukuran rentang alamat.

Penyedia tabel ACPI ('ACPI') mengambil konten tabel ACPI yang ditentukan. Karena OEM dapat menyertakan tabel firmware ACPI yang tidak tercantum dalam spesifikasi ACPI, Anda harus terlebih dahulu memanggil EnumSystemFirmwareTables untuk menghitung semua tabel ACPI yang saat ini ada di sistem.

Untuk ACPI, jika sistem berisi beberapa tabel dengan nama yang sama, semuanya dijumlahkan dengan EnumSystemFirmwareTables. Namun, GetSystemFirmwareTable hanya mengambil tabel pertama dalam daftar dengan nama ini.

Contoh

Contoh berikut mengilustrasikan pengambilan tabel 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

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista, Windows XP Professional x64 Edition [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2008, Windows Server 2003 dengan SP1 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header sysinfoapi.h (sertakan Windows.h)
Pustaka Kernel32.lib
DLL Kernel32.dll

Lihat juga

Mengakses informasi SMBIOS dari Aplikasi Universal Windows

EnumSystemFirmwareTables

Fungsi Informasi Sistem