次の方法で共有


非同期ドライバー通知登録

非同期ドライバー通知を使用するため、デバイス ドライバーは、ハードウェア パーティションにプロセッサまたはメモリ モジュールを動的に追加するときにオペレーティング システムが呼び出すコールバック関数を実装します。 次のコード例は、このようなコールバック関数のプロトタイプです。

// Prototypes for the asynchronous
// notification callback functions
NTSTATUS
  AsyncProcessorCallback(
    IN PVOID NotificationStructure,
    IN PVOID Context
    );

NTSTATUS
  AsyncMemoryCallback(
    IN PVOID NotificationStructure,
    IN PVOID Context
    );

デバイス ドライバーは、IoRegisterPlugPlayNotification 関数を呼び出して非同期通知に登録します。この関数は、デバイス ドライバーのコールバック関数ごとに 1 回、EventCategoryData パラメーターに対して次のいずれかの GUID へのポインターを指定します。

GUID_DEVICE_PROCESSOR
プロセッサがハードウェア パーティションに動的に追加されたときに通知される登録。

GUID_DEVICE_MEMORY
メモリがハードウェア パーティションに動的に追加されたときに通知される登録。

これらの GUID は、ヘッダー ファイル Poclass.h に定義されます。

次のコード サンプルは、両方の通知に登録する方法を示します。

PVOID ProcessorNotificationEntry;
PVOID MemoryNotificationEntry;
NTSTATUS Status;

Status =
  IoRegisterPlugPlayNotification(
    EventCategoryDeviceInterfaceChange,
    0,
    &GUID_DEVICE_PROCESSOR,
    DriverObject,
    AsyncProcessorCallback,
    NULL,
    &ProcessorNotificationEntry
    );

Status =
  IoRegisterPlugPlayNotification(
    EventCategoryDeviceInterfaceChange,
    0,
    &GUID_DEVICE_MEMORY,
    DriverObject,
    AsyncMemoryCallback,
    NULL,
    &MemoryNotificationEntry
    );

注: デバイス ドライバーにとって、プロセッサに関する通知のみが必要な場合は、メモリのコールバック関数の実装や、メモリに関する通知の登録をする必要はありません。 同じく、デバイス ドライバーにとって、メモリに関する通知のみが必要な場合は、プロセッサーのコールバック関数の実装や、プロセッサーに関する通知の登録をする必要はありません。

デバイス ドライバーが非同期ドライバー通知の受信を停止する必要がある場合 (アンロード時など)、IoUnregisterPlugPlayNotification 関数を呼び出して各コールバック関数の登録を解除する必要があります。 次のコード サンプルは、コールバック関数の登録を解除する方法を示します。

// Unregister for asynchronous notifications
Status =
  IoUnregisterPlugPlayNotification(
    ProcessorNotificationEntry
    );

Status =
  IoUnregisterPlugPlayNotification(
    MemoryNotificationEntry
    );