다음을 통해 공유


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

펌웨어 테이블의 식별자입니다. 이 식별자는 little endian입니다. 문자열의 문자를 역방향으로 사용해야 합니다.

예를 들어 FACP는 ACPI 사양의 DESCRIPTION_HEADER 구조의 서명 필드에 설명된 대로 ACPI 공급자입니다( 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 제한된 기능을 선언하여 SMBIOS(시스템 관리 BIOS) 정보에 액세스할 수 있습니다. 자세한 내용은 유니버설 Windows 앱에서 SMBIOS 정보 액세스를 참조하세요. 유니버설 Windows 앱에서 원시 SMBIOS(RSMB) 펌웨어 테이블만 액세스할 수 있습니다.

Windows Server 2003 SP1(서비스 팩 1)을 사용하는 경우 애플리케이션은 \Device\PhysicalMemory 개체에 액세스할 수 없습니다. 이 개체에 대한 액세스는 커널 모드 드라이버로 제한됩니다. 이 변경 내용은 SMBIOS(시스템 관리 BIOS) 또는 가장 낮은 1MB의 실제 메모리에 저장된 기타 BIOS 데이터를 읽는 애플리케이션에 영향을 줍니다. 애플리케이션에는 낮은 실제 메모리에서 데이터를 읽는 다음과 같은 대안이 있습니다.

  • WMI를 사용하여 SMBIOS 속성을 검색합니다. 많은 개별 속성이 Win32 클래스에 포함되어 있습니다. MSSMBios_RawSMBiosTables 클래스를 사용하여 단일 버퍼에서 원시 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 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

유니버설 Windows 앱에서 SMBIOS 정보에 액세스

EnumSystemFirmwareTables

시스템 정보 함수