次の方法で共有


GetSystemFirmwareTable 関数 (sysinfoapi.h)

指定したファームウェア テーブルをファームウェア テーブル プロバイダーから取得します。

構文

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

パラメーター

[in] FirmwareTableProviderSignature

クエリの転送先となるファームウェア テーブル プロバイダーの識別子。 このパラメーターには、次の値のいずれかを指定できます。

意味
'ACPI' ACPI ファームウェア テーブル プロバイダー。
'FIRM' 生のファームウェア テーブル プロバイダー。
'RSMB' 生の SMBIOS ファームウェア テーブル プロバイダー。

[in] FirmwareTableID

ファームウェア テーブルの識別子。 この識別子はリトル エンディアンです。文字列内の文字を逆にする必要があります。

たとえば、FACP は ACPI プロバイダーです。ACPI 仕様のDESCRIPTION_HEADER構造の [署名] フィールドで説明されています ( 詳細な構成と電源インターフェイス (ACPI) の仕様を参照してください)。 したがって、次の例に示すように、'PCAF' を使用して FACP テーブルを指定します。

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

詳細については、 EnumSystemFirmwareTables 関数の「解説」セクションを参照してください。

[out] pFirmwareTableBuffer

要求されたファームウェア テーブルを受け取るバッファーへのポインター。 このパラメーターが NULL の場合、戻り値は必要なバッファー サイズです。

このバッファーの内容の詳細については、「解説」セクションを参照してください。

[in] BufferSize

pFirmwareTableBuffer バッファーのサイズ (バイト単位)。

戻り値

関数が成功した場合、戻り値はバッファーに書き込まれたバイト数です。 この値は常に BufferSize 以下になります。

バッファーが十分な大きさでないために関数が失敗した場合、戻り値は必要なバッファー サイズ (バイト単位) です。 この値は常に BufferSize より大きくなります。

その他の理由で関数が失敗した場合、戻り値は 0 になります。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

Windows 10 バージョン 1803 以降、ユニバーサル Windows アプリは、アプリ マニフェストで smbios 制限付き機能を宣言することで、システム管理 BIOS (SMBIOS) 情報にアクセスできます。 詳細については、「 ユニバーサル Windows アプリから SMBIOS 情報にアクセス する」を参照してください。 ユニバーサル Windows アプリからアクセスできるのは、生の SMBIOS (RSMB) ファームウェア テーブルのみです。

Windows Server 2003 Service Pack 1 (SP1) の時点では、アプリケーションは \Device\PhysicalMemory オブジェクトにアクセスできません。 このオブジェクトへのアクセスは、カーネル モード ドライバーに制限されます。 この変更は、システム管理 BIOS (SMBIOS) または物理メモリの最小 1 MB に格納されている他の BIOS データを読み取るアプリケーションに影響します。 アプリケーションには、低い物理メモリからデータを読み取る次の代替手段があります。

  • WMI を使用して SMBIOS プロパティを取得します。 個々のプロパティの多くは 、Win32 クラスに含まれています。 MSSMBios_RawSMBiosTables クラスを使用して、1 つのバッファー内の生の SMBIOS データを取得することもできます。
  • GetSystemFirmwareTable 関数を使用して、生の SMBIOS ファームウェア テーブルを読み取ります。
アプリケーションが低い物理メモリに書き込む方法はありません。

生の SMBIOS テーブル プロバイダー ('RSMB') は、生の SMBIOS ファームウェア テーブルの内容を取得します。 pFirmwareTableBuffer バッファーは、次のデータを受け取ります。

#include <windows.h>

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

生のファームウェア テーブル プロバイダー ('FIRM') は、指定された物理アドレス範囲の内容を取得します。 関数は、アドレス範囲のサイズを返します。

ACPI テーブル プロバイダー ('ACPI') は、指定された ACPI テーブルの内容を取得します。 OEM には、ACPI 仕様に記載されていない ACPI ファームウェア テーブルを含めることができるため、まず EnumSystemFirmwareTables を呼び出して、システム上にあるすべての ACPI テーブルを列挙する必要があります。

ACPI の場合、システムに同じ名前の複数のテーブルが含まれている場合、これらはすべて EnumSystemFirmwareTables で列挙されます。 ただし、 GetSystemFirmwareTable は、この名前のリスト内の最初のテーブルのみを取得します。

次の例は、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

要件

要件
サポートされている最小のクライアント Windows Vista、Windows XP Professional x64 Edition [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2008、Windows Server 2003 SP1 [デスクトップ アプリ |UWP アプリ]
対象プラットフォーム Windows
ヘッダー sysinfoapi.h (Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

ユニバーサル Windows アプリから SMBIOS 情報にアクセスする

EnumSystemFirmwareTables

システム情報関数