プロバイダーの特徴

プロバイダーの特徴は、個々のプロバイダー登録により多くのデータをアタッチする方法です。 これらは、マニフェスト ベースまたはトレース ログ プロバイダーに使用できます。 これには現在、プロバイダー名やプロバイダー グループを個々のプロバイダー登録に追加するためのサポートが含まれています。 今後、より多くの特徴型が追加される可能性があります。 この情報は、設定された形式のバイナリ 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、ペイロード フィルターは、個々のプロバイダーの特定の情報を前提とするため、プロバイダー グループには適用されません。