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_E_INTERNAL_ERROR 반환되면 시스템 이벤트 로그에 오류 코드가 0x80070032 TBS 이벤트 원본의 이벤트 ID 16385가 포함될 수 있습니다. 이는 하드웨어 플랫폼이 운영 체제에 TCG 이벤트 로그를 제공하지 않음을 나타낼 수 있습니다. 플랫폼 제조업체에서 BIOS 업그레이드를 설치하여 이 문제를 해결할 수 있는 경우도 있습니다.
|
|
지정된 출력 포인터가 잘못되었습니다. |
|
지정된 컨텍스트 핸들은 유효한 컨텍스트를 참조하지 않습니다. |
|
출력 버퍼가 너무 작습니다. |
|
출력 버퍼가 너무 큽 |
|
호환되는 TPM(신뢰할 수 있는 플랫폼 모듈) 보안 디바이스는 이 컴퓨터에서 찾을 수 없습니다. |
|
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 구조에는 NumberOfAlgorithms 및 DigestSizes 멤버가 포함되지 않습니다.
다양한 해시 알고리즘과 호환되는 로그 형식을 사용하면 플랫폼 및 운영 체제에서 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 |