다음을 통해 공유


Tbsi_Get_TCG_Log 함수(tbs.h)

TCG 로그라고도 하는 최신 WBCL(Windows 부팅 구성 로그)을 검색합니다.

구문

TBS_RESULT Tbsi_Get_TCG_Log(
  [in]      TBS_HCONTEXT hContext,
  [out]     PBYTE        pOutputBuf,
  [in, out] PUINT32      pOutputBufLen
);

매개 변수

[in] hContext

로그를 검색하는 컨텍스트의 TBS 핸들입니다. Tbsi_Context_Create 함수에 대한 이전 호출에서 이 매개 변수를 가져옵니다.

[out] pOutputBuf

WBCL을 수신하고 저장할 버퍼에 대한 포인터입니다. 이 매개 변수는 pcbOutput 이 가리키는 위치가 입력 시 0일 때 필요한 버퍼를 예측하는 NULL일 수 있습니다.

[in, out] pOutputBufLen

입력 시 출력 버퍼의 크기(바이트)를 지정하는 부호 없는 긴 정수에 대한 포인터입니다. 함수가 성공하면 출력 시 이 매개 변수는 pOutputBuf가 가리키는 데이터의 크기(바이트)를 받습니다. 함수가 실패하면 이 매개 변수는 값을 받지 않습니다.

길이 버퍼가 0인 Tbsi_Get_TCG_Log 함수를 호출하면 필요한 버퍼의 크기가 반환됩니다. WINDOWS Vista SP1 및 Windows Server 2008: 이 기능은 사용할 수 없습니다.

반환 값

반환 코드/값 설명
TBS_SUCCESS
0(0x0)
함수가 성공했습니다.
TBS_E_INTERNAL_ERROR
2150121473(0x80284001)
내부 소프트웨어 오류가 발생했습니다.
참고 TBS_E_INTERNAL_ERROR 반환되면 시스템 이벤트 로그에 오류 코드가 0x80070032 TBS 이벤트 원본의 이벤트 ID 16385가 포함될 수 있습니다. 이는 하드웨어 플랫폼이 운영 체제에 TCG 이벤트 로그를 제공하지 않음을 나타낼 수 있습니다. 플랫폼 제조업체에서 BIOS 업그레이드를 설치하여 이 문제를 해결할 수 있는 경우도 있습니다.
 
TBS_E_INVALID_OUTPUT_POINTER
2150121475(0x80284003)
지정된 출력 포인터가 잘못되었습니다.
TBS_E_INVALID_CONTEXT
2150121476(0x80284004)
지정된 컨텍스트 핸들은 유효한 컨텍스트를 참조하지 않습니다.
TBS_E_INSUFFICIENT_BUFFER
2150121477(0x80284005)
출력 버퍼가 너무 작습니다.
TBS_E_BUFFER_TOO_LARGE
2150121486(0x8028400E)
출력 버퍼가 너무 큽
TBS_E_TPM_NOT_FOUND
2150121487(0x8028400F)
호환되는 TPM(신뢰할 수 있는 플랫폼 모듈) 보안 디바이스는 이 컴퓨터에서 찾을 수 없습니다.
TBS_E_DEACTIVATED
2150121494(0x80284016)
TPM(신뢰할 수 있는 플랫폼 모듈) 보안 디바이스가 비활성화되었습니다.

WINDOWS Vista SP1 및 Windows Server 2008: 이 반환 값은 사용할 수 없습니다.

설명

Tbsi_Get_TCG_Log 함수는 시스템의 TCG 이벤트 로그를 반환하고 버퍼 크기는 이벤트 수에 따라 달라집니다.

Windows 10:

함수는 하드웨어 기능 및 펌웨어 설정에 따라 다양한 해시 알고리즘과 호환되는 형식을 사용하는 로그를 반환할 수 있습니다. 이 로그는 첫 번째 이벤트를 제외한 각 이벤트의 형식을 TCG_PCR_EVENT2 구조로 지정합니다.

typedef struct {
  TCG_PCRINDEX PCRIndex;
  TCG_EVENTTYPE EventType;
  TPML_DIGEST_VALUES Digests;
  UINT32 EventSize;
  UINT8 Event[EventSize];
} TCG_PCR_EVENT2;

typedef struct {
  UINT32 Count;
  TPMT_HA Digests;
} TPML_DIGEST_VALUES;

typedef struct {
  UINT16 HashAlg;
  UINT8 Digest[size_varies_with_algorithm];
} TPMT_HA;

로그는 첫 번째 이벤트의 형식을 TCG_PCR_EVENT 구조체로 지정합니다. 이 구조체는 이 설명 섹션의 뒷부분에 설명되어 있습니다. 다음 표에서는 이 첫 번째 이벤트에 대해 이 구조체의 멤버 값을 설명합니다.

TCG_PCR_EVENT 멤버 값 또는 설명
PCRIndex 0
EventType EV_NO_ACTION
다이제스트 0의 20바이트
EventSize 이벤트 멤버의 크기
이벤트 형식이 TCG_EfiSpecIdEventStruct
 

다음은 TCG_PCR_EVENT 구조체의 Event 멤버가 첫 번째 로그 이벤트에 사용하는 TCG_EfiSpecIdEventStruct 구조체의 구문을 보여 주는 것입니다.

typedef struct {
  BYTE[16] Signature;
  UINT32 PlatformClass;
  UINT8 SpecVersionMinor;
  UINT8 SpecVersionMajor;
  UINT8 SpecErrata;
  UINT8 UintNSize;
  UINT32 NumberOfAlgorithms;
  TCG_EfiSpecIdEventAlgorithmSize DigestSizes[NumberOfAlgorithms];
  UINT8 VendorInfoSize;
  UINT8 VendorInfo[VendorInfoSize];
} TCG_EfiSpecIdEventStruct;

typedef struct {
  UINT16 HashAlg;
  UINT16 DigestSize;
} TCG_EfiSpecIdEventAlgorithmSize;

로그가 다른 해시 알고리즘과 호환되는 형식을 사용하는 경우 TCG_EfiSpecIdEventStruct 구조체의 Signature 멤버는 "Spec ID Event03"의 null로 끝나는 ASCII 문자열로 설정됩니다. 이 첫 번째 이벤트의 DigestSizes 배열에는 로그에서 사용하는 다양한 해시 알고리즘에 대한 다이제스트 크기가 포함됩니다. 파서가 TCG_PCR_EVENT2 형식의 이벤트를 검사할 때 파서는 존재하는 모든 해시 알고리즘에 대한 정보 없이 TPML_DIGEST_VALUES 멤버를 구문 분석할 수 있습니다. 첫 번째 이벤트의 다이제스트 크기를 사용하면 파서가 존재하는 다이제스트에 대한 올바른 바이트 수를 건너뛸 수 있습니다.

Signature 멤버가 "Spec ID Event03"의 null로 끝나는 ASCII 문자열로 설정되지 않은 경우 로그의 이벤트는 TCG_PCR_EVENT 형식이며 TCG_EfiSpecIdEventStruct 구조에는 NumberOfAlgorithmsDigestSizes 멤버가 포함되지 않습니다.

다양한 해시 알고리즘과 호환되는 로그 형식을 사용하면 플랫폼 및 운영 체제에서 SHA1, SHA256 또는 기타 해시 알고리즘을 사용할 수 있습니다. 플랫폼이 SHA256 해시 알고리즘을 지원하고 가 다른 해시 알고리즘과 호환되는 로그 형식을 사용하는 경우 플랫폼은 SHA1 대신 SHA256 알고리즘을 사용합니다.

WINDOWS Vista SP1 및 Windows Server 2008: 함수는 ACPI 테이블에서 직접 로그를 반환하고 이벤트 후 사용되지 않는 버퍼를 포함하여 전체 ACPI 할당 버퍼를 반환합니다.

TCG 이벤트 로그의 Windows 정의 이벤트는 {Type, Length, Value}의 튜플입니다. TCG PC 클라이언트 사양에서 다음 TCG_PCR_EVENT 구조를 사용하여 로그를 구문 분석할 수 있습니다. TPM PCP 도구 키트 및 TPM기본 사양의 정보를 사용하여 로그 이벤트 목록 간에 상관 관계를 만들 수 있습니다.

typedef struct {
  TCG_PCRINDEX PCRIndex;
  TCG_EVENTTYPE EventType;
  TCG_DIGEST Digest;
  UINT32 EventSize;
  UINT8 Event[EventSize];
} TCG_PCR_EVENT;

pOutputBuf 매개 변수에 필요한 메모리 크기는 Tbs.h 헤더 파일에 정의된 TBS_IN_OUT_BUF_SIZE_MAX 상수이거나 길이가 0인 Tbsi_Get_TCG_Log 함수를 호출하여 필요한 버퍼 크기를 가져와야 합니다.

WINDOWS Vista SP1 및 Windows Server 2008: 필요한 버퍼 크기를 가져오기 위해 길이가 0인 버퍼를 사용하여 Tbsi_Get_TCG_Log 함수를 호출하는 것은 지원되지 않습니다. pOutputBuf 매개 변수의 메모리 크기에 Tbs.h 헤더 파일에 정의된 상수 TBS_IN_OUT_BUF_SIZE_MAX 사용하는 것이 좋습니다.

예제

#include <windows.h>
#include <tbs.h>
#pragma comment(lib, "Tbs.lib")

void main()
{
    TBS_RESULT result;
    TBS_HCONTEXT hContext;
    TBS_CONTEXT_PARAMS contextParams;
    contextParams.version = TBS_CONTEXT_VERSION_ONE;
    result = Tbsi_Context_Create(&contextParams, &hContext);
    if (result == TBS_SUCCESS) 
    {
        UINT32 iLogSize = TBS_IN_OUT_BUF_SIZE_MAX;
        BYTE* pLogBuffer = new BYTE[iLogSize];
        result = Tbsi_Get_TCG_Log(hContext, pLogBuffer, &iLogSize);
    }
}

요구 사항

   
지원되는 최소 클라이언트 WINDOWS Vista SP1 [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2008 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 tbs.h
라이브러리 Tbs.lib
DLL Tbs.dll