次の方法で共有


PPHYSICAL_COUNTER_OVERFLOW_HANDLER コールバック関数 (ntddk.h)

PPHYSICAL_COUNTER_OVERFLOW_HANDLERは、 HalAllocateHardwareCounters ルーチンを通じて取得されたカウンター リソースからのカウンター オーバーフローを処理するために、クライアント ドライバーによって実装されます。

構文

PPHYSICAL_COUNTER_OVERFLOW_HANDLER PphysicalCounterOverflowHandler;

void PphysicalCounterOverflowHandler(
  ULONGLONG OverflowBits,
  HANDLE OwningHandle
)
{...}

パラメーター

OverflowBits

オーバーフローしたカウンターを記述するビットマップを提供します。

OwningHandle

オーバーフローカウンターが属するリソース セットに対応する HANDLE を提供します。

戻り値

なし

解説

が PHYSICAL_COUNTER_RESOURCE_LIST の構造体を使用して HalAllocateHardwareCounters を呼び出して、このコールバック関数の実装を登録します。 PHYSICAL_COUNTER_RESOURCE_LISTで、ResourceTypeOverflowPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPEを指定する PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR 型の構造体を指定します。

オーバーフロー ハンドラーのプロトタイプの例を次に示します。

VOID
PmuAwareOverflowHandler (
    _In_ ULONGLONG OverflowStatus,
    _In_ HANDLE OwningHandle
    )

/*++

Routine Description:

    This routine is the PMU Overflow Handler for a sharing driver.

Arguments:

    OverflowStatus - The counters which have overflowed.

    OwningHandle - The handle owning the counters.

Return Value:

    None.

--*/
{
}

オーバーフロー ハンドラーを登録するには、次のようなコードを使用します。

VOID
CreateOverflowDescriptor (
    _Inout_ PPHYSICAL_COUNTER_RESOURCE_LIST CounterResourceList,
    _In_ ULONG DescriptorIndex
    )
{

    CounterResourceList->Descriptors[DescriptorIndex].Type = ResourceTypeOverflow;
    CounterResourceList->Descriptors[DescriptorIndex].u.OverflowHandler = PmuAwareOverflowHandler;
}

このコールバックは IRQL = PROFILE_LEVELで呼び出されます。 これは、常にメモリ常駐である必要があります。 コールバックは可能な限り迅速に返される必要があり、次のいずれかの操作を試みないでください。

  • スピン ロックを取得または解放します。

  • メモリ内でロックされていないページ プールにアクセスする

  • ページング可能ルーチンを呼び出します。

コールバックは HAL によって処理されるため、オーバーフロー レジスタのクリアを処理する必要はありません。

要件

要件
対象プラットフォーム Windows
ヘッダー ntddk.h
IRQL PROFILE_LEVEL