カーネル モード コンポーネントは、Windows (PCW) API のパフォーマンス カウンターを使用してパフォーマンス カウンターを提供します。
新しいカウンター データ プロバイダーを開発するには、次の手順に従います。
プロバイダーとそのカウンターセットを記述するカウンター マニフェスト を記述します。 カウンター マニフェストは、パフォーマンス カウンター プロバイダーとそのカウンターセットを定義する XML 形式のファイルです。
- カーネル モード コンポーネントの一部としてインストールされ、パフォーマンス データ コンシューマーが必要とする文字列リソースを含むバイナリの名前に
applicationIdentity属性を設定します。 providerType属性をkernelModeに設定します。- コンポーネントから PCW API にカウンター値を渡すときに使用される C/C++ 構造体の名前を持つ少なくとも 1 つの
struct要素 (counterSet/structsの下) を定義します。 - それぞれの
counterで、PCW がカウンター値を読み取る場所となるstructとfieldを定義します。
- カーネル モード コンポーネントの一部としてインストールされ、パフォーマンス データ コンシューマーが必要とする文字列リソースを含むバイナリの名前に
コンポーネントのビルド プロセスの一環として、CTRPP ツールを使用してカウンター マニフェストをコンパイルします。 (カウンター プリプロセッサ (CTRPP) ツールは WDK に含まれており、「
ctrpp」と入力して開発者コマンド プロンプト を表示 します。) CTRPP ツールは、.rcファイルと.hファイルを生成します。- CTRPP で生成された
.rcファイルは、リソース コンパイラ (RC.exe) ツールでコンパイルする必要があり、結果の.resファイルはapplicationIdentity属性で指定されたバイナリにリンクされている必要があります。 CTRPP で生成された.rcファイルを直接コンパイルするか、CTRPP で生成された.rcファイルを、バイナリにコンパイルされている既存の.rcファイルにコンパイル#includeできます。 - CTRPP で生成された
.hファイルには、基になる PCW API をラップするヘルパー関数が含まれています。 たとえば、CTRPP で生成された.hファイルには、ユーザーに代わってPcwRegisterを呼び出す RegisterXxx 関数が含まれます。 ほとんどの場合、PCW API を直接呼び出すのではなく、CTRPP で生成されたヘルパー関数を呼び出しますが、PCW API のドキュメントを参照して、対応する CTRPP 生成関数が何を行っているかを理解できます。 ヘルパー関数は、コンポーネントのカウンター データ レイアウトを PCW API で想定されるレイアウトにPCW_DATA変換する処理を管理します。
- CTRPP で生成された
コンポーネントの初期化時に、CTRPP によって生成された RegisterXxx 関数を呼び出します。この関数は PcwRegister を呼び出します。 コンポーネントのシャットダウン時に、CTRPP によって生成された UnregisterXxx 関数を呼び出します。この関数は PcwUnregister を呼び出します。
カウンター データを提供するコードを追加します。 これを行うには、PCW_CALLBACK コールバック関数を実装するか、各インスタンスのカウンター値を持つデータ構造をメインし、インスタンスの作成と破棄時に CTRPP で生成された CreateInstanceXxx 関数と CloseInstanceXxx 関数を呼び出します。
コンポーネントのインストール時に、プロバイダーのインストールに
lodctr /m:<CounterManifest> <InstallPath>を使用します。 コンポーネントのアンインストール時に、(/mまたは/gパラメーターで)unlodctrを使用してプロバイダーをアンインストールします。 プロバイダーをインストールすると、使用可能なカウンターセットのシステム全体のリポジトリにプロバイダーのカウンターセットが追加され、パフォーマンス データ コンシューマー (perfmon、typeperf、WMI など) がカウンターセットを使用できるようになります。 特に、プロバイダーをインストールすると、プロバイダーの文字列テーブルを含むバイナリ (DLL、SYS、または EXE ファイル) への完全なパスが記録されます。 バイナリへの完全なパスは、マニフェストのapplicationIdentity属性とlodctrコマンド ラインで使用される<CounterManifest>および<InstallPath>値を次のように組み合わせることによって決定されます。applicationIdentity属性が完全なパスの場合は、その属性が使用されます。- それ以外の場合、
<InstallationPath>パラメーターが完全なパスの場合はこれが使用されます。 - それ以外の場合、
<CounterManifest>パラメーターが完全なパスの場合、<CounterManifest>からのディレクトリはapplicationIdentity属性のファイル名と組み合わされます。 - それ以外の場合、現在の作業ディレクトリは
applicationIdentity属性のファイル名と組み合わされます。
カーネル モード PCW プロバイダーの例については、GitHub の Windows ドライバー サンプル リポジトリのカーネル カウンター サンプル (Kcs) を参照してください。