次の方法で共有


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 によって異なります。

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

  • EventCategory が EventCategoryHardwareProfileChange 場合、EventCategoryData NULL する必要があります。

  • EventCategory が EventCategoryTargetDeviceChange 場合、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 にキャストし、イベント フィールドを使用して通知構造の正確な種類を決定できます。

呼び出し元が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_の詳細については、「関数の動作 に注釈を付けるを参照してください。

必要条件

要件 価値
ターゲット プラットフォーム 万国
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
ライブラリ 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