Tbsi_Get_TCG_Log_Ex 函数 (tbs.h)

获取指定类型的 Windows 启动配置日志 (WBCL) (也称为 TCG 日志)。

语法

TBS_RESULT Tbsi_Get_TCG_Log_Ex(
  [in]            UINT32  logType,
  [out, optional] PBYTE   pbOutput,
  [in, out]       PUINT32 pcbOutput
);

参数

[in] logType

要检索的日志类型。

含义
TBS_TCGLOG_SRTM_CURRENT
0
与当前会话的 PCR 0-15 关联的日志 (启动或恢复) 。
TBS_TCGLOG_DRTM_CURRENT
1
与当前会话的 PCR 17-22 关联的日志 (启动或恢复) 。
TBS_TCGLOG_SRTM_BOOT
2
与最新干净启动会话的 PCR 0-15 关联的日志。
TBS_TCGLOG_SRTM_RESUME
3
与 PCR 0-15 关联的日志,用于从休眠中恢复的最新恢复。

[out, optional] pbOutput

指向接收和存储 WBCL 的缓冲区的指针。 设置为 NULL 以估计输入时 ,当由印刷品输出 指向的位置也为 0 时,估计所需的缓冲区。

[in, out] pcbOutput

指向无符号长整数的指针,该整数指定输出缓冲区的大小(以字节为单位)。 成功时,包含 pOutput 指向的数据的大小(以字节为单位)。 失败时,不包含值。

注意如果 pbOutputNULL由TBS_E_BUFFER_TOO_SMALL输出指向的位置为 0,则该函数将返回 在这种情况下, pbOutput 将指向所需的 pbOutput 大小。

返回值

返回代码/值 说明
TBS_SUCCESS
0 (0x0)
函数成功。
TBS_E_NO_EVENT_LOG
1 (0x1)
已请求TBS_TCGLOG_DRTM_CURRENT ,但系统启动时未在系统上启用 DRTM。
TBS_E_INTERNAL_ERROR
2150121473 (0x80284001)
出现内部软件错误。
注意 如果返回 TBS_E_INTERNAL_ERROR ,则系统事件日志可能包含来自 TBS 事件源的事件 ID 16385,错误代码0x80070032。 这可能表示硬件平台未向操作系统提供 TCG 事件日志。 有时,可以通过从平台制造商安装 BIOS 升级来解决此问题。
 
TBS_E_INVALID_OUTPUT_POINTER
2150121475 (0x80284003)
指定的输出指针无效。
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) 安全设备已停用。

注解

Tbsi_Get_TCG_Log_Ex 函数返回系统的 TCG 事件日志,缓冲区大小取决于事件数。

函数可能会返回一个日志,该日志使用与不同哈希算法兼容的格式,具体取决于硬件功能和固件设置。 此日志将除第一个事件以外的每个事件格式化为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
摘要式 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 成员设置为以 null 结尾的 ASCII 字符串“规范 ID Event03”。 第一个事件中的 DigestSizes 数组包含日志使用的不同哈希算法的摘要大小。 当分析程序检查 TCG_PCR_EVENT2类型的事件时,分析程序可以分析 TPML_DIGEST_VALUES 成员,而无需提供有关所有哈希算法的信息。 第一个事件中的摘要大小允许分析程序跳过现有摘要的正确字节数。

如果未将 Signature 成员设置为以 null 结尾的 ASCII 字符串“Spec ID Event03”,则日志中的事件的类型 为 TCG_PCR_EVENT并且 TCG_EfiSpecIdEventStruct 结构不包含 NumberOfAlgorithmsDigestSizes 成员。

与不同哈希算法兼容的日志格式允许平台和操作系统使用 SHA1、SHA256 或其他哈希算法。 如果平台支持 SHA256 哈希算法,并且 使用与不同哈希算法兼容的日志格式,则平台将使用 SHA256 算法而不是 SHA1。

TCG 事件日志中的 Windows 定义事件是 {Type, Length, Value} 的元组。 可以使用 TCG 电脑客户端规范中的以下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_IN_OUT_BUF_SIZE_MAX 中的常量(在 Tbs.h 头文件中定义),或者应通过调用长度为零的 Tbsi_Get_TCG_Log_Ex 函数来获取所需的缓冲区大小。

要求

要求
最低受支持的客户端 Windows 10版本 1803 [仅限桌面应用]
最低受支持的服务器 Windows Server [仅限桌面应用]
目标平台 Windows
标头 tbs.h
Library Tbs.lib
DLL Tbs.dll