バージョン 2.0 を使用したカウンター データの提供
最新のパフォーマンス データ プロバイダーでは、マニフェストを使用してカウンター データを定義し、パフォーマンス カウンター プロバイダー API を使用してプロバイダーのコンテキスト内でデータを管理します。 マニフェストおよびパフォーマンス カウンター プロバイダー API を使用して実装されたプロバイダーは、多くの場合 、V2 プロバイダーと呼ばれます。 Windows では、Windows Vista 以降のユーザー モード V2 プロバイダーと、Windows 7 以降のカーネル モード V2 プロバイダーがサポートされています。
このページでは、ユーザー モード V2 プロバイダーについて説明します。 カーネル モード V2 プロバイダーの詳細については、「 カーネル モードのパフォーマンス監視」を参照してください。
実行時に、V2 プロバイダーは次のように動作します。
- プロバイダー プロセスは、PerfStartProvider と PerfSetCounterSetInfo を呼び出すことによって、Windows パフォーマンス カウンター システムに自身を登録します。 プロバイダーは、必要に応じて、コンシューマー要求に関する通知を受け取るコールバック関数を提供します。
- プロバイダー プロセスでは、PerfCreateInstance と PerfDeleteInstance を使用して、必要に応じてインスタンスを追加または削除します。 プロバイダーは、PerfSet*** API を使用して変更されたときにカウンター値を更新します。
- コンシューマーは、カウンターセットからのデータの要求を行います。 システムは、呼び出し元がデータを収集するアクセス許可を持っていることを確認します。 その後、システムはプロバイダー プロセスで実行されているワーカー スレッドを使用して要求を処理し、必要に応じてプロバイダーのコールバック関数を呼び出します。 ワーカー スレッドは、収集されたデータをシステムマネージド バッファーにコピーし、そのデータをコンシューマーに返します。
プロバイダーを作成する手順
プロバイダーが提供するカウンター データを定義するマニフェストを記述します。 マニフェストの記述の詳細については、「 パフォーマンス カウンター スキーマ」を参照してください。
CTRPP を使用して、プロバイダーに含めるテンプレート コードを生成します。 テンプレート コードには、カウンター セットを定義する構造体、 CounterInitialize 関数と CounterCleanup 関数、およびリソース文字列が含まれます。
プロバイダーは CounterInitialize 関数と CounterCleanup 関数を呼び出す必要があります。 CounterInitialize は PerfStartProvider 関数を呼び出してプロバイダーを登録し、PerfSetCounterSetInfo 関数を呼び出してカウンター セットを初期化します。 CounterCleanup は PerfStopProvider 関数を呼び出して、プロバイダーの登録を削除します。
前の手順のテンプレート コードをプロジェクトに含め、プロバイダーを完了します。
プロバイダーを完了するには、指定したカウンター セットの各インスタンスに対して PerfCreateInstance 関数を呼び出す必要があります。
カウンター値を設定するには、次のいずれかの関数を呼び出します。
PerfSetCounterRefValue を使用する利点は、カウンター値を設定または更新するために関数呼び出しを行う必要がないため、ローカル カウンター変数 (参照先の変数) を更新するだけで、パフォーマンス カウンターはポインターを使用してカウンター値にアクセスできることです。
PerfSetCounterRefValue を使用しない場合は、次の関数を使用してカウンター値をインクリメントまたはデクリメントできます。
- PerfDecrementULongCounterValue
- PerfDecrementULongLongCounterValue
- PerfIncrementULongCounterValue
- PerfIncrementULongLongCounterValue
プロバイダーが終了する前に、作成したカウンター セット インスタンスごとに PerfDeleteInstance を呼び出す必要があります。
マニフェストのプロバイダー要素で callback 属性を指定した場合、または CTRPP を呼び出すときに -NotificationCallback 引数を使用した場合は、ControlCallback コールバック関数を実装する必要があります。 コールバック関数を CounterInitialize に渡します。
CTRPP を呼び出すときに -MemoryRoutines を使用した場合は、AllocateMemory コールバック関数と FreeMemory コールバック関数を実装する必要があります。 コールバック関数を CounterInitialize に渡します。
プロバイダーをインストールするときは、LodCtr ツールを使用して、ローカライズされたリソース文字列とリソース ID を含むバイナリ ファイルの名前をレジストリに書き込みます。 LodCtr の使用の詳細については、「 パフォーマンス カウンター スキーマ」を参照してください。
プロバイダーをアンインストールするときは、UnlodCtr ツールを使用して、プロバイダーの情報をレジストリから削除します。