プロバイダーの特徴
プロバイダーの特徴は、個々のプロバイダー登録により多くのデータをアタッチする方法です。 これらは、マニフェスト ベースまたはトレース ログ プロバイダーに使用できます。 これには現在、プロバイダー名やプロバイダー グループを個々のプロバイダー登録に追加するためのサポートが含まれています。 今後、より多くの特徴型が追加される可能性があります。 この情報は、設定された形式のバイナリ BLOB としてカーネルに格納されます。
特徴は、登録に対して 1 回だけ設定できます。 その登録に対してこれ以上特性を設定しようとすると失敗します。
マニフェスト ベースのプロバイダーにプロバイダーの特徴を設定するには、EventProviderSetTraits 情報クラスを使用して EventSetInformation 関数を呼び出します。 EventInformation バッファーには、次の形式のバイナリ BLOB が含まれている必要があります。
{
UINT16 TraitsSize // Total size of the traits including this field
CHAR[] ProviderName // Null terminated utf-8 provider name
TRAIT[] Traits // Zero or more individual traits
}
個々の特性は、次の形式にする必要があります。
TRAIT {
UINT16 TraitSize // Size of this individual trait including this field
UINT8 Type // ETW_PROVIDER_TRAIT_TYPE
BYTE[] Data
}
個々の特性から、ETW_PROVIDER_TRAIT_TYPEは次のように定義されます。
typedef enum {
EtwProviderTraitTypeGroup = 1,
EtwProviderTraitTypeMax
} ETW_PROVIDER_TRAIT_TYPE;
TraceLoggingRegister 関数が呼び出されると、TraceLogging プロバイダーによってプロバイダーの特徴が自動的に設定されます。 TraceLogging プロバイダーの名前は、常にその特性に含まれます。 グループは、プロバイダー定義の TraceLoggingOptionGroup マクロを使用して、TraceLogging プロバイダーで設定できます。
カスタム特性
考えられる 255 個の特徴型のほとんどはまだ定義されていませんが、特徴型 1 から 127 は Microsoft によって定義用に予約されています。 残りの上位のインデックス付き型の値は、外部開発者が適しているとおりに使用できます。 独自のカスタム特性をプロバイダーに追加することを検討しているユーザーは、次の理由から、特性の合計サイズを 256 バイト以下に抑える必要があります。
- 特性は、プロバイダー用に記述されたすべてのイベントに含まれます。 特性が大きいと、ログ ファイルが非常に大きくなる可能性があります。
- 特性は、プロバイダーの有効期間中、非ページ カーネル プールに格納されます。
プロバイダー グループ
プロバイダー グループは、プロバイダー自体と同様に、GUID で定義された制御可能なエンティティです。 主な違いは、プロバイダー GUID を使用してプロバイダーの登録のみを制御する一方で、グループがそのすべてのメンバー登録を制御することです。 たとえば、特定のキーワード (keyword)とレベルでプロバイダー グループを有効にすると、そのキーワード (keyword)とレベルを持つすべてのグループメンバー登録が有効になります。
グループ メンバーシップは、アクセス許可によって制限される場合があります。 EventSetInformation の呼び出し元に、指定したグループに参加するためのアクセス許可がない場合、メンバーシップは拒否されます。
場合によっては、トレース セッション コントローラーで、いくつかのプロバイダーをグループの有効化から除外することが必要になる場合があります。 これを行うには、許可しないリストを設定します。 禁止リストは、1 つのログ 記録セッションのグループ設定に基づいて有効にならないプロバイダー GUID の一覧です。 禁止リストは、 TraceSetInformation および TraceSetDisallowList 情報クラスを使用して動的に変更できます。
ほとんどの有効化アクションは、個々のプロバイダーと同様の方法でプロバイダー グループに対して実行できますが、いくつかの例外があります。 サポートされない例を次に示します。
- プロバイダー グループは、プライベート トレース セッションでは制御できません。
- イベント名、イベント ID、ペイロード フィルターは、個々のプロバイダーの特定の情報を前提とするため、プロバイダー グループには適用されません。