次の方法で共有


IoRegisterPlugPlayNotification 関数 (wdm.h)

IoRegisterPlugPlayNotification ルーチンは、指定したカテゴリの PnP イベントが発生したときに呼び出されるプラグ アンド プレイ (PnP) 通知コールバック ルーチンを登録します。

構文

NTSTATUS IoRegisterPlugPlayNotification(
  [in]           IO_NOTIFICATION_EVENT_CATEGORY        EventCategory,
  [in]           ULONG                                 EventCategoryFlags,
  [in, optional] PVOID                                 EventCategoryData,
  [in]           PDRIVER_OBJECT                        DriverObject,
  [in]           PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
  [in, optional] __drv_aliasesMem PVOID                Context,
  [out]          PVOID                                 *NotificationEntry
);

パラメーター

[in] EventCategory

コールバック ルーチンが登録されている PnP イベントのカテゴリを示す、 IO_NOTIFICATION_EVENT_CATEGORY からの列挙値を指定します。

[in] EventCategoryFlags

登録操作を変更するフラグ ビット。 次の値を指定できます。

PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES

EventCategoryDeviceInterfaceChange の EventCategory でのみ有効です。 設定されている場合、PnP マネージャーは、現在登録され、アクティブな各デバイス インターフェイス インスタンスのドライバー コールバック ルーチンを呼び出し、今後のデバイス インターフェイス インスタンスの到着または削除のためにコールバック ルーチンを登録します。

[in, optional] EventCategoryData

CallbackRoutine が登録されているイベントに関する詳細情報へのポインター。 情報は、 EventCategory の値によって異なります。

  • EventCategoryEventCategoryDeviceInterfaceChange の場合、EventCategoryData はデバイス インターフェイス クラスを指定する GUID を指す必要があります。 CallbackRoutine は、そのクラスのインターフェイスが有効または削除されると呼び出されます。

  • EventCategoryEventCategoryHardwareProfileChange の場合、EventCategoryDataNULL である必要があります。

  • EventCategoryEventCategoryTargetDeviceChange の場合、EventCategoryData は PnP 通知が要求されるファイル オブジェクトを指す必要があります。

[in] DriverObject

呼び出し元のドライバー オブジェクトへのポインター。

PnP 通知の登録中にドライバーが読み込まれたままになるように、この呼び出しは DriverObject の参照カウントをインクリメントします。 PnP マネージャーは、この登録が削除されたときに参照カウントをデクリメントします。

EventCategoryTargetDeviceChange の場合、DriverObject はターゲット デバイスのドライバー オブジェクトにすることはできません。代わりに、CallbackRoutine を実装するドライバーのドライバー オブジェクトである必要があります。

[in] CallbackRoutine

指定した PnP イベントが発生したときに呼び出される PnP 通知コールバック ルーチンへのポインター。

このコールバック ルーチンの関数プロトタイプは、次のように定義されます。

typedef NTSTATUS
  DRIVER_NOTIFICATION_CALLBACK_ROUTINE(
    _In_ PVOID NotificationStructure,
    _Inout_opt_ PVOID Context
    );

コールバック ルーチンの NotificationStructure は、次の表に示すように EventCategory 値に固有です。

イベント カテゴリ 通知の構造
EventCategoryDeviceInterfaceChange DEVICE_INTERFACE_CHANGE_NOTIFICATION
EventCategoryHardwareProfileChange HWPROFILE_CHANGE_NOTIFICATION
EventCategoryTargetDeviceChange TARGET_DEVICE_REMOVAL_NOTIFICATION

詳細については、「 PnP 通知TARGET_DEVICE_CUSTOM_NOTIFICATIONの使用」を参照してください。

コールバック ルーチンの Context パラメーターには、登録時にドライバーが指定したコンテキスト データが含まれています。

静的ドライバー検証ツール (SDV) の要件を満たすコールバック ルーチンの関数宣言を含める方法については、「例」を参照してください。

PnP マネージャーは、IRQL = PASSIVE_LEVELでドライバー コールバック ルーチンを呼び出します。

[in, optional] Context

PnP マネージャーがコールバック ルーチンに渡すコンテキストを含む、呼び出し元によって割り当てられたバッファーへのポインター。

[out] NotificationEntry

登録を識別するこの呼び出しによって返される不透明な値へのポインター。 登録を削除するには、この値を IoUnregisterPlugPlayNotificationEx ルーチンに渡します。

戻り値

IoRegisterPlugPlayNotification は、STATUS_SUCCESSまたは適切なエラー状態を返します。

注釈

ドライバーは、イベント カテゴリに登録します。 各カテゴリには、1 つ以上の種類の PnP イベントが含まれます。

ドライバーは、さまざまなイベント カテゴリに対して異なるコールバック ルーチンを登録することも、1 つのコールバック ルーチンを登録することもできます。 1 つのコールバック ルーチンで NotificationStructurePLUGPLAY_NOTIFICATION_HEADER にキャストし、 Event フィールドを使用して通知構造の正確な型を決定できます。

呼び出し元がPNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACESを指定した場合、オペレーティング システムは、既存のインターフェイスの単一 の EventCategoryDeviceInterfaceChange イベントに対して PnP 通知コールバック ルーチンを 2 回呼び出す可能性があります。 コールバックの 2 番目の呼び出しは無視しても問題ありません。 オペレーティング システムは、1 つのイベントに対して 2 回以上コールバックを呼び出しません。

PnP 通知コールバック ルーチンは、イベントに登録されている他のドライバーやアプリケーションへの通知の遅延を防ぐために、できるだけ早くタスクを完了し、PnP マネージャーに制御を返す必要があります。

ドライバーが EventCategoryTargetDeviceChange イベントの通知を登録するときに、PnP マネージャーはファイル オブジェクトの参照を取り出しません。 ドライバーの PnP 通知コールバック ルーチンがファイル オブジェクトへのアクセスを必要とする場合、ドライバーは IoRegisterPlugPlayNotification を呼び出す前に、ファイル オブジェクトに対する追加の参照を取り出す必要があります。

通常、Kernel-Mode Driver Framework (KMDF) ドライバーは、EvtDeviceSelfManagedIoInit コールバック関数から IoRegisterPlugPlayNotification を呼び出し、EvtDeviceSelfManagedIoCleanup コールバック関数から IoUnregisterPlugPlayNotification を呼び出す必要があります。 これらのドライバーは、EvtDriverDeviceAdd コールバック関数から IoRegisterPlugPlayNotification を呼び出さないでください。それ以外の場合は、PnP によってドライバー スタックが開始される前に PnP 通知コールバック ルーチンが呼び出される可能性があります。その場合、ドライバーは通知を処理する準備が行われません。

詳細については、「 PnP 通知の使用」を参照してください。

PnP 通知コールバック ルーチンを定義するには、まず、定義するコールバック ルーチンの種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバーのコールバック関数型のセットが用意されています。 コールバック関数の種類を使用して関数を宣言すると、 ドライバーのコード分析静的ドライバー検証ツール (SDV)、およびその他の検証ツールでエラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。

たとえば、 という名前 MyCallbackRoutineの PnP 通知コールバック ルーチンを定義するには、次のコード例に示すように、DRIVER_NOTIFICATION_CALLBACK_ROUTINE型を使用します。

DRIVER_NOTIFICATION_CALLBACK_ROUTINE MyCallbackRoutine;

次に、コールバック ルーチンを次のように実装します。

_Use_decl_annotations_
NTSTATUS
  MyCallbackRoutine(
    PVOID NotificationStructure,
    PVOID Context
    )
  {
      // Function body
  }

DRIVER_NOTIFICATION_CALLBACK_ROUTINE関数の種類は、Wdm.h ヘッダー ファイルで定義されています。 コード分析ツールの実行時にエラーをより正確に識別するには、 Use_decl_annotations 注釈を関数定義に追加してください。 Use_decl_annotations注釈を使用すると、ヘッダー ファイルのDRIVER_NOTIFICATION_CALLBACK_ROUTINE関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「 WDM ドライバーの関数ロール型を使用して関数を宣言する」を参照してください。 の詳細 _Use_decl_annotations_については、「 関数の動作に注釈を付ける」を参照してください。

要件

要件
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport)MarkPower(wdm)MarkPowerDown(wdm)MarkQueryRelations(wdm)MarkStartDevice(wdm)PowerIrpDDis(wdm)

こちらもご覧ください

PnP 通知の使用

DEVICE_INTERFACE_CHANGE_NOTIFICATION

EvtDeviceSelfManagedIoCleanup

EvtDeviceSelfManagedIoInit

EvtDriverDeviceAdd

HWPROFILE_CHANGE_NOTIFICATION

IoUnregisterPlugPlayNotification

IoUnregisterPlugPlayNotificationEx

PLUGPLAY_NOTIFICATION_HEADER

TARGET_DEVICE_CUSTOM_NOTIFICATION

TARGET_DEVICE_REMOVAL_NOTIFICATION