カーネル モードのパフォーマンス カウンターの使用
カーネル モード コンポーネントは、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) を参照してください。