Tbsi_Get_TCG_Log函式 (tbs.h)
擷取最新的 Windows 開機設定記錄 (WBCL) ,也稱為 TCG 記錄檔。
語法
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 之緩衝區的指標。 此參數可能是 Null,以在輸入時,當輸入上指向 的位置 也為 0 時,估計所需的緩衝區。
[in, out] pOutputBufLen
輸入上不帶正負號長整數的指標,指定輸出緩衝區的大小,以位元組為單位。 如果函式成功,則此參數會在輸出上接收 pOutputBuf所指向資料的大小,以位元組為單位。 如果函式失敗,這個參數就不會收到值。
以零長度緩衝區呼叫 Tbsi_Get_TCG_Log 函式會傳回所需的緩衝區大小。 具有 SP1 和 Windows Server 2008 的 Windows Vista: 此功能無法使用。
傳回值
傳回碼/值 | Description |
---|---|
|
此函數已成功。 |
|
發生內部軟體錯誤。
注意 如果傳回TBS_E_INTERNAL_ERROR,系統事件記錄檔可能包含來自 TBS 事件來源的事件識別碼 16385,且錯誤碼0x80070032。 這可能表示硬體平臺未提供 TCG 事件記錄檔給作業系統。 有時候,您可以從平臺製造商安裝 BIOS 升級來解決此問題。
|
|
指定的輸出指標無效。 |
|
指定的內容控制碼不會參考有效的內容。 |
|
輸出緩衝區太小。 |
|
輸出緩衝區太大。 |
|
無法在此電腦上找到相容的信任平臺模組 (TPM) 安全性裝置。 |
|
TPM) 安全性裝置已停用信任的平臺模組 (。
具有 SP1 和 Windows Server 2008 的 Windows Vista: 無法使用這個傳回值。 |
備註
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成員 | 值或描述 |
---|---|
PCIndex | 0 |
EventType | EV_NO_ACTION |
Digest | 20 個位元組的零 |
EventSize | 事件成員的大小 |
事件 | 有一種 TCG_EfiSpecIdEventStruct |
下列顯示TCG_EfiSpecIdEventStruct結構的語法,TCG_PCR_EVENT 結構的事件成員用於第一個記錄事件。
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 雜湊演算法,並使用與不同雜湊演算法相容的記錄格式,則平臺會使用 SHA256 演算法,而不是 SHA1。
具有 SP1 和 Windows Server 2008 的 Windows Vista: 函式會直接從 ACPI 資料表傳回記錄,並傳回整個 ACPI 配置的緩衝區,包括任何事件之後未使用的緩衝區。
TCG 事件記錄檔中的 Windows 定義事件是 {Type, Length, Value} 的 Tuple。 您可以從 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_IN_OUT_BUF_SIZE_MAX中定義的常數,定義于 Tbs.h 標頭檔,或呼叫長度為零的緩衝區的Tbsi_Get_TCG_Log函式來取得,以取得所需的緩衝區大小。
具有 SP1 和 Windows Server 2008 的 Windows Vista: 不支援以零長度緩衝區呼叫 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);
}
}
規格需求
最低支援的用戶端 | 具有 SP1 的 Windows Vista [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2008 [僅限傳統型應用程式] |
目標平臺 | Windows |
標頭 | tbs.h |
程式庫 | Tbs.lib |
DLL | Tbs.dll |