Tbsi_Get_TCG_Log関数 (tbs.h)
TCG ログとも呼ばれる最新の Windows ブート構成ログ (WBCL) を取得します。
構文
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:
関数は、ハードウェアの機能とファームウェアの設定に応じて、異なるハッシュ アルゴリズムと互換性のある形式を使用するログを返す場合があります。 このログは、1 つ目を除く各イベントを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 | イベント メンバーのサイズ |
Event | 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 で終わる "Spec ID Event03" の 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 Toolkit と 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 |
Library | Tbs.lib |
[DLL] | Tbs.dll |